Personalización de la reproducción con anuncios

Cuando la reproducción llega a una pausa publicitaria, pasa una pausa publicitaria o termina en una pausa publicitaria, TVSDK define algún comportamiento predeterminado para la posición del cabezal de reproducción actual.

CONSEJO

Puede anular el comportamiento predeterminado utilizando la clase PTAdPolicySelector.

El comportamiento predeterminado varía en función de si el usuario pasa la pausa publicitaria durante la reproducción normal o si busca en un vídeo.

Puede personalizar el comportamiento de reproducción de publicidad de las siguientes maneras:

  • Guarde la posición en la que el usuario dejó de ver el vídeo y reanudó la reproducción en la misma posición en una sesión futura.

  • Si se presenta una pausa publicitaria al usuario, no se muestran anuncios adicionales durante un número de minutos, aunque el usuario busque una nueva posición.

  • Si el contenido no se reproduce después de unos minutos, reinicie el flujo o realice una conmutación por error a una fuente diferente para el mismo contenido.

    En la sesión de reproducción de conmutación por error, para permitir que el usuario omita los anuncios y vuelva a la posición anterior en la que se produjo un error, puede desactivar los anuncios previos a la emisión o durante la emisión. TVSDK proporciona métodos para permitir saltar anuncios previos y mid-roll.

Elementos de API para reproducción de publicidad

TVSDK proporciona clases y métodos que puede utilizar para personalizar el comportamiento de reproducción del contenido que contiene publicidad.
Los siguientes elementos API son útiles para personalizar la reproducción:

Elemento de API Contenido compatible con la publicidad
PTAdMetadata Controle si un visitante debe marcar una pausa publicitaria como observada y, en caso afirmativo, cuándo marcarla. Establezca y obtenga la directiva vista mediante la propiedad adBreakAsWatched .
PTAdPolicySelector Protocolo que permite la personalización del comportamiento de publicidad de TVSDK.
PTDefaultAdPolicySelector Clase que implementa el comportamiento predeterminado de TVSDK. La aplicación puede anular esta clase para personalizar los comportamientos predeterminados sin implementar la interfaz completa.
PTMediaPlayer
  • localTime .

    Es la hora local de la reproducción, excluyendo las pausas publicitarias colocadas.

  • seekToLocalTime .

    En este caso, la búsqueda se produce en relación con una hora local del flujo.

  • getTimeline.convertedToLocalTime .

    La posición virtual en la línea de tiempo se convierte a la posición local.

PTAdBreak isWatched, propiedad. Indica si el espectador ha visto el anuncio.

Configurar la reproducción personalizada

Para poder personalizar o anular los comportamientos publicitarios, registre la instancia de directiva de publicidad con TVSDK.

Para personalizar los comportamientos publicitarios, realice una de las siguientes acciones:

  • Consiga el protocolo PTAdPolicySelector e implemente todos los métodos de selección de directivas necesarios.

    Se recomienda esta opción si necesita anular todos los comportamientos publicitarios predeterminados.

  • Anule la clase PTDefaultAdPolicySelector y proporcione implementaciones solo para los comportamientos que requieren personalización.

    Esta opción se recomienda si necesita anular solo algunos de los comportamientos predeterminados.

Para ambas opciones, complete las siguientes tareas:

  1. Registre la instancia de directiva que utilizará TVSDK a través de la fábrica del cliente.

    NOTA

    Las políticas de publicidad personalizadas que se registran al principio de la reproducción se borran cuando se desasigna la instancia PTMediaPlayer . La aplicación debe registrar una instancia de selector de políticas cada vez que se crea una nueva sesión de reproducción.

    Por ejemplo:

    // Create an instance of the custom policy selector 
    PTS5MinuteSkipBreakPolicySelector *adPolicySelector  
         = [[[PTS5MinuteSkipBreakPolicySelector alloc] initWithMediaPlayer:self.player] autorelease]; 
    
    // register this instance 
    [[PTDefaultMediaPlayerClientFactory defaultFactory] registerAdPolicySelector:adPolicySelector];
    
  2. Implemente sus personalizaciones.

Omitir pausas publicitarias durante un período de tiempo

