動画のパブリッシャーは、視聴者が ミッドロール広告をスキップできますユーザーがミッドロール挿入点を超えてシークすると、 その広告ブレークの先頭に戻って そのミッドロール挿入点が完了した後に、シークする位置にユーザーが移動します。この 「スナップバック」と呼ばれます。
例として、以下の図をご覧ください。視聴者が動画を視聴している 5 分の時点から 15 分の時点までシークします。 ただし、希望する 10 分の時点でミッドロール挿入点を ユーザーが次のコンテンツを視聴する前に、次の動画を視聴するようユーザーに促すことができます。
このミッドロール挿入点を表示する方法は次のとおりです。
- ユーザーがシークを実行して、視聴していないミッドロール挿入点を通過したかどうかを確認します。 その場合はミッドロール挿入点に戻ります
- ミッドロール挿入点が完了したら、元の移動に戻ります。
図形式では、次のようになります。
このワークフローを 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;
}
}
}