DASH Streaming et listes de lecture

Cette rubrique explique comment configurer les travaux pour la sortie DASH.

Introduction

Étant donné que DASH n'est pas un format vidéo, un codec ou un format d'emballage indépendant des données (tel que Zip), nous avons introduit une nouvelle option nommée streaming_delivery_formatpour spécifier que les fichiers multimédias doivent être structurés / formatés selon une norme particulière. En sélectionnant "tiret" comme streaming_delivery_format modifiera certaines options par défaut pour la compatibilité avec DASH, et placera les fichiers multimédias de sortie dans une structure de répertoires conforme aux exigences de DASH. Les sorties multimédia DASH doivent également type réglé sur "segmenté", pour garantir que le média est préparé pour la diffusion 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"
    }
    ]
}

Détails des sorties avec streaming_delivery_format défini sur "tiret":

Structure de fichiers pour les sorties DASH segmentées :

  • Le fichier mpd manifeste se trouve au niveau racine de la sortie.
  • Les supports audio et vidéo auront chacun leur propre sous-répertoire, respectivementaudio/und« » etvideo/1« ».
  • Dans chacun de ces répertoires, il y aura un «init.mp4» avec les données d'initialisation.
  • Les données multimédias seront dans des fichiers nommésseg-N.m4f" " (où N commence à zéro et augmente pour chaque segment).

Les sorties DASH avec la streaming_delivery_profile valeur « on_demand » utilisent des fichiers multimédias fragmentés plutôt que des segments :

  • Le fichier mpd manifeste se trouve au niveau racine de la sortie.
  • Les médias audio et vidéo seront chacun un seul fichier dans le même répertoire que le manifeste.
  • Les fichiers multimédias seront nommés de la même manière que le manifeste, mais avec "-audio " ou "-video " suffixes ajoutés, le cas échéant.

Configurations DASH prises en charge :

  • Formats pris en charge : m4f et webm
  • Codecs vidéo pris en charge : h264 hevc, vp8, et vp9
  • Codecs audio pris en charge : aac ac3, eac3, et vorbis
  • Les sorties au formatwebm" " ne prennent actuellement en charge que l'option « on_demand » streaming_delivery_profile
  • Les sorties au formatwebm" " ne prennent actuellement pas en charge DRM

Débit binaire multiple

Les sorties DASH générées par Zencoder auront la structure nécessaire pour être jouées seules, mais pour vraiment bénéficier de ces options de diffusion en streaming, vous devez générer plusieurs versions à différents débits (rendus) ainsi qu'une sortie de type « playlist » qui répertorie les rendus de sorte qu'un lecteur peut commuter les débits binaires mont/bas au besoin en fonction des conditions actuelles du réseau. La sortie de la playlist est une sortie dépendante, c'est-à-dire qu'elle référencera les autres sorties par leur étiquette et utilisera les données de ces sorties pour générer le rendu final de la playlist. Notez que vous devez faire attention à définir les chemins de flux dans la sortie de la liste de lecture afin qu'ils soient des chemins relatifs à l'emplacement des fichiers de rendu.

{
    "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" }
        ]
    }
    ]
}

Cryptage

Zencoder prend également en charge la génération de sorties DASH cryptées CENC, avec les en-têtes nécessaires pour l'intégration avec les serveurs de licences Marlin ou Playready. Pour chaque sortie, il suffit de spécifier un hachage d'options DRM, y compris les options method, key_id, et content_key. Le key_id et content_key doit être récupéré auprès de votre fournisseur DRM ou prégénéré et envoyé à votre fournisseur DRM. Une fois que vous avez ces clés, la structure de l'API Zencoder pour un rendu unique est la suivante :

{
    "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"
        }
    }
    ]
}

Le contenu sera chiffré avec le content_key, et le fichier .mpd manifeste comprendra la key_id dans ses en-têtes. Cependant, pour garantir que cette sortie est jouable, il a également besoin d'en-têtes spécifiant comment récupérer le content_key. Sur un encodage DASH à plusieurs débits, ces en-têtes doivent seulement être ajoutés à la sortie de la playlist, mais peuvent également être ajoutés à chaque rendu, de sorte que le rendu soit individuellement lisible. Pour ce faire, ajoutez un ou plusieurs schémas 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/" }
            ]
        }
    }
    ]
}

