annotate(ffscenes) {
    const { segments, scenes } = this;
    let point = 0;
    let preTrans = 0;

    forEach(ffscenes, (scene, index) => {
      const isFirst = index === 0;
      const isLast = index === ffscenes.length - 1;
      const total = scene.getFramesNum();
      const trans = isLast ? 0 : scene.getTransFramesNum();

      // normal single scene
      const norNum = total - trans - preTrans;
      const segment1 = {
        type: 'normal',
        start: point,
        end: point + norNum,
        total: norNum,
        scenesIndex: [index],
      };
      segments.push(segment1);
      point = segment1.end;

      // scene of transition animation
      if (trans) {
        const segment2 = {
          type: 'transition',
          start: point,
          end: point + trans,
          total: trans,
          scenesIndex: [index, index + 1],
        };
        segments.push(segment2);
        point = segment2.end;
      }

      // calculate the start and end time of the scene
      let sceneStart, sceneEnd;
      if (preTrans) {
        sceneStart = isFirst ? segment1.start - preTrans : segment1.start - preTrans + 1;
      } else {
        sceneStart = isFirst ? segment1.start : segment1.start + 1;
      }

      sceneEnd = point;
      scenes.push({ sceneStart, sceneEnd });

      // set this cache variable
      preTrans = trans;
      this.framesNum = point;

      // set total duration
      const realDuration =
        index === ffscenes.length - 1
          ? ffscenes[index].duration
          : ffscenes[index].getRealDuration();
      this.duration += realDuration;
    });
  }
Marking the frameData of the scenes.
Split scene into sub-frameData, new timeline frameData stitching method
 |--------|===|  (s1)
          |---|-----|===|  (s2)
                    |---|-------|  (s3)

@param {array} ffscenes - An array of scenes
@public