In dieser Anleitung wird beschrieben, wie Sie die Lesezeichenfunktion mit dem IMA DAI SDK implementieren, wenn Sie die dynamische Anzeigenbereitstellung (Dynamic Ad Insertion, DAI) für Video-on-Demand-Streams (VOD) verwenden. Dabei wird davon ausgegangen, dass eine funktionierende IMA DAI-Implementierung vorhanden ist, wie sie unter Erste Schrittebeschrieben wird.
Was ist die Lesezeichenfunktion?
Die Lesezeichenfunktion ermöglicht es, eine bestimmte Stelle im Contentstream zu speichern und dorthin zurückzukehren. Ein Beispiel: Ein Nutzer sieht sich den Content fünf Minuten lang an, schließt den Videostream und kehrt dann dorthin zurück. Mithilfe der Lesezeichenfunktion wird die Stelle gespeichert, an der der Nutzer den Stream geschlossen hat, damit er dorthin zurückkehren und fortfahren kann. Mit dieser Funktion bieten Sie dem Betrachter also eine nahtlose Erfahrung.
Funktionsweise der Lesezeichenfunktion bei der dynamischen Anzeigenbereitstellung
Wenn Sie einen DAI-Stream mit einem Lesezeichen versehen, müssen Sie die Stream-ID und die Zeit aufzeichnen, zu der der Nutzer das Video verlässt. Wenn der Nutzer zurückkehrt, fordern Sie den Stream noch einmal an und springen Sie zur gespeicherten Zeit. Da jede Instanz des angeforderten Streams Werbeunterbrechungen unterschiedlicher Länge haben kann, funktioniert das Speichern der Stream-Zeit nicht. Sie möchten vielmehr an der gleichen Content-Zeit fortfahren.
Konvertierungsmethoden
Das IMA DAI SDK bietet zwei Methoden, um die Content-Zeit für eine bestimmte Stream-Zeit und die Stream-Zeit für eine bestimmte Content-Zeit anzufordern. Mit diesen Konvertierungsmethoden können Sie die mit einem Lesezeichen versehene Content-Zeit speichern und dann in der neuen Instanz des Streams zur entsprechenden Stream-Zeit springen. Hier ist der Ansatz, einschließlich eines Links zu einer Beispiel-App, die eine funktionierende Implementierung der Lesezeichenfunktion zeigt.
Lesezeichen speichern
Speichern Sie ein Lesezeichen, wenn die Aktivität pausiert wird.
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
}
}
Lesezeichen laden
Laden Sie das Lesezeichen, wenn Sie einen Stream noch einmal anfordern. Es ist Teil der Implementierung der VideoStreamPlayer-Schnittstelle.
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
}
}