Como editor de vídeo, talvez você queira impedir que os espectadores avancem os anúncios intermediários. Quando um usuário pula um intervalo comercial, você pode levá-lo de volta ao início desse intervalo e, em seguida, retornar ao ponto do vídeo buscado pelo usuário após a conclusão do intervalo. Esse recurso é chamado de "snapback".
Por exemplo, confira o diagrama abaixo. O espectador está assistindo um vídeo e decide buscar do minuto 5 ao minuto 15. No entanto, há um intervalo de anúncio aos 10 minutos que você quer que eles assistam antes de poderem assistir o conteúdo depois disso:
Para mostrar esse intervalo, siga estas etapas:
- Verifique se o usuário fez uma busca que pulou um intervalo de anúncio não assistido e, em caso afirmativo, retorne ao intervalo de anúncio.
- Depois que o intervalo comercial terminar, retorne ao ponto original.
Em um diagrama, isso fica assim:
Confira como implementar o snapback usando o SDK DAI do IMA, conforme demonstrado em AdvancedExample.
Evitar que uma busca deixe um intervalo de anúncio sem ser assistido
Verifique se o usuário fez uma busca que passou por um intervalo de anúncio não assistido e, em caso afirmativo, retorne ao intervalo de anúncio.
O exemplo avançado do tvOS aproveita o AVPlayerViewController
,
que tem um método delegado para informar que o usuário executou uma busca.
Se o horário de início da busca for anterior ao intervalo comercial anterior (ou seja, o usuário pulou esse intervalo) e ele ainda não tiver sido reproduzido, faça a busca de volta ao início do intervalo. Além disso, registre o horário de início da
busca solicitada inicialmente para verificar mais tarde no seu manipulador 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]; } } }
Voltar o usuário para a posição original
No delegado de eventos, modifique o caso AD_BREAK_ENDED
para verificar se a
pausa para anúncio anterior foi reproduzida como resultado do snapback.
- (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; } }