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:
- Crear una configuración de anuncios Live
- Configure su transmisión en directo
- 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.
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 eventoEventType.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 valorEvent.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:
- Añada el
@Default
a su oyente. - 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.