BRIGHTCOVE PLAYER: CAMBIOS EN EL PLUGIN SSAI PARA V6.9.0

Picture of bsp-admin-1
bsp-admin-1

El SDK de Brightcove v6.9.0 se publicó el 22 de octubre de 2019 e incluye varios cambios (como se puede ver en las notas de la versión). Pero en esta entrada quiero hablar específicamente de los cambios en el plugin SSAI, en particular de la compatibilidad añadida con Live SSAI.

VISIÓN GENERAL DE SSAI EN DIRECTO

¿Qué es Live SSAI? En pocas palabras, Live SSAI es una transmisión en directo que contiene anuncios cosidos dinámicamente. Encontrará más información sobre la API Live SSAI en Live API: Server-Side Ad Insertion (SSAI)") - y consulte también Video Cloud SSAI Overview para obtener más información sobre SSAI en general.

Cuando reproduzca una secuencia SSAI en directo en cualquier reproductor, verá tanto el contenido como los anuncios como parte de la misma secuencia, y no habrá ninguna indicación visual entre ambos. Aquí es donde el SDK de Brightcove y el plugin SSAI resultan útiles. El plugin SSAI detectará cuándo se está reproduciendo una pausa publicitaria y el controlador cambiará para mostrar información útil, como la duración de la pausa publicitaria, la duración del anuncio individual y la cuenta atrás del número de anuncios.

CÓMO EMPEZAR

Antes de empezar a hablar de Android y del código del plugin SSAI, necesitarás hacer las siguientes cosas:

  1. Crear una configuración de anuncios Live
  2. Configure su transmisión en directo
  3. Busque y copie su Live adConfigId

CREAR UNA CONFIGURACIÓN DE ANUNCIOS EN DIRECTO

Debe crear una configuración de anuncios del mismo modo que lo haría con un vídeo VOD. Para ello, siga la siguiente guía: Creación de una configuración de anuncios Live. También puede echar un vistazo a Implementación de anuncios del lado del servidor en el módulo Live.

CONFIGURAR LA RETRANSMISIÓN EN DIRECTO

Para crear su transmisión en directo con soporte SSAI, por favor siga: Creación de un evento en directo compatible con anuncios del lado del servidor.

BUSQUE Y COPIE SU ADCONFIGID LIVE

Cuando crea una configuración de anuncios Live en el paso 1, obtiene un Id. y puede tener la tentación de utilizarlo como su adConfigId del mismo modo que se hace para VOD SSAI. Sin embargo, este no es el Id que necesitamos para Live SSAI.

Para encontrar el Live adConfigIddebe seguir los pasos indicados en Publicación del evento en directo. En el último paso, podrá ver la URL del reproductor. Esta URL del reproductor contiene el adConfigId. Podrá diferenciarlo porque este adConfigId comienza con “live.”

SOLICITE SU VÍDEO SSAI EN DIRECTO CON EL PLUGIN SSAI

Ahora estamos listos para solicitar el vídeo y reproducirlo.

Lo primero que tenemos que hacer es crear un HttpRequestConfig con el objeto Live adConfigId.

String adConfigIdKey = "ad_config_id";
String adConfigIdValue = "live.eb5YO2S2Oqdzlhc3BCHAoXKYJJl4JZlWXeiH49VFaYO2qdTkNe_GdEBSJjir";

HttpRequestConfig httpRequestConfig = new HttpRequestConfig.Builder()
  .addQueryParameter(adConfigIdKey, adConfigIdValue)
   .build();

En segundo lugar, creamos el SSAIComponent que gestiona el flujo SSAI en directo del mismo modo que un flujo SSAI VOD.

SSAIComponent plugin = new SSAIComponent(this, brightcoveVideoView);

A continuación, creamos el Catalog objeto.

Catalog catalog = new Catalog(eventEmitter, accountId, policyKey);

Por último, realizamos la solicitud de vídeo mediante la función HttpRequestConfig previamente creado y procesamos el vídeo recibido con el plugin SSAI. El plugin SSAI añadirá automáticamente el vídeo a la vista de vídeo de Brightcove.

catalog.findVideoByID(videoId, httpRequestConfig, new VideoListener() {
            @Override
            public void onVideo(Video video) {
                   plugin.processVideo(video);
            }
        });

Observará que este proceso es exactamente el mismo que con un SSAI VOD. La única diferencia es el adConfigId utilizado.

CAMBIOS DE ÚLTIMA HORA

