スナップバック

動画のパブリッシャーは、視聴者が ミッドロール広告をスキップできますユーザーがミッドロール挿入点を超えてシークすると、 その広告ブレークの先頭に戻って そのミッドロール挿入点が完了した後に、シークする位置にユーザーが移動します。この 「スナップバック」と呼ばれます。

例として、以下の図をご覧ください。視聴者が動画を視聴している 5 分の時点から 15 分の時点までシークします。 ただし、希望する 10 分の時点でミッドロール挿入点を ユーザーが次のコンテンツを視聴する前に、次の動画を視聴するようユーザーに促すことができます。

このミッドロール挿入点を表示する方法は次のとおりです。

  1. ユーザーがシークを実行して、視聴していないミッドロール挿入点を通過したかどうかを確認します。 その場合はミッドロール挿入点に戻ります
  2. ミッドロール挿入点が完了したら、元の移動に戻ります。

図形式では、次のようになります。

このワークフローを IMA DAI SDK で実装する方法は次のとおりです。 AdvancedExample をご覧ください。

シークで広告ブレークが再生されないままにならないようにする

ユーザーが再生していない広告ブレークを通過したシークをユーザーが実行したかどうかを確認します。 その場合はミッドロール挿入点に戻ります iOS Advanced の例では、ユーザーの UI 操作を使用します。 シークを実行したことを検出しますシーク開始時間を保持して、シークで未再生のミッドロール挿入点を超えたかどうかを確認します。ユーザーが は、動画コントロールを離し、現在の時刻を、 最新のミッドロール挿入点が表示されます。シーク開始後にミッドロール挿入点が発生した場合 (ユーザーが飛び越して過ぎた)が、まだ再生されていない場合、 広告ブレークの先頭までシークします。さらにスナップバックフラグも 広告ブレーク完了ハンドラで後で確認する手順は次のとおりです。

- (IBAction)videoControlsTouchStarted:(id)sender {
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  self.seekEndTime = CMTimeMake(self.progressBar.value, 1);
  IMACuepoint *lastCuepoint =
      [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(self.seekEndTime)];
  if (!lastCuepoint.played && (lastCuepoint.startTime > CMTimeGetSeconds(self.seekStartTime))) {
    self.snapbackMode = YES
    // Add 1 to the seek time to get the keyframe at the start of the ad to be your landing place.
    [self.contentPlayer seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
  }
}

ユーザーを元の検索モードに戻す

広告ブレークの終了ハンドラで、前のスライドの スナップバックの結果として再生されました。「はい」の場合は、ユーザーに 探していた場所に戻ることができます(ただし、 再生されたミッドロール挿入点の途中ではなかった場合):

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  switch (event.type) {
    case kIMAAdEvent_AD_BREAK_ENDED: {
      if (self.snapbackMode) {
        self.snapbackMode = NO;
        if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
          [self.contentPlayer seekToTime:self.seekEndTime];
        }
      }
      break;
    }
  }
}