スナップバック

動画配信者の場合は、視聴者がミッドロール広告を見落とさないようにしたい場合があります。ユーザーがミッドロール挿入点を越えてシークした場合、ユーザーをそのミッドロール挿入点の先頭に戻し、そのミッドロール挿入点の完了後にシーク位置に戻ることができます。この機能は「スナップバック」と呼ばれます。

例として、以下の図をご覧ください。視聴者が動画を視聴していて、5 分の時点から 15 分の時点までシークすることにしました。ただし、10 分の時点で広告ブレークを設定して、その後に視聴者が動画を視聴できるようにします。

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

  1. ユーザーがシークを実行したのが再生されていないミッドロール挿入点を越えたかどうかを確認します。動作している場合は、再生前のミッドロール挿入点に戻ります。
  2. ミッドロール挿入点が完了したら、元の位置に戻します。

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

高度な例で説明したように、IMA DAI SDK を使用して Snapack を実装する方法を以下に示します。

シークによりミッドロール挿入点が未再生のままになるのを防ぐ

ユーザーがシークで再生していないミッドロール挿入点を超えたかどうかを確認し、再生されている場合はそのミッドロール挿入点に戻ります。 Roku の高度なサンプルでは、ユーザーがシークするためにリモートボタンの押下を利用します。つまり、ユーザーが進むボタンを押すたびに、設定された秒数ずつストリーム内でジャンプします。このジャンプを処理するのと同じメソッドで、ジャンプがミッドロール挿入点を通過するか、またはミッドロール挿入点に入るかもチェックされます。挿入されている場合は、代わりにそのミッドロール挿入点の最初にユーザーを誘導します。

Function handleFastForward(player as Object, streamManager as Object, updatedTime As Integer)
  previousAd = streamManager.getPreviousCuePoint(updatedTime)
  If previousAd = Invalid or previousAd.hasPlayed
    player.seek(updatedTime * 1000)
  Else If previousAd.start > player.currentTime
    player.isSnapback = True
    player.timeAfterSnapback = updatedTime
    player.seek(previousAd.start * 1000 + 1000)
  End If
End Function

ユーザーを元の位置に戻します

adBreakEnded ハンドラで、スナップバックの結果として前のミッドロール挿入点が再生されたかどうかを確認します。再生された直後のミッドロール挿入点の途中であれば、ユーザーを最初に検索しようとした位置に戻します。

player.adBreakEnded = Function(adBreakInfo as Object)
  If m.isSnapback
    m.seek(m.timeAfterSnapback * 1000)
    m.isSnapback = False
  End If
End Function