In qualità di publisher di video, potresti voler impedire agli spettatori di che cerca oltre gli annunci mid-roll. Quando un utente va oltre un'interruzione pubblicitaria, puoi riportarli all'inizio dell'interruzione pubblicitaria e poi tornare alla loro posizione di ricerca al termine dell'interruzione pubblicitaria. Questo è chiamata "snapback".
Osserva il diagramma seguente come esempio. Lo spettatore sta guardando un video e decide di andare dal minuto 5 al minuto 15. C'è, tuttavia, un'interruzione pubblicitaria al contrassegno dei 10 minuti che vorresti prima di poter guardare i contenuti successivi:
Per visualizzare questa interruzione pubblicitaria:
- Controlla se l'utente ha eseguito un avanzamento che ha saltato un'interruzione pubblicitaria non guardata e, in questo caso, riportalo all'interruzione pubblicitaria.
- Al termine dell'interruzione pubblicitaria, riportali alla ricerca originale.
Il diagramma ha il seguente aspetto:
Ecco come implementare lo snapshot utilizzando l'SDK IMA DAI, come dimostrato in AdvancedExample.
Impedire a una ricerca di lasciare un'interruzione pubblicitaria non guardata
Controlla se l'utente ha eseguito una ricerca successiva a un'interruzione pubblicitaria non guardata
e, in questo caso, riportali all'interruzione pubblicitaria.
L'esempio avanzato di tvOS sfrutta AVPlayerViewController
,
che ha un metodo delegato per indicare che l'utente ha eseguito una ricerca.
Se l'ora di inizio della ricerca precede l'interruzione pubblicitaria precedente (ovvero
l'utente l'ha saltato) e quella pausa non è stata ancora riprodotta,
cercalo di nuovo fino all'inizio dell'interruzione pubblicitaria. Inoltre, prendi nota dell'ora di inizio
richiesto inizialmente cercare di controllare in un secondo momento nel gestore ad-break-did-end
:
- (void)playerViewController:(AVPlayerViewController *)playerViewController willResumePlaybackAfterUserNavigatedFromTime:(CMTime)oldTime toTime:(CMTime)targetTime { if (self.streamManager) { IMACuepoint *prevCuepoint = [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(targetTime)]; if (prevCuepoint && !prevCuepoint.isPlayed && oldTime < prevCuepoint.startTime) { self.userSeekTime = CMTimeGetSeconds(targetTime); [self.playerViewController.player seekToTime:CMTimeMakeWithSeconds( prevCuepoint.startTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; } } }
Riporta l'utente alla ricerca originale
Nel delegato dell'evento, modifica la richiesta AD_BREAK_ENDED
per verificare se
l'interruzione pubblicitaria precedente è stata riprodotta come risultato dello snapshot.
- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event { NSLog(@"StreamManager event (%@).", event.typeString); switch (event.type) { // Your other events go here as normal. case kIMAAdEvent_AD_BREAK_ENDED: { if (self.userSeekTime > 0) { self.playerViewController.player seekToTime:CMTimeMakeWithSeconds(self.userSeekTime, NSEC_PER_SEC) toleranceBefore:kCMTimeZero toleranceAfter:kCMTimeZero]; self.userSeekTime = 0; // existing handling for AD_BREAK_ENDED goes here. break; } // And so on for other events. default: break; } }