En el plugin SSAI v6.9.0, hemos tenido que introducir un posible cambio de última hora debido a un problema con la posición almacenada del cabezal de reproducción al interrumpir y reanudar el vídeo en directo. Esto sólo le afectará si confía en la función Event.PLAYHEAD_POSITION de la propiedad EventType.PROGRESS o EventType.AD_PROGRESS evento.

En Event.PLAYHEAD_POSITION en versiones anteriores contenía la posición relativa del cabezal de reproducción respecto al anuncio o al contenido principal, pero en 6.9.0 tiene la posición absoluta del cabezal de reproducción.

Permítanme explicarlo con un ejemplo. En la siguiente figura, tenemos un vídeo VOD SSAI con una duración total de 43 segundos. El tiempo del contenido principal es de 15 segundos, y tiene tres anuncios, un pre-roll de 6 segundos, un mid-roll de 14 segundos y un post-roll de 8 segundos. Cuando empecemos a reproducir la cuña intermedia, la posición absoluta del cabezal de reproducción será de 11 segundos, pero la posición relativa del cabezal de reproducción respecto a la cuña intermedia será cero. La página Event.PLAYHEAD_POSITION será cero en versiones anteriores, pero es de 11 segundos en la versión 6.9.0.

NOTA: Todos los valores reales de posición del cabezal de reproducción se indican en milisegundos en el SDK de Brightcove.

ssai-progress-flow-diagram

Por otra parte, también hemos introducido una nueva propiedad de evento denominada Event.PROGRESS_BAR_PLAYHEAD_POSITION que contiene la posición relativa del cabezal de reproducción. Este nombre es más descriptivo de su propósito, que es, en última instancia, mostrar la posición del cabezal de reproducción del bloque en reproducción (anuncio o contenido) al usuario a través de la barra de progreso. Dicho esto, si depende de la función Event.PLAYHEAD_POSITION sólo tiene que empezar a utilizar Event.PROGRESS_BAR_PLAYHEAD_POSITION en su lugar.

En Event.ORIGINAL_PLAYHEAD_POSITION no se ha modificado por motivos de compatibilidad, y sigue conteniendo la posición absoluta del cabezal de reproducción.

En el siguiente cuadro se resumen los cambios:

     
Propiedad del evento Anterior a 6.9.0 6.9.0 y superior
Event.PLAYHEAD_POSITION Posición relativa del cabezal de reproducción Posición absoluta del cabezal de reproducción
Event.ORIGINAL_PLAYHEAD_POSITION Posición absoluta del cabezal de reproducción Posición absoluta del cabezal de reproducción
Event.PROGRESS_BAR_PLAYHEAD_POSITION N/A Posición relativa del cabezal de reproducción

CONSIDERACIONES AL ESCUCHAR EL EVENTO DE PROGRESO

Hay algunas cosas que debe tener en cuenta al escuchar el EventType.PROGRESS en el plugin SSAI. El momento en el que añades tu listener importa.

Para empezar, quiero explicarle en qué consisten el SDK de Brightcove y el plugin SSAI.

1. En primer lugar, el EventType.PROGRESS es emitido originalmente por el ExoPlayerVideoDisplayComponent y la clase Event.PLAYHEAD_POSITION tiene la posición del cabezal de reproducción recuperada de ExoPlayer (asumo que estás usando ExoPlayer), que es la posición absoluta del cabezal de reproducción en el contexto SSAI.

2. A continuación, el plugin SSAI captura el EventType.PROGRESS y compara la posición del cabezal de reproducción con la línea de tiempo SSAI, para determinar si está reproduciendo contenido o anuncios. En ambos casos, calculamos la posición relativa del cabezal de reproducción y añadimos un nuevo icono Event.PROGRESS_BAR_PLAYHEAD_POSITION con este valor.

  • Si se reproduce contenido, dejamos que el evento se propague al resto de los oyentes.
  • Si se reproduce un anuncio, dejamos de propagar el EventType.PROGRESS y emitir el evento EventType.AD_PROGRESS con las mismas propiedades.

3. Por último, todos los oyentes añadidos después de SSAIEventType.AD_DATA_READY o los que tienen el @Default recibirá la anotación EventType.PROGRESS evento.

Debido a la forma en que el EventType.PROGRESS dependiendo del momento en que añada el receptor, es posible que no obtenga los valores esperados. Por ejemplo, si añades el EventType.PROGRESS oyente antes del SSAIEventType.AD_DATA_READY su listener será llamado antes de que sea procesado por el plugin SSAI, por lo que no podrá obtener la respuesta Event.PROGRESS_BAR_PLAYHEAD_POSITION valor.

