Cómo volver a una pausa publicitaria omitida

Selecciona la plataforma: HTML5 Android iOS tvOS Roku

Como publicador de videos, es posible que quieras evitar que los usuarios adelanten los anuncios durante el video. Cuando un usuario busca más allá de una pausa publicitaria, puedes llevarlo de regreso al inicio de esa pausa y, luego, regresarlo a su ubicación de búsqueda una vez que se haya completado esa pausa. Esta función se llama “recuperación”.

Como ejemplo, consulta el siguiente diagrama. El usuario está mirando un video y decide adelantar desde el minuto 5 hasta el minuto 15. Sin embargo, hay una pausa publicitaria a los 10 minutos que quieres que miren antes de poder ver el contenido después de ella:

Para mostrar esta pausa publicitaria, sigue estos pasos:

  1. Comprueba si el usuario realizó una búsqueda que omitió una pausa publicitaria sin mirar y, si es así, llévalo de regreso a la pausa publicitaria.
  2. Una vez que se complete la pausa publicitaria, regrésalos a su búsqueda original.

En forma de diagrama, se ve así:

A continuación, se explica cómo implementar el regreso rápido con el SDK de DAI de IMA, como se muestra en AdvancedExample.

Evita que se omita una pausa publicitaria sin mirar

Comprueba si el usuario realizó una búsqueda que pasó un corte comercial sin mirar y, si es así, llévalo de vuelta al corte comercial. El ejemplo avanzado de tvOS aprovecha AVPlayerViewController, que tiene un método delegado para indicarte que el usuario ejecutó una búsqueda. Si la hora de inicio de la búsqueda es anterior a la pausa publicitaria anterior (lo que significa que el usuario la omitió) y esa pausa aún no se reprodujo, llévalo de regreso al inicio de la pausa publicitaria. Además, registra la hora de inicio de la búsqueda solicitada inicialmente para verificarla más adelante en tu controlador 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];
    }
  }
}

Regresa al usuario a su posición de búsqueda original

En el delegado de eventos, modifica el caso AD_BREAK_ENDED para verificar si el corte publicitario anterior se reprodujo como resultado de un retroceso.


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