動画パブリッシャーは、視聴者がミッドロール広告をスキップできないようにしたい場合があります。ユーザーがミッドロール挿入点をシークして通り過ぎた場合、そのミッドロール挿入点の開始時点に戻って、そのミッドロール挿入点の再生が完了した後にシーク位置まで移動できます。この機能は「スナップバック」と呼ばれます。
たとえば、下の図をご覧ください。視聴者が動画を視聴していて、5 分のマークから 15 分のマークまでシークすることにした場合。ただし、10 分のマークにミッドロール挿入点があり、その後にコンテンツを視聴するには、そのミッドロール挿入点を視聴する必要があります。

このミッドロール挿入点を表示するには、次の手順を行います。
- ユーザーが未視聴のミッドロール挿入点をスキップするシークを実行したかどうかを確認し、実行した場合はミッドロール挿入点に戻します。
- ミッドロール挿入点が完了したら、元のシーク位置に戻します。
図で表すと次のようになります。

高度な例で示されているように、IMA DAI SDK を使用して snapback を実装する方法は次のとおりです。
シークによってミッドロール挿入点が未視聴のままになるのを防ぐ
ユーザーが未視聴のミッドロール挿入点をスキップしたかどうかを確認し、スキップした場合はミッドロール挿入点に戻します。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