Nous pouvons ensuite mettre cela en place pour créer une tâche DASH cryptée par DRM à plusieurs débits :

{
    "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/" }
            ]
        }
    }
    ]
}

Transmultiplexage

Bien sûr, générer plusieurs formats d'une vidéo peut devenir coûteux et coûteux. Ainsi, Zencoder prend en charge le reconditionnement des mêmes flux encodés dans différents formats (appelé transmuxing), en utilisant le copy_video et copy_audio options. Les sorties pour lesquelles la vidéo est transmux plutôt qu'encodée sont facturées à 1/4 de la durée normale. Donc, si vous prévoyez de créer plusieurs formats de la même vidéo (MP4, HLS et DASH, par exemple), vous pouvez d'abord encoder la version MP4 de chaque débit binaire, puis transmux ces sorties pour créer les versions HLS et DASH. (Notez que nous ne prenons pas en charge le transmuxage à partir d'un format segmenté, car la vidéo n'est plus un flux unique.)

Pour vous assurer que le MP4 est préparé en fonction des contraintes des formats de streaming segmentés suivants, utilisez également l' prepare_for_segmenting option sur la sortie MP4. Cela contrôlera les valeurs par défaut des images clés et des légendes lors de l'encodage du flux vidéo du MP4 afin de garantir qu'il sera compatible avec le transmuxage vers des formats segmentés par la suite.

L'utilisation du MP4 comme source pour les sorties transmuxées fonctionne de la même manière que les sorties de la playlist. Vous spécifiez une option source qui correspond à l'étiquette d'une autre sortie, mais cette fois, elle fait partie des options de niveau principal pour la sortie plutôt que dans le hachage des flux.

{
    "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"
    }
    ]
}

Optimiser pour la livraison

Étant donné que DASH est destiné à la diffusion en continu, nous vous recommandons de contrôler les pics des débits binaires dans chaque rendu pour éviter que le joueur ne rebuffe ou passe inutilement à des codages à débit binaire inférieur. Les options qui contrôlent la variabilité du flux encodé en fonction de ce que le décodeur / lecteur peut gérer sont

Notre recommandation générale est de decoder_bitrate_cap régler le débit maximum disponible pour le flux vidéo. N'oubliez pas que vous devez prendre en compte l'audio, ainsi qu'un peu de surcharge pour le format de fichier. Le decoder_buffer_size est techniquement supposé correspondre à la mémoire tampon vidéo disponible sur le périphérique de décodage, mais est souvent mieux utilisé pour contrôler la quantité de contenu qui peut être pré-tamponné. Il fonctionne comme un multiple de l' decoder_bitrate_cap, de sorte que, par exemple, il decoder_bitrate_cap était 500 (kilobits par seconde), et decoder_buffer_size était de 1000 (Kilobits), puis le tampon pouvait stocker 2 secondes de vidéo. Nous recommandons également de définir le paramètre video_bitrate un peu plus bas que le decoder_bitrate_cap, ce qui permet au codeur pour utiliser plus de données pour coder des scènes complexes et moins de données sur des scènes plus simples. Un point de départ décent serait de supposer jusqu'à 10 % des frais généraux pour le format de fichier, en définissant les video_bitrate 10 % inférieurs à la decoder_bitrate_cap, et en autorisant environ 1 0,5 seconde de vidéo à mettre en mémoire tampon.

En supposant qu'une connexion de 1000 Kbps soit disponible pour le client :

  • 1000 * 0,90 = 900 Kbps disponible après soustraction de 10% pour les frais généraux de format.
  • Vidéo 900 - 128 = 772 Kbps decoder_bitrate_cap après avoir soustrait 128 Kbps pour l'audio.
  • 772 * 1,5 = 1158 Ko decoder_buffer_size (pour 1,5 seconde de vidéo).
  • 772 * 0,90 = 695 Kbps débit binaire vidéo cible (10% inférieur au decoder_bitrate_cap).

Par conséquent, pour un exemple de codage de streaming plus correct :

{
    "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"
    }
    ]
}

Mettre tous ensemble

{
    "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/" }
            ]
        }
    }
    ]
}