Snapback

Se você é editor de vídeo, talvez queira impedir que os espectadores escondam seus anúncios intermediários. Quando um usuário passa por um intervalo de anúncio, é possível voltar ao início dele e retornar ao local de busca depois que o intervalo for concluído. Esse recurso é chamado de "snapback".

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

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

  1. Confira se o usuário fez uma busca que ultrapassou um intervalo de anúncio não assistido e, em caso afirmativo, retorne a ele.
  2. Quando o intervalo de anúncio terminar, retorne à busca original.

Em forma de diagrama, o código fica assim:

Veja como implementar esse fluxo de trabalho no SDK de DAI do IMA, como feito no AdvancedExample.

Evitar uma busca de deixar um intervalo de anúncio sem visualização

Confira se o usuário executou uma busca que ultrapassou um intervalo de anúncio não assistido. Caso tenha feito isso, leve-o de volta a ele. No exemplo do iOS Advanced, use a interação do usuário com a IU para detectar quando ele executou uma busca. Preserve o horário de início da busca para verificar se ele passou um intervalo de anúncio não reproduzido na busca. Quando o usuário soltar os controles de vídeo, compare o horário atual com o momento do intervalo de anúncio mais recente. Se o intervalo de anúncio ocorrer após o tempo de início da busca (ou seja, se o usuário tiver pulado) e ainda não tiver sido reproduzido, volte ao início do intervalo. Além disso, defina uma sinalização de retorno para verificar mais tarde no gerenciador completo do intervalo de anúncio:

- (IBAction)videoControlsTouchStarted:(id)sender {
  self.seekStartTime = self.contentPlayer.currentTime;
}

- (IBAction)videoControlsTouchEnded:(id)sender {
  self.seekEndTime = CMTimeMake(self.progressBar.value, 1);
  IMACuepoint *lastCuepoint =
      [self.streamManager previousCuepointForStreamTime:CMTimeGetSeconds(self.seekEndTime)];
  if (!lastCuepoint.played && (lastCuepoint.startTime > CMTimeGetSeconds(self.seekStartTime))) {
    self.snapbackMode = YES
    // Add 1 to the seek time to get the keyframe at the start of the ad to be your landing place.
    [self.contentPlayer seekToTime:CMTimeMakeWithSeconds(lastCuepoint.startTime + 1, NSEC_PER_SEC)];
  }
}

Levar o usuário de volta à busca original

No gerenciador de intervalo de anúncio, confira se o intervalo anterior foi reproduzido como resultado do snapback. Se esse for o caso, retorne o usuário para o local que ele estava tentando buscar inicialmente (contanto que não seja o meio do intervalo de anúncio que acabou de ser reproduzido):

- (void)streamManager:(IMAStreamManager *)streamManager didReceiveAdEvent:(IMAAdEvent *)event {
  switch (event.type) {
    case kIMAAdEvent_AD_BREAK_ENDED: {
      if (self.snapbackMode) {
        self.snapbackMode = NO;
        if (CMTimeCompare(self.seekEndTime, self.contentPlayer.currentTime)) {
          [self.contentPlayer seekToTime:self.seekEndTime];
        }
      }
      break;
    }
  }
}