このガイドでは、ビデオ オンデマンド(VOD)ストリームにダイナミック広告挿入(DAI)を使用する場合に、IMA DAI SDK を使用してブックマーク機能を実装する方法について説明します。 このガイドでは、スタートガイドで説明されているような、IMA DAI の実装が完了していることを前提としています。
ブックマークとは
ブックマークは、コンテンツ ストリームのあるポイントを保存し、後でそこから再生する機能です。たとえば、ユーザーがコンテンツを 5 分間視聴して動画ストリームを離れ、その後再び視聴するとします。ブックマークはユーザーのストリーム内の位置を保存するので、中断したところからストリームを再開でき、視聴者にシームレスな体験を提供します。
DAI ブックマークの仕組み
DAI ストリームをブックマークする場合は、ユーザーが動画を離れたときのストリーム ID と時刻を記録する必要があります。ユーザーが戻ってきたら、ストリームを再リクエストして、保存した時刻までシークします。リクエストされたストリームのインスタンスごとに広告ブレークの長さが異なる可能性があるため、ストリーム時刻を保存するだけではうまくいきません。実際には、同じコンテンツ時刻 から再開する必要があります。
変換方法の活用
IMA DAI SDK には、指定されたストリーム時刻 のコンテンツ時刻 と、指定されたコンテンツ時刻 のストリーム時刻 をリクエストするメソッドが用意されています。これらの変換方法を使用すると、ブックマークされたコンテンツ時刻 を保存し、ストリームの新しいインスタンスで対応するストリーム時刻 までシークできます。ブックマーク機能の実装方法を示すサンプルアプリへのリンクを含め、そのアプローチを以下に示します。
ブックマークを保存する
アクティビティが一時停止したら、ブックマークを保存します。
Objective-C
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.contentPlayer pause];
// Ignore this if we're presenting a modal view (e.g. in-app clickthrough).
if ([self.navigationController.viewControllers indexOfObject:self] == NSNotFound) {
// Don't save bookmark if we're playing a live stream.
if (self.video.streamType != StreamTypeLive) {
NSTimeInterval contentTime = [self.streamManager
contentTimeForStreamTime:CMTimeGetSeconds(self.contentPlayer.currentTime)];
[self.delegate videoViewController:self didReportSavedTime:contentTime forVideo:self.video];
}
Swift
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
contentPlayer.pause()
if isMovingFromParent {
// Only save bookmark if we're playing a VOD stream.
if let vodStream = stream as? VODStream, let streamManager = streamManager {
let contentTime = streamManager.contentTime(
forStreamTime: contentPlayer.currentTime().seconds)
if contentTime.isFinite, contentTime > 0 {
delegate?.videoViewController(self, didReportBookmarkedTime: contentTime, for: vodStream)
}
}
if trackingContent {
removeContentPlayerObservers()
}
streamManager?.destroy()
adsLoader?.contentComplete()
streamManager = nil
adsLoader = nil
}
}
ブックマークを読み込む
ストリームを再リクエストするときにブックマークを読み込みます。これは、VideoStreamPlayer
インターフェースの実装の一部です。
Objective-C
case kIMAAdEvent_STREAM_LOADED: {
if (self.video.streamType == StreamTypeVOD) {
[self addContentPlayerObservers];
if (self.video.savedTime > 0) {
NSTimeInterval streamTime =
[self.streamManager streamTimeForContentTime:self.video.savedTime];
[self.IMAVideoDisplay seekStreamToTime:streamTime];
self.video.savedTime = 0;
}
}
Swift
case .STREAM_LOADED:
guard let stream else { return }
addContentPlayerObservers()
if let vodStream = stream as? VODStream, vodStream.bookmarkTime > 0 {
bookmarkStreamTime = streamManager.streamTime(forContentTime: vodStream.bookmarkTime)
if let time = bookmarkStreamTime {
pendingBookmarkSeek = true
logMessage(
"STREAM_LOADED: Bookmark pending for contentTime: \(String(format: "%.2f", vodStream.bookmarkTime)) (streamTime: \(String(format: "%.2f", time)))"
)
vodStream.bookmarkTime = 0
}
}