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_format
para 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":
fixed_keyframe_interval
se establecerá en verdadero.segment_seconds
predeterminado a 2.- El formato predeterminado será
m4f
(con unmpd
archivo de manifiesto)
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 denominados
seg-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
ywebm
- Codecs de vídeo compatibles:
h264
hevc
,vp8
, yvp9
- Codecs de audio compatibles:
aac
ac3
,eac3
, yvorbis
- Los resultados en formato
webm
" " actualmente solo admiten el «on_demand»streaming_delivery_profile
- Las salidas en formato
webm
" " 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/" }
]
}
}
]
}