Streaming y listas de reproducción de HLS

La transmisión en vivo de HTTP facilita la adaptación de su transmisión de video o audio a un usuario en función de su ancho de banda disponible, cambiando entre transmisiones en mitad de la reproducción a medida que cambia la velocidad de transferencia. Reunir todas las piezas puede ser confuso, por lo que le mostraremos cómo crear algunos archivos segmentados simples para diferentes anchos de banda y una lista de reproducción para proporcionar a los usuarios en dispositivos iOS para que puedan reproducirlos.

Archivos segmentados

Comenzaremos creando varios archivos segmentados, cada uno dirigido a un ancho de banda determinado. Con estas salidas, Zencoder crea un archivo de manifiesto y archivos de video segmentados, que permiten al jugador descargar cada archivo individualmente mientras reproduce el video.

{
    "audio_bitrate": 56,
    "audio_sample_rate": 22050,
    "base_url": "s3://my-bucket/",
    "decoder_bitrate_cap": 900,
    "decoder_buffer_size": 2400,
    "filename": "file-640k.m3u8",
    "max_frame_rate": 30,
    "public": 1,
    "type": "segmented",
    "video_bitrate": 600,
    "width": 400,
    "format": "ts"
}

La m3u8 El archivo creado por la salida anterior es un archivo segmentado. Solicitar esta salida, además de las otras que se describen a continuación, creará varios archivos segmentados destinados a diferentes anchos de banda.

Esta salida tiene un tipo de "segmentado", un formato de "ts" y por defecto un códec de video de "h264". Cada salida segmentada tendrá un archivo de manifiesto en formato M3U8 creado como salida principal, y los segmentos se nombrarán como el nombre de archivo de la salida. Los archivos segmentados se cargarán junto con el manifiesto y se nombrarán con los sufijos "-00001" antes de la extensión. Estas salidas se pueden utilizar tal cual para la transmisión estándar, simplemente haciendo referencia al archivo.m3u8 del cliente y garantizando que los archivos de segmento estén disponibles desde la misma ubicación que el manifiesto. Una lista de reproducción también puede hacer referencia a varios archivos.m3u8 para admitir la transmisión adaptativa.

La lista de reproducción

Puede crear listas de reproducción con tasa de bits adaptativa usted mismo o hacer que Zencoder lo haga como parte de un trabajo. Para que creemos la lista de reproducción, simplemente agregue otra salida a su trabajo con un tipo de "lista de reproducción" y especifique una o más transmisiones con una ruta (que sea relativa a la ubicación del archivo de la lista de reproducción) y la fuente de la transmisión, que es la etiqueta de la salida correspondiente. También se pueden especificar el ancho de banda, la resolución y el códec, pero de forma predeterminada se infieren de la fuente. La información de la transmisión se formateará en una lista de reproducción y se cargará como cualquier otra salida.

Este archivo de lista de reproducción hace referencia a las salidas segmentadas creadas anteriormente, especificando el ancho de banda en el que se debe reproducir cada una. La carga de este archivo con un dispositivo que admita HLS permitirá que la transmisión se ajuste a medida que cambie el ancho de banda disponible.

La primera entrada de las secuencias se utilizará cuando un usuario abra el archivo y se utilizará como parte de una prueba para determinar qué secuencia es la más apropiada. El orden de las otras entradas es irrelevante.

Salidas HLS (con video) que tienen max_hls_protocol_version de 4 o más ahora generará una lista de reproducción I-Frame, también conocida como "manifiesto de fotogramas clave". De forma predeterminada, el nombre del archivo es el mismo que el del archivo de manifiesto principal, pero con "-iframe-index" adjunto. Por ejemplo, para un manifiesto con el nombre de archivo "master.m3u8", el manifiesto de fotogramas clave se llamaría "master-iframe-index.m3u8". Esto se puede anular usando keyframe_manifest_filename. Si la salida de una lista de reproducción de HLS especifica una transmisión "fuente" que tiene un manifiesto de fotogramas clave, ese manifiesto de fotogramas clave se incluirá automáticamente en la lista de reproducción como una transmisión EXT-XI-FRAMES-ONLY.

