DASH Streaming y listas de reproducción

Este tema explica cómo configurar trabajos para salida DASH.

Introducción

Debido a que DASH no es un formato de video específico, códec o formato de empaquetado independiente de datos (como Zip), hemos introducido una nueva opción llamada streaming_delivery_formatpara especificar que los archivos multimedia deben estar estructurados / formateados de acuerdo con un estándar particular. Seleccionando "guión" como el streaming_delivery_format modificará algunas opciones predeterminadas para la compatibilidad con DASH, además de colocar los archivos multimedia de salida en una estructura de directorio consistente con los requisitos de DASH. Las salidas de medios DASH también deben tener type establecido en "segmentado", para garantizar que los medios estén preparados para la transmisión DASH.

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "streaming_delivery_format": "dash",
        "video_bitrate": 700,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/sbr/rendition.mpd"
    }
    ]
}

Detalles para salidas con streaming_delivery_format establecido en "guión":

Estructura de archivo para salidas DASH segmentadas:

  • La mpd El archivo de manifiesto estará en el nivel raíz de la salida.
  • Cada uno de los medios de audio y vídeo tendrá su propio subdirectorio:audio/und" " y "video/1" respectivamente.
  • En cada uno de estos directorios habrá un "init.mp4" con los datos de inicialización.
  • Los datos multimedia se incluirán en archivos denominadosseg-N.m4f" " (donde N comienza en cero y aumenta para cada segmento).

Salidas DASH con el streaming_delivery_profile establecido en "on_demand" utilizará archivos multimedia fragmentados en lugar de segmentos:

  • La mpd El archivo de manifiesto estará en el nivel raíz de la salida.
  • Los medios de audio y video serán cada uno un solo archivo en el mismo directorio que el manifiesto.
  • Los archivos multimedia se nombrarán de manera similar al manifiesto, pero con "-audio " o "-video "sufijos agregados, según corresponda.

Configuraciones DASH compatibles:

  • Formatos admitidos: m4f y webm
  • Codecs de vídeo compatibles: h264 hevc, vp8, y vp9
  • Codecs de audio compatibles: aac ac3, eac3, y vorbis
  • Los resultados en formatowebm" " actualmente solo admiten el «on_demand» streaming_delivery_profile
  • Las salidas en formatowebm" " actualmente no admiten DRM

Varias tasas de bits

Las salidas DASH generadas por Zencoder tendrán la estructura necesaria para reproducirse por sí mismas, pero para beneficiarse realmente de estas opciones de transmisión de transmisión, debe generar varias versiones con diferentes velocidades de bits (representaciones) junto con una salida de tipo "lista de reproducción" que enumere las representaciones. para que un jugador pueda cambiar la velocidad de bits hacia arriba o hacia abajo según sea necesario según las condiciones actuales de la red. La salida de la lista de reproducción es una salida dependiente, es decir, hará referencia a las otras salidas por su etiqueta y utilizará los datos de esas salidas para generar la interpretación final de la lista de reproducción. Tenga en cuenta que debe tener cuidado de establecer las rutas de transmisión en la salida de la lista de reproducción para que sean rutas relativas a la ubicación de los archivos de reproducción.

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "label": "dash-1200",
        "streaming_delivery_format": "dash",
        "video_bitrate": 1200,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/1200k/rendition.mpd"
    },
    {
        "label": "dash-700",
        "streaming_delivery_format": "dash",
        "video_bitrate": 700,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/700k/rendition.mpd"
    },
    {
        "label": "dash-400",
        "streaming_delivery_format": "dash",
        "video_bitrate": 400,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/400k/rendition.mpd"
    },
    {
        "streaming_delivery_format": "dash",
        "type": "playlist",
        "url": "s3://mybucket/dash-examples/mbr/manifest.mpd",
        "streams": [
        { "source": "dash-1200", "path": "1200k" },
        { "source": "dash-700",  "path": "700k" },
        { "source": "dash-400",  "path": "400k" }
        ]
    }
    ]
}

Cifrado

Zencoder también admite la generación de salidas DASH cifradas con CENC, con los encabezados necesarios para la integración con los servidores de licencias Marlin o Playready. Para cada salida, simplemente especifique un hash de opciones drm, que incluye method, key_id, y content_key. La key_id y content_key debe obtenerse de su proveedor de DRM o generarse previamente y enviarse a su proveedor de DRM. Una vez que tenga esas claves, la estructura de la API de Zencoder para una única interpretación es:

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "streaming_delivery_format": "dash",
        "video_bitrate": 700,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/sbr/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    }
    ]
}

El contenido se cifrará con el content_key, y el archivo de .mpd manifiesto incluirá el key_id en sus encabezados. Sin embargo, para garantizar que esta salida se pueda reproducir, también necesita encabezados que especifiquen cómo recuperar la content_key. En una codificación DASH de tasa de bits múltiple, estos encabezados solo deben agregarse a la salida de la lista de reproducción, pero también se pueden agregar a cada interpretación, por lo que la reproducción se puede reproducir individualmente. Esto se hace agregando uno o más esquemas DRM:


    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "streaming_delivery_format": "dash",
        "video_bitrate": 700,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/sbr/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0",
            "schemas": [
            { "type": "marlin" },
            { "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
            ]
        }
    }
    ]
}

