Ce guide explique comment implémenter la fonctionnalité de favoris à l'aide du SDK IMA DAI lorsque vous utilisez l'insertion dynamique d'annonces pour les flux vidéo à la demande. Cela suppose une implémentation IMA DAI fonctionnelle, comme celle présentée dans Premiers pas.
Qu'est-ce que la fonctionnalité de favoris ?
La fonctionnalité de favoris permet d'enregistrer un point précis du flux de contenu, puis d'y revenir. Supposons qu'un utilisateur regarde cinq minutes de contenu, quitte le flux vidéo, puis y revienne. La fonctionnalité de favoris enregistre la position de l'utilisateur dans le flux de sorte que celui-ci puisse reprendre la lecture là où l'utilisateur s'était arrêté. Cela garantit une expérience homogène à l'utilisateur.
Fonctionnement de la fonctionnalité de favoris pour l'insertion dynamique d'annonces
Lorsque vous ajoutez un flux d'insertion dynamique d'annonces à vos favoris, vous devez enregistrer l'ID du flux et l'heure à laquelle l'utilisateur quitte la vidéo. Lorsque l'utilisateur revient, demandez à nouveau le flux et accédez à l'heure enregistrée. Étant donné que chaque instance du flux demandé peut comporter des pauses publicitaires de durées différentes, il ne suffit pas d'enregistrer l'heure du flux. Ce que vous voulez vraiment faire, c'est reprendre la lecture à la même heure de contenu.
Les méthodes de conversion à la rescousse
Le SDK IMA DAI fournit une paire de méthodes pour demander l'heure de contenu pour une heure de flux donnée et l'heure de flux pour une heure de contenu donnée. À l'aide de ces méthodes de conversion, vous pouvez stocker l'heure de contenu ajoutée aux favoris, puis accéder à l'heure de flux correspondante dans la nouvelle instance du flux. Voici l'approche, y compris un lien vers une application exemple qui montre une implémentation de la fonctionnalité de favoris.
Enregistrer des favoris
Enregistrez un favori lorsque l'activité est mise en pause.
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
}
}
Charger des favoris
Chargez le favori lorsque vous demandez à nouveau un flux. Cela fait partie de l'implémentation de l'interface 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
}
}