{
    "base_url": "s3://my-bucket/",
    "filename": "playlist.m3u8",
    "public": 1,
    "streams": [
    {
        "bandwidth": 440,
        "path": "file-440k.m3u8"
    },
    {
        "bandwidth": 640,
        "path": "file-640k.m3u8"
    },
    {
        "bandwidth": 240,
        "path": "file-240k.m3u8"
    },
    {
        "bandwidth": 150,
        "path": "file-150k.m3u8"
    },
    {
        "bandwidth": 64,
        "path": "file-64k.m3u8"
    }
    ],
    "type": "playlist"
}

La imágen completa

La lista de reproducción puede especificar y hacer referencia a múltiples salidas de diferentes velocidades de bits. Estos ajustes coinciden con las pautas dadas en nuestra Guía de codificación de iOS.

{
    "input": "s3://zencodertesting/test.mov",
    "output": [
    {
        "label": "hls-64",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "filename": "file-64k.m3u8",
        "format": "aac",
        "public": 1,
        "type": "segmented"
    },
    {
        "label": "hls-240",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 300,
        "decoder_buffer_size": 800,
        "filename": "file-240k.m3u8",
        "max_frame_rate": 15,
        "public": 1,
        "type": "segmented",
        "video_bitrate": 200,
        "width": 400,
        "format": "ts"
    },
    {
        "label": "hls-440",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 600,
        "decoder_buffer_size": 1600,
        "filename": "file-440k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 400,
        "width": 400,
        "format": "ts"
    },
    {
        "label": "hls-640",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 900,
        "decoder_buffer_size": 2400,
        "filename": "file-640k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 600,
        "width": 480,
        "format": "ts"
    },
    {
        "label": "hls-1040",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 1500,
        "decoder_buffer_size": 4000,
        "filename": "file-1040k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 1000,
        "width": 640,
        "format": "ts"
    },
    {
        "label": "hls-1540",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 2250,
        "decoder_buffer_size": 6000,
        "filename": "file-1540k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 1500,
        "width": 960,
        "format": "ts"
    },
    {
        "label": "hls-2040",
        "audio_bitrate": 56,
        "audio_sample_rate": 22050,
        "base_url": "s3://my-bucket/",
        "decoder_bitrate_cap": 3000,
        "decoder_buffer_size": 8000,
        "filename": "file-2040k.m3u8",
        "public": 1,
        "type": "segmented",
        "video_bitrate": 2000,
        "width": 1024,
        "format": "ts"
    },
    {
        "base_url": "s3://my-bucket/",
        "filename": "playlist.m3u8",
        "public": 1,
        "streams": [
        {
            "source": "hls-2040",
            "path": "file-2040k.m3u8"
        },
        {
            "source": "hls-1540",
            "path": "file-1540k.m3u8"
        },
        {
            "source": "hls-1040",
            "path": "file-1040k.m3u8"
        },
        {
            "source": "hls-640",
            "path": "file-640k.m3u8"
        },
        {
            "source": "hls-440",
            "path": "file-440k.m3u8"
        },
        {
            "source": "hls-240",
            "path": "file-240k.m3u8"
        },
        {
            "source": "hls-64",
            "path": "file-64k.m3u8"
        }
        ],
        "type": "playlist"
    }
    ]
}

NOTAS

  • La generación de la lista de reproducción actualmente no usa información de las otras salidas en el trabajo, pero es simplemente una forma de generar fácilmente una lista de reproducción con tasa de bits adaptativa formateada correctamente y cargarla junto con los otros archivos.
  • Si bien los dispositivos iOS reproducirán la lista de reproducción de tasa de bits adaptativa creada, VLC no lo hará, debido a errores en el manejo de URL relativas. Buscará los archivos de segmento en el mismo directorio que el archivo de la lista de reproducción, en lugar del directorio del archivo de manifiesto.
  • decoder_bitrate_cap se establece en 1,5 veces la velocidad de bits objetivo del archivo. decoder_buffer_size se establece en 3,5 veces a 5 veces la velocidad de bits objetivo del archivo. Esta configuración ayudará a mantener una tasa de bits constante en todo el archivo, de modo que los segmentos segmentados no varíen demasiado en tamaño y tasa de bits.
  • Si una salida segmentada se carga en un almacenamiento temporal, se cargará como Archivo ZIP.