Luego, podemos unir esto para crear un trabajo DASH cifrado con DRM de tasa de bits múltiple:

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "label": "dash-1200",
        "streaming_delivery_format": "dash",
        "video_bitrate": 1200,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/1200k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "label": "dash-700",
        "streaming_delivery_format": "dash",
        "video_bitrate": 700,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/700k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "label": "dash-400",
        "streaming_delivery_format": "dash",
        "video_bitrate": 400,
        "type": "segmented",
        "url": "s3://mybucket/dash-examples/mbr/400k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "streaming_delivery_format": "dash",
        "type": "playlist",
        "url": "s3://mybucket/dash-examples/mbr/manifest.mpd",
        "streams": [
        { "source": "dash-1200", "path": "1200k" },
        { "source": "dash-700",  "path": "700k" },
        { "source": "dash-400",  "path": "400k" }
        ],
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0",
            "schemas": [
            { "type": "marlin" },
            { "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
            ]
        }
    }
    ]
}

Transmutación

Por supuesto, generar múltiples formatos de un video puede resultar costoso y derrochador. Por lo tanto, Zencoder admite el reempaquetado de las mismas transmisiones codificadas en diferentes formatos (llamado transmuxing), utilizando el copy_video y copy_audio opciones. Las salidas para las que el vídeo se transmuxa en lugar de codificarse se cobran a 1/4 de la duración normal. Entonces, si planea crear múltiples formatos del mismo video (MP4, HLS y DASH, por ejemplo), puede codificar la versión MP4 de cada tasa de bits primero y luego transmutar esas salidas para crear las versiones HLS y DASH. (Tenga en cuenta que no admitimos la transmisión desde un formato segmentado, ya que el video ya no es una transmisión única).

Para garantizar que el MP4 se prepare de acuerdo con las restricciones de los formatos de streaming segmentados posteriores, utilice también la prepare_for_segmenting opción de la salida MP4. Esto controlará los valores predeterminados para los fotogramas clave y los subtítulos al codificar la transmisión de video del MP4 para garantizar que sea compatible con la conversión a formatos segmentados posteriormente.

El uso del MP4 como fuente para las salidas transmuxed funciona de manera similar a las salidas de la lista de reproducción. Especifica una opción de origen que coincide con la etiqueta de otra salida, pero esta vez es parte de las opciones de nivel principal para la salida en lugar de en el hash de las secuencias.

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "label": "mp4-700k",
        "prepare_for_segmenting": ["hls", "dash"],
        "video_bitrate": 700,
        "url": "s3://mybucket/transmux-examples/sbr/video.mp4"
    },
    {
        "source": "mp4-700k",
        "copy_video": true,
        "copy_audio": true,
        "type": "segmented",
        "url": "s3://mybucket/transmux-examples/sbr/hls/video.m3u8"
    },
    {
        "source": "mp4-700k",
        "copy_video": true,
        "copy_audio": true,
        "streaming_delivery_format": "dash",
        "type": "segmented",
        "url": "s3://mybucket/transmux-examples/sbr/dash/video.mpd"
    }
    ]
}

Optimización para la entrega

Dado que DASH está diseñado para la entrega de transmisión, recomendamos controlar los picos de las tasas de bits en cada interpretación para evitar que el reproductor vuelva a almacenar en búfer o cambie innecesariamente a codificaciones de tasas de bits más bajas. Las opciones que controlan la variabilidad del flujo codificado de acuerdo con lo que el decodificador / reproductor puede manejar son

Nuestra recomendación general es establecer decoder_bitrate_cap a la tasa de bits máxima disponible para la transmisión de video. Recuerde que debe tener en cuenta el audio, así como un poco de sobrecarga para el formato del archivo. La decoder_buffer_size se supone técnicamente que coincide con la memoria de búfer de vídeo disponible en el dispositivo de decodificación, pero a menudo se utiliza mejor para controlar la cantidad de contenido que se puede almacenar previamente en búfer. Funciona como múltiplo de los decoder_bitrate_cap, por ejemplo, si decoder_bitrate_cap era 500 (Kilobits por segundo), y decoder_buffer_size era 1000 (Kilobits), luego el búfer podía almacenar 2 segundos de vídeo. También recomendamos configurar el video_bitrate un poco más bajo que el decoder_bitrate_cap, lo que permite que el codificador para utilizar más datos para codificar escenas complejas y menos datos en escenas más sencillas. Un punto de partida decente sería asumir hasta un 10% de sobrecarga para el formato de archivo, estableciendo el video_bitrate 10% más bajo que el decoder_bitrate_cap y permitir que se almacenen en búfer aproximadamente 1,5 segundos de vídeo.

