スキップしたミッドロール挿入点に戻る

プラットフォームを選択: HTML5 Android iOS tvOS Roku

動画パブリッシャーは、視聴者がミッドロール広告をスキップできないようにしたい場合があります。ユーザーがミッドロール挿入点をシークして通り過ぎた場合、そのミッドロール挿入点の開始時点に戻って、そのミッドロール挿入点の再生が完了した後にシーク位置まで移動できます。この機能は「スナップバック」と呼ばれます。

たとえば、下の図をご覧ください。視聴者が動画を視聴していて、5 分のマークから 15 分のマークまでシークすることにした場合。ただし、10 分のマークにミッドロール挿入点があり、その後にコンテンツを視聴するには、そのミッドロール挿入点を視聴する必要があります。

このミッドロール挿入点を表示するには、次の手順を行います。

  1. ユーザーが未視聴のミッドロール挿入点をスキップするシークを実行したかどうかを確認し、実行した場合はミッドロール挿入点に戻します。
  2. ミッドロール挿入点が完了したら、元のシーク位置に戻します。

図で表すと次のようになります。

AdvancedExample で行われているように、IMA DAI SDK でこのワークフローを実装する方法は次のとおりです。

シークによってミッドロール挿入点が未視聴のままになるのを防ぐ

ユーザーが未視聴のミッドロール挿入点をスキップしたかどうかを確認し、スキップした場合はミッドロール挿入点に戻します。Android SDK では、PlayerControl オブジェクトを使用してシークを検出します。ユーザーがシークしたときに、SampleAdsWrapper によって実装された SampleHlsVideoPlayerCallbackonSeek() メソッドをトリガーします。以下のメソッド(下記参照)は、ユーザーのシーク時間より前のキューポイントをチェックします。再生されていない場合は、最初のシークポイントではなく、そのミッドロール挿入点の先頭にシークし、そのシークポイントを snapBackTime に保存します。

@Override
public void onSeek(int timeMillis) {
  double timeToSeek = timeMillis;
  if (streamManager != null) {
    CuePoint cuePoint =
        streamManager.getPreviousCuePointForStreamTime(timeMillis / 1000);
    if (cuePoint != null && !cuePoint.isPlayed()) {
      snapBackTime = timeToSeek / 1000.0; // Update snapback time.
      // Missed cue point, so snap back to the beginning of cue point.
      timeToSeek = cuePoint.getStartTime() * 1000;
      videoPlayer.seek(Math.round(timeToSeek));
      videoPlayer.setCanSeek(false);
      return;
    }
  }
  videoPlayer.seek(Math.round(timeToSeek));
}

ユーザーを元のシーク位置に戻す

onAdBreakEnded イベントを受け取ったら、snapBackTime が設定されているかどうかを確認します。その場合は、ストリームのその時点にユーザーを移動させます。これは、ユーザーが視聴したばかりの広告ブレークがスナップバックの結果であるためです。

@Override
public void onAdBreakEnded() {
  // Re-enable player controls.
  videoPlayer.setCanSeek(true);
  videoPlayer.enableControls(true);
  if (snapBackTime > 0) {
    videoPlayer.seek(Math.round(snapBackTime * 1000));
  }
  snapBackTime = 0;
}