De forma predeterminada, TVSDK fuerza la reproducción de una pausa publicitaria cuando el usuario busca tras una pausa publicitaria. Puede personalizar el comportamiento para omitir una pausa publicitaria si el tiempo transcurrido desde la finalización de una pausa anterior es de un determinado número de minutos.

IMPORTANTE

Cuando hay una búsqueda interna para omitir un anuncio, puede haber una ligera pausa en la reproducción.

El siguiente ejemplo de selector de directiva de publicidad personalizada omite los anuncios en los próximos cinco minutos (hora del reloj del muro) después de que un usuario haya visto una pausa publicitaria.

  1. Registre la instancia de directiva que utilizará TVSDK a través de la fábrica del cliente.

    // Create an instance of the custom policy selector 
    PTS5MinuteSkipBreakPolicySelector *adPolicySelector  
         = [[[PTS5MinuteSkipBreakPolicySelector alloc] initWithMediaPlayer:self.player] autorelease]; 
    
    // register this instance 
    [[PTDefaultMediaPlayerClientFactory defaultFactory] registerAdPolicySelector:adPolicySelector];
    
  2. Implemente la personalización.

PTS5MinuteSkipBreakPolicySelector.h

#import "PTMediaPlayerNotifications.h" 
#import "PTMediaPlayer.h" 
#import "PTDefaultAdPolicySelector.h" 
 
//  extend the default policy  
selector@interface PTS5MinuteSkipBreakPolicySelector : PTDefaultAdPolicySelector 
  
- (id)initWithMediaPlayer:(PTMediaPlayer *)player; 
  
@end

PTS5MinuteSkipBreakPolicySelector.m

#import "PTS5MinuteSkipBreakPolicySelector.h" 
  
double MIN_BREAK_INTERVAL  = 60 * 5; // 5 minutes 
  
@implementation PTS5MinuteSkipBreakPolicySelector 
{ 
    PTMediaPlayer *_player; 
    NSTimeInterval _lastAdBreakPlayedTime; 
} 
  
- (id)initWithMediaPlayer:(PTMediaPlayer *)player 
{ 
    if (self = [super init]) 
    { 
        _lastAdBreakPlayedTime = 0; 
        _player = [player retain]; 
        [self addobservers]; 
    } 
    
    return self; 
} 
  
- (NSArray *)selectAdBreaksToPlay:(PTAdPolicyInfo *)info 
{ 
    NSLog(@"%@ - selectAdBreaksToPlay (%f): %f", self,  
        CMTimeGetSeconds(info.currentTime), _lastAdBreakPlayedTime); 
    
    BOOL shouldPlay = [self shouldPlayAdBreaks]; 
    if (shouldPlay) 
    { 
        return [super selectAdBreaksToPlay:info]; 
    } 
    
    return nil; 
} 
  
- (PTAdBreakPolicyType)selectPolicyForAdBreak:(PTAdPolicyInfo *)info 
{ 
    NSLog(@"%@ - selectPolicyForAdBreak (%f): %f  %f", self,  
            CMTimeGetSeconds(info.currentTime), _lastAdBreakPlayedTime,  
            [[NSDate date] timeIntervalSince1970]); 
    
    BOOL shouldPlay = [self shouldPlayAdBreaks]; 
    if (shouldPlay) 
    { 
        return [super selectPolicyForAdBreak:info]; 
    } 
    
    return PTAdBreakPolicyTypeSkip; 
} 
  
- (BOOL)shouldPlayAdBreaks 
{ 
    NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970]; 
    if (_lastAdBreakPlayedTime <= 0) 
    { 
        return YES; 
    } 
    
    if (_lastAdBreakPlayedTime > 0 && (currentTime - _lastAdBreakPlayedTime) > MIN_BREAK_INTERVAL) 
    { 
        return YES; 
    } 
    
    // don't play any ad break if 5 minutes hasn't elapsed 
    return NO; 
} 
  
- (void) onMediaPlayerAdBreakStarted:(NSNotification *) notification 
{ 
    NSLog(@"%@ - AdBreak Start", self); 
} 
  
