Complemento HLS

El complemento HLS es un complemento de Brightcove Player que se basa en las extensiones de fuente de medios (MSE) de W3C para reproducir videos HTTP Live Streaming (HLS) en plataformas que no lo admiten de forma nativa. El complemento HLS se incluye automáticamente en el reproductor.

Conceptos básicos del complemento HLS

Los siguientes puntos le ayudarán a comprender y utilizar el complemento HLS:

  • Como se menciona en la oración inicial de este documento, el complemento se basa en las extensiones de fuente de medios (MSE) de W3C. MSE es una especificación W3C que permite que JavaScript envíe secuencias de bytes a códecs de medios dentro de navegadores web que admiten video HTML5. Entre otros usos posibles, esto permite la implementación del código de recuperación previa y almacenamiento en búfer del lado del cliente para la transmisión de medios completamente en JavaScript.
  • Con el complemento, puede usar el contenido de video HLS (m3u8) en el reproductor. Por ejemplo, puede crear un reproductor usando esta configuración para la sección de medios:
    "media":{
        "sources": [{
            "src": "http://example.com/video.m3u8",
            "type": "application/x-mpegURL"
        }]
    }
  • El uso compartido de recursos de origen cruzado (CORS) puede ser un problema cuando se usa HLS. Para obtener más información sobre el uso de CORS, consulte la Guía CORS.
  • HLS no es compatible con versiones de IE anteriores a IE11.

Resumen

Transmisión en directo HTTP (HLS) se ha convertido en un estándar de facto para la transmisión de video en dispositivos móviles gracias a su soporte nativo en iOS y Android. Aunque, hay una serie de razones independientes de la plataforma para recomendar el formato:

  • Admite selección de velocidad de bits adaptativa (impulsada por el cliente)
  • Entregado a través de puertos HTTP estándar
  • Formato de manifiesto sencillo y basado en texto
  • No se requieren servidores de streaming patentados

Desafortunadamente, todos los principales navegadores de escritorio, excepto Safari, carecen de compatibilidad con HLS. Eso deja a los desarrolladores web en la desafortunada posición de tener que mantener versiones alternativas del mismo video y potencialmente tener que renunciar por completo al video basado en HTML para brindar la mejor experiencia de visualización de escritorio.

Este complemento aborda la situación al proporcionar un polyfill para HLS en navegadores que tienen extensiones de fuente de medios o compatibilidad con Flash. Puede implementar una única transmisión HLS, codificar con las API de video HTML5 normales y crear una experiencia de video rápida y de alta calidad en todas las categorías de dispositivos web importantes.

Actualmente, en este momento hay No apoyo para:

  • Pistas alternativas de audio y video
  • Códecs de segmento otro que H.264 con audio AAC
  • Internet Explorer <11

Opciones

Hay varias opciones que puede utilizar para configurar el complemento HLS.

con credenciales

Tipo: boolean

Se puede utilizar como:

  • una opción de fuente
  • una opción de inicialización

Cuando el withCredentials la propiedad se establece en true , todas las solicitudes XHR de manifiestos y segmentos tendrían withCredentials ajustado a true también. Esto permite almacenar y pasar cookies desde el servidor en el que viven los manifiestos y segmentos. Esto tiene algunas implicaciones en CORS porque cuando se establece, el Access-Control-Allow-Origin el encabezado no se puede establecer en * Además, los encabezados de respuesta requieren la adición de Access-Control-Allow-Credentials encabezado que se establece en true. Ver el Artículo de HTML5Rocks para más información.

Puede configurar el complemento mediante la API de administración de reproductores mediante un PATCH método HTTP, como se muestra a continuación:

curl \
    --header "Content-Type: application/json" \
    --user YOUR_EMAIL \
    --request PATCH \
    --data '{ "hls": { "withCredentials": true } }' \
https://players.api.brightcove.com/v2/accounts/YOUR_ACCOUNT_ID/players/YOUR_PLAYER_ID/configuration

También puede configurar el withCredentials opción por fuente, en lugar de por jugador, como se acaba de mostrar. Por ejemplo, al configurar la fuente puede incluir withCredentials , como se muestra aquí:

