動画配信者の場合は、視聴者がミッドロール広告を見落とさないようにしたい場合があります。ユーザーがミッドロール挿入点を越えてシークした場合、ユーザーをそのミッドロール挿入点の先頭に戻し、そのミッドロール挿入点の完了後にシーク位置に戻ることができます。この機能は「スナップバック」と呼ばれます。
例として、以下の図をご覧ください。視聴者が動画を視聴していて、5 分の時点から 15 分の時点までシークすることにしました。ただし、10 分の時点で広告ブレークを設定して、その後に視聴者が動画を視聴できるようにします。
このミッドロール挿入点を表示する方法は次のとおりです。
- ユーザーがシークを実行したのが再生されていないミッドロール挿入点を越えたかどうかを確認します。動作している場合は、再生前のミッドロール挿入点に戻ります。
- ミッドロール挿入点が完了したら、元の位置に戻します。
図で表すと次のようになります。
高度な例で説明したように、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