Suponiendo que hay una conexión de 1000 Kbps disponible para el cliente:

  • 1000 x 0,90 = 900 Kbps disponibles tras restar un 10% para la sobrecarga de formato.
  • 900-128 = 772 Kbps de video decoder_bitrate_cap después de restar 128 Kbps para el audio.
  • 772 * 1,5 = 1158 KB decoder_buffer_size (para 1,5 segundos de vídeo).
  • 772 * 0,90 = velocidad de bits de vídeo objetivo de 695 Kbps (10% inferior a la decoder_bitrate_cap).

Entonces, para un ejemplo de codificación de transmisión más correcto:

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "label": "mp4-1000k",
        "prepare_for_segmenting": ["hls", "dash"],
        "audio_bitrate": 128,
        "decoder_bitrate_cap": 772,
        "decoder_buffer_size": 1158,
        "video_bitrate": 695,
        "url": "s3://mybucket/transmux-examples/sbr/video.mp4"
    },
    {
        "source": "mp4-1000k",
        "copy_video": true,
        "copy_audio": true,
        "type": "segmented",
        "url": "s3://mybucket/transmux-examples/sbr/hls/video.m3u8"
    },
    {
        "source": "mp4-1000k",
        "copy_video": true,
        "copy_audio": true,
        "streaming_delivery_format": "dash",
        "type": "segmented",
        "url": "s3://mybucket/transmux-examples/sbr/dash/video.mpd"
    }
    ]
}

Poniendolo todo junto

{
    "input": "http://s3.amazonaws.com/zencodertesting/test.mov",
    "outputs": [
    {
        "label": "mp4-1500k",
        "prepare_for_segmenting": ["hls", "dash"],
        "audio_bitrate": 128,
        "decoder_bitrate_cap": 1222,
        "decoder_buffer_size": 1833,
        "video_bitrate": 1100,
        "size": "1280x720",
        "url": "s3://mybucket/full-examples/mp4/1500.mp4"
    },
    {
        "label": "mp4-1000k",
        "prepare_for_segmenting": ["hls", "dash"],
        "audio_bitrate": 128,
        "decoder_bitrate_cap": 772,
        "decoder_buffer_size": 1158,
        "video_bitrate": 695,
        "size": "960x540",
        "url": "s3://mybucket/full-examples/mp4/1000.mp4"
    },
    {
        "label": "mp4-500k",
        "prepare_for_segmenting": ["hls", "dash"],
        "audio_bitrate": 128,
        "decoder_bitrate_cap": 322,
        "decoder_buffer_size": 483,
        "video_bitrate": 290,
        "size": "640x360",
        "url": "s3://mybucket/full-examples/mp4/500.mp4"
    },
    {
        "label": "hls-1500k",
        "source": "mp4-1500k",
        "copy_video": true,
        "copy_audio": true,
        "type": "segmented",
        "url": "s3://mybucket/full-examples/hls/1500.m3u8"
    },
    {
        "label": "hls-1000k",
        "source": "mp4-1000k",
        "copy_video": true,
        "copy_audio": true,
        "type": "segmented",
        "url": "s3://mybucket/full-examples/hls/1000.m3u8"
    },
    {
        "label": "hls-500k",
        "source": "mp4-500k",
        "copy_video": true,
        "copy_audio": true,
        "type": "segmented",
        "url": "s3://mybucket/full-examples/hls/500.m3u8"
    },
    {
        "type": "playlist",
        "url": "s3://mybucket/full-examples/hls/multi_bitrate_playlist.m3u8",
        "streams": [
        { "path": "1000.m3u8", "source": "hls-1000k" },
        { "path": "1500.m3u8", "source": "hls-1500k" },
        { "path": "500.m3u8", "source": "hls-500k" }
        ]
    },
    {
        "label": "dash-1500k",
        "source": "mp4-1500k",
        "copy_video": true,
        "copy_audio": true,
        "streaming_delivery_format": "dash",
        "type": "segmented",
        "url": "s3://mybucket/full-examples/dash/1500k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "label": "dash-1000k",
        "source": "mp4-1000k",
        "copy_video": true,
        "copy_audio": true,
        "streaming_delivery_format": "dash",
        "type": "segmented",
        "url": "s3://mybucket/full-examples/dash/1000k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "label": "dash-500k",
        "source": "mp4-500k",
        "copy_video": true,
        "copy_audio": true,
        "streaming_delivery_format": "dash",
        "type": "segmented",
        "url": "s3://mybucket/full-examples/dash/500k/rendition.mpd",
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0"
        }
    },
    {
        "streaming_delivery_format": "dash",
        "type": "playlist",
        "url": "s3://mybucket/full-examples/dash/manifest.mpd",
        "streams": [
            { "source": "dash-1500k", "path": "1500k" },
            { "source": "dash-1000k", "path": "1000k" },
            { "source": "dash-500k",  "path": "500k" }
        ],
        "drm": {
            "method": "cenc",
            "key_id": "d57d416ccd454d5a08d05bff0742ee76",
            "content_key": "f15cae8f4e48a023056e1960ff2228b0",
            "schemas": [
                { "type": "marlin" },
                { "type": "playready", "license_acquisition_url": "https://playready.example.com/license_server/" }
            ]
        }
    }
    ]
}