- (void) onMediaPlayerAdBreakCompleted:(NSNotification *) notification 
{ 
    _lastAdBreakPlayedTime = [[NSDate date] timeIntervalSince1970]; 
    NSLog(@"%@ - AdBreak Complete at: %f", self, _lastAdBreakPlayedTime); 
} 
  
- (void)addobservers 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaPlayerAdBreakStarted:)  
                name:PTMediaPlayerAdBreakStartedNotification object:_player]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(onMediaPlayerAdBreakCompleted:)  
                name:PTMediaPlayerAdBreakCompletedNotification object:_player]; 
} 
  
- (void)removeObservers 
{ 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
} 
  
- (void)dealloc 
{ 
    [self removeObservers]; 
    [_player release]; 
    [super dealloc]; 
} 
  
@end

Guarde la posición del vídeo y reanude más tarde

Puede guardar la posición de reproducción actual en un vídeo y reanudar la reproducción en la misma posición en una sesión futura.

Los anuncios insertados de forma dinámica difieren entre las sesiones de usuario, por lo que guardar la posición con publicidad duplicada hace referencia a una posición diferente en una sesión futura. TVSDK proporciona métodos para recuperar la posición de reproducción e ignorar los anuncios duplicados.

  1. Cuando el usuario sale de un vídeo, la aplicación recupera y guarda la posición en el vídeo.

    CONSEJO

    No se incluyen las duraciones de los anuncios.

    Las pausas publicitarias pueden variar en cada sesión debido a patrones de anuncios, restricciones de frecuencia, etc. La hora actual del vídeo en una sesión puede ser diferente en una sesión futura. Al guardar una posición en el vídeo, la aplicación recupera la hora local . Utilice la propiedad localTime para leer esta posición , que puede guardar en el dispositivo o en una base de datos del servidor.

    Por ejemplo, si el usuario se encuentra en el minuto 20 del vídeo y esta posición incluye cinco minutos de anuncios, currentTime será de 1200 segundos, mientras que localTime en esta posición será de 900 segundos.

    IMPORTANTE

    La hora local y la hora actual son las mismas para los flujos en directo/lineales. En este caso, convertToLocalTime no tiene ningún efecto. Para VOD, la hora local permanece sin cambios mientras se reproduce el anuncio.

    - (void) onMediaPlayerTimeChange:(NSNotification *)notification { 
        CMTimeRange seekableRange = self.player.seekableRange; 
    
        if (CMTIMERANGE_IS_VALID(seekableRange)) { 
            double seekableRangeStart = CMTimeGetSeconds(seekableRange.start); 
            double seekableRangeDuration = CMTimeGetSeconds(seekableRange.duration); 
            double currentTime = CMTimeGetSeconds(self.player.currentTime); // includes ads 
            double localTime = CMTimeGetSeconds(self.player.localTime); // no ads 
        } 
    }
    
  2. Para reanudar el vídeo en la misma posición que se guardó en la sesión anterior, utilice seekToLocalTime.

    CONSEJO

    Solo se llama a este método con valores de hora locales. Si se llama al método con resultados de tiempo actuales, se produce un comportamiento incorrecto.

    Para buscar el tiempo actual, utilice seekToTime.

  3. Cuando la aplicación reciba el evento de cambio de estado PTMediaPlayerStatusReady , busque la hora local guardada.

    [self.player seekToLocalTime:CMTimeMake(900, 1) completionHandler:^(BOOL finished) { 
        [self.player play]; 
    }];
    
  4. Proporcione los pausas publicitarias tal como se especifica en la interfaz de directivas de publicidad.

  5. Implemente un selector de políticas de publicidad personalizado ampliando el selector de directivas de publicidad predeterminado.

  6. Proporcione las pausas publicitarias que se deben presentar al usuario implementando selectAdBreaksToPlay

    NOTA

    Este método incluye una pausa publicitaria pre-roll y las pausas publicitarias intermedias antes de la posición horaria local. La aplicación puede decidir reproducir una pausa publicitaria previa y reanudar a la hora local especificada, reproducir una pausa publicitaria intermedia y reanudar a la hora local especificada o no reproducir ninguna pausa publicitaria.

En esta página