動画パブリッシャーの場合は、視聴者がミッドロール広告をスキップしないようにするため、ユーザーが広告ブレークを過ぎてシークした場合、ユーザーをそのミッドロール挿入点の先頭に戻し、そのミッドロール挿入点の完了後にシーク位置に戻ることができます。この機能は「スナップバック」と呼ばれます。
例として、以下の図をご覧ください。動画の視聴中に 5 分の時点から 15 分の時点までシークすることにしました。ただし、10 分の時点で、視聴者がコンテンツを見る前に視聴するよう広告ブレークを設定できます。
このミッドロール挿入点を表示する方法は次のとおりです。
- ユーザーがシークを再生し、再生されなかった広告ブレークを超えて飛んでいたかどうかを確認し、その場合は、広告ブレークに戻ります。
- ミッドロール挿入点が完了したら、元のシークに戻します。
図で表すと次のようになります。
高度な例で説明したように、Roku IMA SDK でこのワークフローを実装する方法を示します。
シークにより広告ブレークが未視聴のままにならないようにする
ユーザーがシークを実行していて、再生していない広告ブレークを超えたかどうかを確認し、実行されていた場合は、ユーザーを広告ブレークに戻します。Roku Advanced のサンプルでは、リモートのボタン押下を利用してユーザーが移動します。ユーザーが進むボタンを押すたびに、設定された秒数だけストリーム内で早送りされます。このジャンプを処理するのと同じメソッドで、ジャンプが広告ブレークを通過したのか、広告ブレークに入るかどうかもチェックします。広告ブレークに到達した場合は、代わりにその広告ブレークの開始位置に移動します。
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