Guide de transmuxage

Ce sujet explique transmuxing , un processus qui vous permet d'encoder vos vidéos au format MP4, puis de les reconditionner en tant que sorties HLS.

Aperçu

Avec Zencoder, vous pouvez encoder vos vidéos en MP4, puis les reconditionner en tant que sorties HLS, via un processus que nous appelons "transmuxing" (plutôt que transcodage). Transmuxing reconditionnera les vidéos MP4 existantes dans les segments MPEG TS nécessaires pour la diffusion en direct HTTP (HLS), sans avoir à recoder les fichiers vidéo. À l'aide de sorties dépendantes, vous pouvez créer vos fichiers H.264 ainsi que les fichiers segmentés en une seule tâche, ce qui permet un délai d'exécution plus rapide à moindre coût ; les sorties transmuxées sont facturées au quart du coût de l'encodage. Le travail qui en résulte crée 6 sorties, dont 2 facturées au tarif normal de votre compte, 3 fichiers transmuxés au quart du coût d'encodage et 1 playlist gratuite.

Pour cela, vous allez créer un seul travail avec deux ensembles principaux de sorties (plus les listes de lecture). Le premier ensemble de sorties sera des fichiers MP4 H.264/AAC normaux avec quelques paramètres spéciaux pour leur permettre de fonctionner comme fichiers source pour les sorties HLS. Le deuxième ensemble de sorties utilisera ces fichiers MP4 comme entrées "source", transmux leur contenu aux sorties HLS. Comme il s'agit de sorties dépendantes, elles attendront la fin de leur source correspondante avant d'être planifiées pour le traitement.

L'élément clé du processus consiste à utiliser source une nouvelle option de la V2 de l'API Zencoder. La source indique à une sortie d'utiliser le fichier créé par une autre sortie du travail pour le traitement, au lieu du fichier d'entrée. Dans cette situation, Zencoder créera des fichiers H.264 basés sur le fichier d'entrée aux débits demandés. À la fin de chacune de ces sorties, une version segmentée sera alors créée à partir de la sortie.

Résolutions vidéo

Le tableau ci-dessous présente quelques résolutions vidéo courantes.

Type de résolution Nom commun Ratio d'aspect Taille du pixel
SD (définition standard) 480p 4:3 640 x 480
HD (Haute Définition) 720p 16:9 1280 x 720
Full HD (FHD) 1080p 16:9 1920 x 1080
QHD (Quad HD) 1440p 16:9 2560 x 1440
vidéo 2K 1080p 1:1.77 2048 x 1080
vidéo 4K ou Ultra HD (UHD) 4K ou 2160p 1:1.9 3840 x 2160
vidéo 8K ou Full Ultra HD 8K ou 4320p 16∶9 7680 x 4320

Lorsque vous choisissez les résolutions vidéo pour vos sorties, vous devez tenir compte des appareils que vos spectateurs sont susceptibles d'utiliser. (Si vous disposez d'un système d'analyse, cela vous aidera à le déterminer) Si les appareils mobiles sont une cible, vous pouvez prendre en compte le fait que la vidéo "verticale" est de plus en plus populaire. Pour produire une vidéo verticale, vous devez généralement intervertir les valeurs de largeur et de hauteur.

Les sorties H.264

Nous allons commencer par créer 2 fichiers H.264, en ciblant les débits élevés et faibles.

{
    "label": "low",
    "format": "mp4",
    "video_bitrate": 200,
    "decoder_bitrate_cap": 300,
    "decoder_buffer_size": 1200,
    "audio_sample_rate": 44100,
    "height": "288",
    "url": "s3://example-bucket/low.mp4",
    "h264_reference_frames": 1,
    "forced_keyframe_rate": "0.1",
    "audio_bitrate": 56,
    "decimate": 2
},
{
    "label": "high",
    "format": "mp4",
    "video_bitrate": 1000,
    "decoder_bitrate_cap": 1500,
    "decoder_buffer_size": 6000,
    "audio_sample_rate": 44100,
    "height": "432",
    "url": "s3://example-bucket/high.mp4",
    "h264_reference_frames": "auto",
    "h264_profile": "main",
    "forced_keyframe_rate": "0.1",
    "audio_bitrate": 56
}

Les fichiers résultants de ces sorties peuvent être lus sur une grande variété d'appareils. Chacun cible un débit et une résolution différents, de sorte que les utilisateurs peuvent recevoir le fichier approprié. Chacun est également approprié pour la segmentation pour la diffusion en direct HTTP et sert de flux de débit adaptatif.

Voici quelques options dans la demande ci-dessus pour noter :

  • forced_keyframe_rate jusqu'à 0,1. Cela force la vidéo à avoir une image clé toutes les 10 secondes. Les fichiers segmentés dureront 10 secondes, ce qui garantit que chaque segment commencera par une image clé.
  • decoder_bitrate_cap est défini sur 1,5 fois le débit binaire cible du fichier. decoder_buffer_size est défini sur 3,5 x à 5 fois le débit binaire cible du fichier. Ces paramètres permettent de conserver un débit binaire cohérent dans tout le fichier, de sorte que les segments segmentés ne varient pas trop en taille et en débit.