curl \
  --header "Content-Type: application/json" \
  --user $EMAIL \
  --request POST \
  --data '{
      "name": "MySamplePlayer",
      "configuration": {
        "media": {
          "sources": [{
            "src":"http://solutions.brightcove.com/bcls/assets/videos/Tiger.mp4",
            "type":"video/mp4",
            "withCredentials": true
          }]
        }
      }
    }' \
https://players.api.brightcove.com/v2/accounts/$ACCOUNT_ID/players

Configuración en tiempo de ejecución

Puedes configurar withCredentials en tiempo de ejecución. Verá a continuación dos implementaciones:

  • Utilizando player.hls.xhr.beforeRequest
  • Utilizando player.src()

En el siguiente código está utilizando el player.hls.xhr.beforeRequest para asignar una función que se llamará con un objeto que contiene opciones que se utilizarán para crear el xhr pedido. En este ejemplo solo ves withCredentials se está configurando.

if (videojs.Hls) {
  videojs.Hls.xhr.beforeRequest = function (options) {
    options.withCredentials = true;
  }
}

También puede configurar el withCredentials opciones al configurar la fuente de video. Usas el player.src() método, como se muestra aquí:

player.src({
  src: 'https://adomain.com/bipbop_16x9_variant.m3u8',
  type: 'application/x-mpegURL',
  withCredentials: true
});

enableLowInitialPlaylist

Tipo: boolean

Por defecto: undefined , excepto cuando se visualiza un navegador en un dispositivo Android; entonces se establece en true. Puede cambiar este comportamiento para dispositivos Android, parcheando el reproductor, como se muestra a continuación, con un valor de false.

Se puede utilizar como:

  • una opción de inicialización

Cuándo enableLowInitialPlaylist se establece en verdadero, se utilizará para seleccionar la lista de reproducción con la tasa de bits más baja inicialmente. Esto ayuda a reducir el tiempo de inicio de la reproducción.

Puede configurar el complemento mediante la API de administración de reproductores mediante un PATCH método HTTP, como se muestra a continuación:

curl \
    --header "Content-Type: application/json" \
    --user YOUR_EMAIL \
    --request PATCH \
    --data '{ "hls": { "enableLowInitialPlaylist": true } }' \
https://players.api.brightcove.com/v2/accounts/YOUR_ACCOUNT_ID/players/YOUR_PLAYER_ID/configuration

Propiedades en tiempo de ejecución

En general, puede acceder al objeto HLS de esta manera:

  • Brightcove Player v5: player.hls
  • Brightcove Player v6: player.tech().hls

player.hls.playlists.master

Tipo: object

Un objeto que representa la lista de reproducción principal analizada. Si una lista de reproducción multimedia se carga directamente, se creará una lista de reproducción maestra con una sola entrada.

player.hls.playlists.media

Tipo: function

Una función que se puede utilizar para recuperar o modificar la lista de reproducción multimedia actualmente activa. Se hace referencia a la lista de reproducción multimedia activa cuando es necesario descargar datos de video adicionales. Llamar a esta función sin argumentos devuelve el objeto de lista de reproducción analizado para la lista de reproducción multimedia activa. Llamar a esta función con un objeto de lista de reproducción de la lista de reproducción maestra o una cadena URI como se especifica en la lista de reproducción maestra iniciará una carga asincrónica de la lista de reproducción multimedia especificada. Una vez que se haya recuperado, se convertirá en la lista de reproducción multimedia activa.

player.hls.bandwidth

Tipo: number

El número de bits descargados por segundo en la última descarga de segmento. Este valor es utilizado por la implementación predeterminada de selectPlaylist para seleccionar una tasa de bits adecuada para reproducir. Antes de que se descargue el primer segmento de video, es difícil estimar el ancho de banda con precisión. La tecnología de HLS utiliza una heurística basada en los tiempos de descarga de la lista de reproducción para realizar esta estimación de forma predeterminada. Si tiene una fuente más precisa de información de ancho de banda, puede anular este valor tan pronto como la tecnología de HLS se haya cargado para proporcionar una estimación inicial del ancho de banda.

player.hls.stats.bytesReceived

Tipo: number

El número total de bytes de contenido descargados por el técnico de HLS.

player.hls.selectPlaylist

Tipo: function