NOTA: Esto también ocurre en versiones anteriores, pero en lugar de no obtener Event.PROGRESS_BAR_PLAYHEAD_POSITION el valor Event.PLAYHEAD_POSITION tendrá la posición absoluta del cabezal de reproducción en lugar de la posición relativa esperada (de nuevo, esto es para versiones antiguas).

NOTA: Este problema no se produce cuando se escucha el  EventType.AD_PROGRESS evento.

En caso de que te encuentres con esta situación, hay un par de cosas que puedes intentar:

  1. Añada el @Default a su oyente.
  2. Añada su oyente después de SSAIEventType.AD_DATA_READY se emite.

AÑADE EL @DEFAULT A SU OYENTE

Internamente, anotamos ciertas escuchas con el atributo @Default anotación. Esto hace que todos los oyentes anotados por defecto esperen a que todos los oyentes no anotados por defecto sean llamados primero, antes de que los oyentes anotados por defecto sean llamados.

Si añade esta anotación a su EventType.PROGRESS se le hace esperar hasta que el plugin SSAI no predeterminado EventType.PROGRESS procesa el evento. La única advertencia es que este comportamiento podría cambiar si el plugin SSAI EventType.PROGRESS se anota con el atributo @Default en una futura versión (actualmente no preveo que esto ocurra).

El ejemplo tiene este aspecto:

eventEmitter.on(EventType.PROGRESS, new EventListener() {
   @Default
   @Override
   public void processEvent(Event event) {
       int absolutePlayheadPosition = event.getIntegerProperty(Event.PLAYHEAD_POSITION);
       int relativePlayheadPosition = event.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
   }
});

AÑADA SU OYENTE DESPUÉS DE SSAIEVENTTYPE.AD_DATA_READY SE EMITE

Alternativamente, puede añadir su oyente después de la etiqueta SSAIEventType.AD_DATA_READY lo que garantiza que tu listener será llamado después de que el plugin SSAI haya tenido la oportunidad de procesar el evento.

El ejemplo tiene este aspecto:

eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
   eventEmitter.on(EventType.PROGRESS, progressEvent -> {
       int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
       int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
   });
});

Hay una advertencia. Puesto que el SSAIEventType.AD_DATA_READY se emite cada vez que se abre el vídeo SSAI (Live y VOD), debe asegurarse de que no está añadiendo su evento EventType.``PROGRESS oyente varias veces.

Una forma de evitarlo es guardando el token al añadir la opción EventType.PROGRESS al Emisor de Eventos y utilizarlo para eliminar dicho listener después de cada SSAIEventType.AD_DATA_READY evento. Por ejemplo:

// Declare member variable
private int mCurrentProgressToken = -1;

// Code called every time a SSAI video is processed with the SSAI plugin
eventEmitter.once(SSAIEventType.AD_DATA_READY, adDataReady -> {
   if (mCurrentProgressToken != -1) {
       eventEmitter.off(EventType.PROGRESS, mCurrentProgressToken);
   }

   mCurrentProgressToken = eventEmitter.on(EventType.PROGRESS, progressEvent -> {
       int absolutePlayheadPosition = progressEvent.getIntegerProperty(Event.PLAYHEAD_POSITION);
       int relativePlayheadPosition = progressEvent.getIntegerProperty(Event.PROGRESS_BAR_PLAYHEAD_POSITION);
   });
});

RESUMEN

El plugin SSAI 6.9.0 hace el trabajo pesado para soportar Live SSAI. No hay cambios significativos en la API del plugin para comenzar a reproducir secuencias SSAI en directo en comparación con SSAI VOD. La parte difícil es configurar su flujo SSAI en directo e identificar el Id. de configuración de anuncios correcto que debe pasar a la función HttpRequestConfig al realizar la solicitud de Catálogo.

Hay posibles cambios de última hora que debe tener en cuenta, pero una vez que identifique si está afectado, es muy sencillo corregir su código. Y en caso de que dependa del EventType.PROGRESS también debe prestar especial atención a la hora de añadir su oyente de progreso y verificar que obtiene los valores esperados.

Compartir

Our latest release includes big improvements to our Auto-Captions feature, to improve accessibility, boost productivi...
Brightcove ayudó a un fabricante de equipos de diagnóstico a reducir el tiempo de clase y los gastos, a la vez que mejoraba el éxito ...
Brightcove ayudó al mercado automovilístico más reconocido a gestionar su enorme videoteca heredada y a monetizarla...

¿PREPARADO PARA EMPEZAR?

Póngase en contacto con nosotros para saber cómo podemos mejorar sus esfuerzos de marketing por vídeo y ayudarle a generar los resultados y el ROI que necesita.