Snapback

Como editor de vídeo, talvez você queira evitar que seus espectadores além dos anúncios intermediários. Quando um usuário passa por um intervalo de anúncio, volte ao início do intervalo de anúncio e retorne ao local de busca após a conclusão do intervalo comercial. Isso é chamado de "Snapback".

Como exemplo, veja o diagrama abaixo. O espectador estiver assistindo um vídeo, e decide procurar da marca de 5 para a de 15 minutos. No entanto, há um intervalo de anúncio de 10 minutos que você quer que eles assistam antes de poderem assistir o conteúdo depois dele:

Para mostrar esse intervalo de anúncio, siga estas etapas:

  1. Verifique se o usuário executou uma busca que ultrapassou um intervalo de anúncio não assistido. Em caso afirmativo, leve-o de volta ao intervalo de anúncio.
  2. Após a conclusão do intervalo comercial, volte à busca original.

No formato de diagrama, o código fica assim:

Veja como implementar o ajuste usando o SDK de DAI do IMA, conforme demonstrado nas AdvancedExample.

Evite que um usuário tente deixar um intervalo de anúncio sem assistir.

Verifique se o usuário fez uma busca que passou de um intervalo de anúncio não assistido. Em caso afirmativo, leve-o de volta ao intervalo de anúncio. O exemplo avançado de tvOS aproveita o AVPlayerViewController, que tem um método delegado para informar que o usuário executou uma busca. Se a hora de início da busca vier antes do intervalo comercial anterior (ou seja, se o usuário já passou por ela) e essa pausa ainda não tiver sido reproduzida, volte ao início do intervalo comercial. Além disso, registre o horário de início da busca pedida inicialmente para verificar mais tarde no gerenciador 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];
    }
  }
}

Retorne o usuário à busca original

No delegado do evento, modifique o caso AD_BREAK_ENDED para verificar se o o intervalo comercial anterior foi reproduzido como resultado do ajuste.


- (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;
  }
}