DASH-Streaming und Playlists

In diesem Thema wird erläutert, wie Sie Aufträge für die DASH-Ausgabe konfigurieren.

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_formatum 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:

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 und webm
  • Unterstützte Videocodecs: h264 hevc, vp8, und vp9
  • Unterstützte Audio-Codecs: aac ac3, eac3, und vorbis
  • 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/" }
            ]
        }
    }
    ]
}