Maintenant que les fichiers H.264 ont été créés, des sorties supplémentaires peuvent être ajoutées à la demande de création de fichiers segmentés HTTP Live Streaming à partir de la source, sans avoir à effectuer d'encodage supplémentaire.

Sorties segmentées

Chacune des sorties vidéo H.264 et audio ci-dessus a labels dans leurs options API. Ces étiquettes peuvent être utilisées avec le source option pour dire à Zencoder d'utiliser la vidéo créée par la sortie avec l'étiquette donnée, plutôt que le fichier d'entrée. Étant donné que les fichiers H.264 sont déjà avec de bons paramètres pour HLS, aucun encodage supplémentaire n'est nécessaire.

{
    "source": "low",
    "format": "ts",
    "copy_audio": "true",
    "copy_video": "true",
    "url": "s3://example-bucket/hls-low/hls-low.m3u8",
    "label": "hls-low",
    "type": "segmented"
}
{
    "source": "high",
    "format": "ts",
    "copy_audio": "true",
    "copy_video": "true",
    "url": "s3://example-bucket/hls-high/hls-high.m3u8",
    "label": "hls-high",
    "type": "segmented"
}
{
    "streams": [
    {
        "path": "hls-low/hls-low.m3u8",
        "bandwidth": 256
    },
    {
        "path": "hls-high/hls-high.m3u8",
        "bandwidth": 1056
    }
    ],
    "type": "playlist",
    "url": "s3://example-bucket/playlist.m3u8"
}

Les fichiers résultants de ces sorties sont des sorties segmentées, ciblant différentes bandes passantes, plus un fichier de liste de lecture permettant au périphérique de lecture de connaître les flux disponibles.

Chaque sortie segmentée inclut le source, et spécifie l'une des sorties répertoriées précédemment. Ils comprennent également le copy_audio et copy_video options, qui indiquent à Zencoder d'utiliser les flux audio et vidéo du fichier source et de les reconditionner dans le nouveau conteneur, plutôt que de les transcoder. Enfin, les sorties spécifient également un type de segmenté et un format de ts, plus un url avec une extension de .m3u8, pour que Zencoder sache créer des fichiers HLS segmentés.

Enfin, il existe également une liste de lecture générée qui référence chacune des sorties segmentées. Notez que le premier fichier référencé dans la liste de lecture est la vidéo à faible débit binaire ; le périphérique qui joue la vidéo charge généralement le premier flux répertorié dans la liste de lecture initialement et bascule vers d'autres flux si nécessaire. Cela signifie que les 10 premières secondes de lecture utiliseront ce flux, après quoi l'appareil aura suffisamment d'informations pour sélectionner le flux approprié à lire.

NOTES

  • La génération de listes de lecture HLS n'utilise actuellement aucune information provenant des autres sorties du travail, mais est simplement un moyen de générer facilement une liste de lecture à débit adaptatif correctement formatée et de la télécharger avec les autres fichiers.
  • Alors que les appareils iOS lisent la liste de lecture de débit adaptative créée, VLC ne le fera pas, en raison d'erreurs dans le traitement des URL relatives. Il recherchera les fichiers de segment dans le même répertoire que le fichier de liste de lecture, plutôt que le répertoire du fichier manifeste.

Demande complète

Maintenant que nous avons passé en revue chacune des principales sections de sortie, rassemblons-les en une seule demande d'API.

{
    "input": "s3://zencodertesting/test.mov",
    "outputs": [
    {
        "label": "low",
        "format": "mp4",
        "video_bitrate": 200,
        "decoder_bitrate_cap": 300,
        "decoder_buffer_size": 1200,
        "audio_sample_rate": 44100,
        "height": "288",
        "url": "s3://example-bucket/low.mp4",
        "h264_reference_frames": 1,
        "forced_keyframe_rate": "0.1",
        "audio_bitrate": 56,
        "decimate": 2
    },
    {
        "label": "high",
        "format": "mp4",
        "video_bitrate": 1000,
        "decoder_bitrate_cap": 1500,
        "decoder_buffer_size": 6000,
        "audio_sample_rate": 44100,
        "height": "432",
        "url": "s3://example-bucket/high.mp4",
        "h264_reference_frames": "auto",
        "h264_profile": "main",
        "forced_keyframe_rate": "0.1",
        "audio_bitrate": 56
    },
    {
        "source": "low",
        "format": "ts",
        "copy_audio": "true",
        "copy_video": "true",
        "url": "s3://example-bucket/hls-low/hls-low.m3u8",
        "label": "hls-low",
        "type": "segmented"
    }
    {
        "source": "high",
        "format": "ts",
        "copy_audio": "true",
        "copy_video": "true",
        "url": "s3://example-bucket/hls-high/hls-high.m3u8",
        "label": "hls-high",
        "type": "segmented"
    }
    {
        "streams": [
        {
            "path": "hls-low/hls-low.m3u8",
            "bandwidth": 256
        },
        {
            "path": "hls-high/hls-high.m3u8",
            "bandwidth": 1056
        }
        ],
        "type": "playlist",
        "url": "s3://example-bucket/playlist.m3u8"
    }
    ]
}