Einleitung
Da DASH kein bestimmtes Videoformat, Codec oder datenunabhängiges Verpackungsformat (z. B. Zip) ist, haben wir eine neue Option mit dem Namen eingeführt streaming_delivery_format
um festzulegen, dass die Mediendateien nach einem bestimmten Standard strukturiert / formatiert werden sollen. Wählen Sie "Strich" als streaming_delivery_format
ändert einige Standardoptionen für die Kompatibilität mit DASH und legt die Ausgabemediendateien in einer Verzeichnisstruktur ab, die den DASH-Anforderungen entspricht. DASH-Medienausgänge müssen ebenfalls vorhanden sein type
Stellen Sie "segmentiert" ein, um sicherzustellen, dass das Medium für das DASH-Streaming vorbereitet ist.
{
"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"
}
]
}
Details für Ausgänge mit streaming_delivery_format
auf "dash" setzen:
fixed_keyframe_interval
wird auf true gesetzt.segment_seconds
wird standardmäßig auf 2 gesetzt.- Das Standardformat ist
m4f
(mit einemmpd
Manifestdatei)
Dateistruktur für segmentierte DASH-Ausgaben:
- Das
mpd
Die Manifestdatei befindet sich auf der Stammebene der Ausgabe. - Die Audio- und Videomedien haben jeweils ein eigenes Unterverzeichnis -
audio/und
"video/1
" bzw. „. - In jedem dieser Verzeichnisse wird es ein "
init.mp4
" mit den Initialisierungsdaten geben. - Die Mediendaten befinden sich in Dateien mit dem Namen "
seg-N.m4f
" (wobei N bei Null beginnt und für jedes Segment zunimmt).
DASH gibt mit dem aus streaming_delivery_profile
Bei der Einstellung "on_demand" werden fragmentierte Mediendateien anstelle von Segmenten verwendet:
- Das
mpd
Die Manifestdatei befindet sich auf der Stammebene der Ausgabe. - Die Audio- und Videomedien sind jeweils eine einzelne Datei im selben Verzeichnis wie das Manifest.
- Die Mediendateien werden ähnlich wie das Manifest benannt, aber gegebenenfalls werden Suffixe
-audio
-video
" oder" hinzugefügt.
Unterstützte DASH-Konfigurationen:
- Unterstützte Formate:
m4f
undwebm
- Unterstützte Videocodecs:
h264
hevc
,vp8
, undvp9
- Unterstützte Audio-Codecs:
aac
ac3
,eac3
, undvorbis
- Ausgaben im "
webm
" -Format unterstützen derzeit nur das „on_demand“streaming_delivery_profile
- Ausgänge im "
webm
" -Format unterstützen derzeit kein DRM
Mehrere Bitrate
Von Zencoder generierte DASH-Ausgaben haben die erforderliche Struktur, um selbst abgespielt zu werden. Um jedoch wirklich von solchen Streaming-Übermittlungsoptionen zu profitieren, sollten Sie mehrere Versionen mit unterschiedlichen Bitraten (Wiedergaben) zusammen mit einer Ausgabe vom Typ "Wiedergabeliste" generieren, in der die Wiedergaben aufgelistet sind so dass ein Spieler die Bitraten je nach den aktuellen Netzwerkbedingungen nach Bedarf hoch- / runterschalten kann. Die Wiedergabelistenausgabe ist eine abhängige Ausgabe. Das heißt, sie verweist auf die anderen Ausgaben anhand ihrer Bezeichnung und verwendet Daten aus diesen Ausgaben, um die endgültige Wiedergabe der Wiedergabeliste zu generieren. Beachten Sie, dass Sie darauf achten müssen, die Stream-Pfade in der Wiedergabelistenausgabe so festzulegen, dass sie relative Pfade zum Speicherort der Wiedergabedateien sind.
{
"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" }
]
}
]
}
Verschlüsselung
Zencoder unterstützt auch das Generieren von CENC-verschlüsselten DASH-Ausgaben mit den erforderlichen Headern für die Integration in Marlin- oder Playready-Lizenzserver. Geben Sie für jede Ausgabe einfach einen Hash von drm-Optionen an, einschließlich der method
key_id
und content_key
. Das key_id
und content_key
sollte entweder von Ihrem DRM-Anbieter abgerufen oder vorgeneriert und an Ihren DRM-Anbieter gesendet werden. Sobald Sie diese Schlüssel haben, lautet die Zencoder-API-Struktur für eine einzelne Wiedergabe:
{
"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"
}
}
]
}
Der Inhalt wird mit dem verschlüsselt content_key
, und die .mpd
Manifestdatei enthält die key_id
in seinen Headern. Um sicherzustellen, dass diese Ausgabe wiedergegeben werden kann, sind außerdem Header erforderlich, die angeben, wie die Ausgabe abgerufen werden soll content_key
. Bei einer DASH-Codierung mit mehreren Bitraten müssen diese Header nur zur Wiedergabelistenausgabe hinzugefügt werden, können aber auch zu jeder Wiedergabe hinzugefügt werden, sodass die Wiedergabe einzeln abspielbar ist. Dies erfolgt durch Hinzufügen eines oder mehrerer DRM-Schemas:
"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/" }
]
}
}
]
}
Wir können dies dann zusammenfassen, um einen DRM-verschlüsselten DASH-Job mit mehreren Bitraten zu erstellen:
{
"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/" }
]
}
}
]
}
Transmuxing
Das Generieren mehrerer Formate eines Videos kann natürlich teuer und verschwenderisch werden. Daher unterstützt Zencoder das Umpacken derselben codierten Streams in verschiedene Formate (Transmuxing genannt) mithilfe von copy_video
und copy_audio
Optionen. Ausgänge, für die das Video nicht codiert, sondern transmuxiert wird, werden mit 1/4 der regulären Dauer aufgeladen. Wenn Sie also mehrere Formate desselben Videos erstellen möchten (z. B. MP4, HLS und DASH), können Sie zuerst die MP4-Version jeder Bitrate codieren und diese Ausgänge dann übertragen, um die HLS- und DASH-Versionen zu erstellen. (Beachten Sie, dass wir das Transmuxen von einem segmentierten Format nicht unterstützen, da das Video kein einzelner Stream mehr ist.)
Um sicherzustellen, dass der MP4 gemäß den Einschränkungen der nachfolgenden segmentierten Streaming-Formate vorbereitet wird, verwenden Sie auch die prepare_for_segmenting
Option für den MP4-Ausgang. Dadurch werden die Standardwerte für Keyframes und Untertitel beim Codieren des Videostreams des MP4 gesteuert, um sicherzustellen, dass er anschließend mit der Übertragung in segmentierte Formate kompatibel ist.
Die Verwendung des MP4 als Quelle für die Transmux-Ausgänge funktioniert ähnlich wie die Wiedergabelistenausgänge. Sie geben eine Quelloption an, die mit der Bezeichnung einer anderen Ausgabe übereinstimmt. Diesmal ist sie jedoch Teil der Optionen auf Hauptebene für die Ausgabe und nicht im Stream-Hash.
{
"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"
}
]
}
Optimierung für die Lieferung
Da DASH für die Streaming-Übermittlung vorgesehen ist, empfehlen wir, die Spitzen der Bitraten in jeder Wiedergabe zu steuern, um zu vermeiden, dass der Player erneut puffert oder auf Codierungen mit niedrigerer Bitrate umschaltet. Die Optionen, die die Variabilität des codierten Streams je nach dem steuern, was der Decoder/Player handhaben kann, sind
Unsere allgemeine Empfehlung ist zu setzen decoder_bitrate_cap
auf die maximal für den Videostream verfügbare Bitrate. Denken Sie daran, dass Sie das Audio sowie einen gewissen Overhead für das Dateiformat berücksichtigen müssen. Das decoder_buffer_size
soll technisch mit dem verfügbaren Videopufferspeicher auf dem Decodiergerät übereinstimmen, wird jedoch häufig besser verwendet, um zu steuern, wie viel Inhalt vorgepuffert werden kann. Es funktioniert als Vielfaches der decoder_bitrate_cap
, so dass zum Beispiel bei decoder_bitrate_cap
500 (Kilobits pro Sekunde) und decoder_buffer_size
war 1000 (Kilobits), dann konnte der Puffer Video im Wert von 2 Sekunden speichern. Wir empfehlen auch die Einstellung der video_bitrate
etwas niedriger als die decoder_bitrate_cap
Dadurch kann der Encoder mehr Daten zum Codieren komplexer Szenen und weniger Daten für einfachere Szenen verwenden. Ein anständiger Ausgangspunkt wäre, bis zu 10% des Overheads für das Dateiformat anzunehmen und das festzulegen video_bitrate
10% niedriger als die decoder_bitrate_cap
und das Puffern von ca. 1,5 Sekunden Video.
Angenommen, dem Kunden steht eine 1000-Kbit / s-Verbindung zur Verfügung:
- 1000 * 0,90 = 900 Kbit / s verfügbar, nachdem 10% für den Format-Overhead abgezogen wurden.
- 900 - 128 = 772 Kbit / s Video
decoder_bitrate_cap
nach dem Subtrahieren von 128 Kbit / s für das Audio. - 772 * 1,5 = 1158 Kb
decoder_buffer_size
(für Videos im Wert von 1,5 Sekunden). - 772 * 0,90 = 695 Kbit / s Zielvideobitrate (10% niedriger als die
decoder_bitrate_cap
).
Für ein korrekteres Beispiel für eine Streaming-Codierung:
{
"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"
}
]
}
Alles zusammenfügen
{
"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/" }
]
}
}
]
}