Una función que devuelve el objeto de la lista de reproducción multimedia que se utilizará para descargar el siguiente segmento. El complemento lo invoca inmediatamente antes de que se descargue un nuevo segmento. Puede anular esta función para proporcionar su lógica de transmisión adaptativa. Sin embargo, debe asegurarse de devolver un objeto de lista de reproducción multimedia válido que esté presente en player.hls.playlists.master.

Eventos

metadatos cargados

Se activa después de que se descarga la primera lista de reproducción multimedia para una transmisión.

lista de reproducción cargada

Se activa inmediatamente después de descargar una nueva lista de reproducción maestra o multimedia. De forma predeterminada, el complemento solo descarga listas de reproducción cuando son necesarias.

mediachange

Se activa cuando una nueva lista de reproducción se convierte en la lista de reproducción multimedia activa. Tenga en cuenta que el cambio real en la calidad de la reproducción no ocurre simultáneamente con este evento; primero se debe solicitar un nuevo segmento y agotar el búfer existente.

Recargar fuente en caso de error

Cuando se usa el complemento HLS, hay un método al que puede llamar que recargará la fuente en su momento actual cuando el reproductor emita un error. Para activar esta función, debe llamar al reloadSourceOnError() método. El siguiente video corto muestra el método en acción. Todo el código que se muestra en el video se describe más adelante en esta sección.

La sintaxis de la reloadSourceOnError() El método es el siguiente:

reloadSourceOnError(optionsObject)

El opcional optionsObject tiene las siguientes propiedades:

Propiedad Tipo de datos Valor predeterminado Descripción
errorInterval Número 30 La cantidad mínima de tiempo (en segundos) que debe pasar entre dos errores para que se active la recarga. Por ejemplo, si configura el tiempo en 10, cada vez que ocurra un error, la función verificará si se ha realizado una recarga hace menos de 10 segundos. Si ha pasado menos del intervalo de tiempo, NO recargará la fuente. (Esto es para garantizar que el contenido con un error no se recargue constantemente). Si ha pasado más tiempo que el intervalo especificado, el video se vuelve a cargar en el momento en que ocurrió el error.
getSource() Función Recupera la fuente actual Una función a la que se llama para obtener un objeto de origen para cargar o recargar. De forma predeterminada, obtiene la fuente actual del reproductor.

A continuación se detalla el código utilizado en la demostración en video anterior:

  • Líneas 1-9: Código de inserción estándar en la página con un reproductor id adicional.
  • Línea 11: Botón para crear errores manualmente.
  • Líneas 22-24: Función llamada al hacer clic en el botón para enviar un error.
  • Línea 19: Cree un objeto en el que colocar opciones de configuración.
  • Línea 20: En el objeto de configuración, cree un errorInterval propiedad y asígnele un valor.
  • Línea 21: Llama a reloadSourceOnError() método, pasando el objeto de configuración como argumento.
<video-js id="myPlayerID"
  data-video-id="4607746980001"
  data-account="1507807800001"
  data-player="HJLp3Hvmg"
  data-embed="default"
  data-application-id=""
  controls=""
></video-js>

<p><button onclick="createError()">createError</button></p>

<script src="https://players.brightcove.net/1507807800001/HJLp3Hvmg_default/index.min.js"></script>

<script type="text/javascript">
  var createError;
  videojs.getPlayer('myPlayerID').ready(function() {
    var myPlayer = this,
      reloadOptions = {};
    reloadOptions.errorInterval = 10;
    myPlayer.reloadSourceOnError(reloadOptions);
    createError = function(){
      myPlayer.error({code:'2'});
    }
  });
</script>

WebVTT en manifiesto

El complemento HLS admite WebVTT en manifiesto. No es necesario que haga nada para habilitar esta función, ya que es estándar en el complemento. Los videos deben ingerirse teniendo en cuenta WebVTT en el manifiesto. Por ejemplo, Brightcove Dynamic Ingest API puede ingerir videos y configurar subtítulos como en manifiesto. Ver el Descripción general: Dynamic Ingest API para entrega dinámica documento para más detalles.

El siguiente reproductor está reproduciendo un video con subtítulos de WebVTT en manifiesto. Puede seleccionar los subtítulos a través del icono de subtítulos, como se muestra aquí:

mostrar el icono de subtítulos

Después de comenzar el video, podrá elegir los subtítulos que desea ver.

Simplemente para ver, ya que esto es algo que no construiría usted mismo, aquí está el manifiesto del video que se muestra en el reproductor de arriba:

#EXTM3U
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Woofer",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="en",URI="subtitles/en/index.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Woofer (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="en",URI="subtitles/en_forced/index.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Spanish",DEFAULT=NO,AUTOSELECT=YES,FORCED=NO,LANGUAGE="es",URI="subtitles/es/index.m3u8"
#EXT-X-MEDIA:TYPE=SUBTITLES,GROUP-ID="subs",NAME="Spanish (Forced)",DEFAULT=NO,AUTOSELECT=NO,FORCED=YES,LANGUAGE="es",URI="subtitles/es_forced/index.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=865000,CODECS="mp4a.40.2, avc1.42001e",RESOLUTION=640x360,SUBTITLES="subs"
865/prog_index.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=12140000,CODECS="mp4a.40.2, avc1.42001e",RESOLUTION=1280x720,SUBTITLES="subs"
12140/prog_index.m3u8

En él puede ver referencias al archivo de subtítulos.

Conmutación adaptativa

Selección de reproducción HLS

Durante la reproducción, el reproductor cambiará a una interpretación más alta o más baja según un algoritmo. Las entradas de este algoritmo son:

  • Ancho de banda disponible
  • Dimensiones del jugador

Para una discusión completa de la selección de la interpretación, consulte la Determinar qué interpretación se reproducirá documento.

Selección de copias MP4

Si por alguna razón Brightcove Player no puede reproducir fuentes HLS, recurrirá a la reproducción de MP4. En este caso, si ve un video en un dispositivo móvil y reproduce un MP4, el reproductor elegirá el MP4 que tenga una tasa de bits más cercana a 0,5 MB/s. Si está en un dispositivo de escritorio o portátil, elegirá la reproducción MP4 más cercana a 3 MB / s.

Metadatos en banda

Brightcove Player reconocerá ciertos tipos de información de etiquetas ID3 incrustadas en una transmisión de video HLS. El estándar ID3 se usó originalmente para proporcionar metadatos sobre pistas de audio MP3. (El acrónimo es de IDENTIFICACIÓNentificar MP3.) Cuando se encuentra una transmisión con metadatos incrustados, se creará automáticamente una pista de texto de metadatos en banda y se completará con las señales que se encuentren en la transmisión. Un caso de uso común es que los datos ID3 dirigirían cuando los anuncios deberían mostrarse en una transmisión en vivo.

El estándar ID3 define muchos tipos de fotogramas, pero solo los siguientes dos fotogramas codificados en UTF-8 se asignarán a puntos de referencia y sus valores se establecerán como texto de referencia:

  • WXXX: marco de enlace de URL definido por el usuario
  • TXXX: marco de información de texto definido por el usuario

Las señales se crean para todos los demás tipos de cuadros y los datos se adjuntan a la señal generada:

cue.frame.data

Para obtener más información sobre las pistas de texto en general, consulte Introducción al elemento Track. Para obtener información sobre Brightcove Player y puntos de referencia, consulte Visualización de anuncios mediante puntos de inserción de anuncios.

Depuración

La información de esta sección se proporciona para que recopile información que luego pueda pasar a Brightcove Support para ayudar a resolver cualquier problema de HLS. Dicho esto, algunos de los datos informados podrían ser de su interés.

Se detallarán dos métodos y una propiedad que ayudan en la depuración de HLS.

Método: videojs.log.level ()

La videojs.log.level() El método obtiene o establece el nivel de registro actual. Para activar la depuración, usa:

videojs.log.level('debug');

Método: videojs.log.history ()

La history() El método devuelve una matriz que contiene todo lo que se ha registrado en el historial.

Cualquier mensaje que se registre a través del videojs.log La API se agregará al history formación. La información que se coloca en esa matriz depende de qué complementos están en uso que usan la API y del estado del reproductor. Esto significa que el historial puede contener fácilmente información que no sea de HLS. Una pantalla de ejemplo de la consola del history la matriz sigue:

visualización de la consola de la matriz de historial

Si necesita enviar el history matriz para admitir, lo mejor que puede hacer es en la consola escribir lo siguiente:

JSON.stringify(videojs.log.history())

Obtendrá información similar a la que se muestra aquí:

visualización de la consola de la historia en cadena

Copie el JSON que se genera y que luego se puede enviar al soporte.

Propiedad: player.tech (). Hls.stats

Este objeto contiene un resumen de HLS y estadísticas relacionadas con los jugadores. Las propiedades disponibles se muestran en la siguiente tabla:

Nombre de la propiedad Tipo Descripción
banda ancha número Tasa de descarga del último segmento en bits / segundo
tampón gama Lista de rangos de tiempo de contenido que se encuentran en SourceBuffer
fuente actual objeto El objeto fuente; tiene la estructura {src: 'url', type: 'mimetype'}
currentTech cuerda El nombre de la tecnología en uso.
tiempo actual número La posición actual del jugador
duración número Duración del video en segundos
maestro objeto El objeto de la lista de reproducción maestra
mediaBytesTransferred número Número total de bytes de contenido descargados
mediaRequests número Número total de solicitudes de segmentos de medios
mediaRequestsAborted número Número total de solicitudes de segmentos de medios anuladas
mediaRequestsErrored número Número total de solicitudes de segmentos de medios con errores
mediaRequestsTimeout número Número total de solicitudes de segmentos de medios agotadas
mediaSecondsLoaded número Número total de segundos de contenido descargados
mediaTransferDuration número Tiempo total dedicado a descargar segmentos de medios en milisegundos
playerDimensions objeto Contiene el ancho y la altura del reproductor.
buscable gama Lista de rangos de tiempo que el jugador puede buscar
marca de tiempo número Marca de tiempo de cuando hls.stats se accedió
videoPlaybackQuality objeto Métricas de calidad de reproducción de medios según lo especificado por el API de calidad de reproducción de medios del W3C

Una pantalla de ejemplo de la consola del stats el objeto sigue:

visualización de la consola del objeto de estadísticas

Ejemplo de código

Si desea experimentar con estas funciones de depuración, el código basado en lo siguiente puede servir como punto de partida:

<video-js id="myPlayerID" data-video-id="5622718636001"
  data-account="1507807800001"
  data-player="SkxERgnQM"
  data-embed="default"
  data-application-id=""
  controls=""
  width="640"
  height="360"></video-js>
<script src="https://players.brightcove.net/1507807800001/SkxERgnQM_default/index.min.js"></script>

<script type="text/javascript">
  videojs.getPlayer('myPlayerID').ready(function() {
    var myPlayer = this;

    videojs.log.level('debug');

    myPlayer.on('ended', function(){
      console.log('videojs.log.history(): ', videojs.log.history());
      console.log('videojs.log.level(): ', videojs.log.level());
      console.log('videojs.hls.stats: ', player.tech().hls.stats);
    });
  });
</script>

608 subtítulos

El complemento HLS de Brightcove admite 608 subtítulos. Los subtítulos 608, también conocidos como subtítulos CEA-608, subtítulos EIA-608 y subtítulos de la Línea 21, son un estándar para subtítulos para transmisiones analógicas de TV NTSC en los Estados Unidos y Canadá. Los 608 subtítulos se pueden insertar en una transmisión en vivo donde se mezclan en el HLS ' ts archivos (flujo de transporte).

Problemas de hospedaje

A diferencia de una implementación nativa de HLS, el complemento HLS debe cumplir con las políticas de seguridad del navegador. Eso significa que todos los archivos que componen la transmisión deben entregarse desde el mismo dominio que la página que aloja el reproductor de video o desde un servidor que tenga los Encabezados CORS configurado. Fácil las instrucciones están disponibles para servidores web populares y la mayoría de los CDN no deberían tener problemas para activar CORS en su cuenta.

Errores

Los errores durante la reproducción de HLS se informarán utilizando el tipo APPEND_BUFFER_ERR. El mensaje será lo que se recupere del error nativo del navegador. Por ejemplo, Se ha superado la cuota.

Registro de cambios

HLS ahora está integrado en el reproductor y los cambios en la funcionalidad del complemento se informarán en las notas de la versión de Brightcove Player.

Para obtener notas de la versión histórica, consulte la registro de cambios aquí.