Lors de la construction de Mux.js - letransmuxer au cœur de videojs-contrib-hls - nousavons été confrontés à un problème : comment déterminer si la sortie de Mux.js est correcte ?
Au début, nous avons réussi à convaincre FFmpeg de créer des MP4 à partir de segments MPEG2-TS qui seraient lus dans un navigateur avec Media Source Extensions (MSE), ce qui, à l'époque, signifiait uniquement Chrome. Cependant, nous avions besoin d'un moyen simple de comparer la sortie de notre transmuxer avec ce qui était produit par FFmpeg. La comparaison devait tenir compte du format MP4, car il est très peu probable que les deux sorties soient identiques en termes d'octets.
CONSTRUCTION D'UN INSPECTEUR MP4
La réponse à ce problème a été de construire un inspecteur mp4 - un outil qui analyserait les MP4 et afficherait une sorte de dump de type JSON de toutes les boîtes pertinentes et de leur contenu. En générant un dump de la sortie de Mux.js et en le comparant à un fragment connu généré avec FFmpeg, nous avons pu voir où la sortie de notre transmuxer différait.
L'inspecteur mp4 a été construit comme une page web afin que nous puissions avoir une différence graphique codée en couleur des deux segments. Au fil du temps, la page s'est enrichie d'un élément vidéo et nous avons commencé à ajouter les résultats du transmuxing des segments directement dans le MediaSource de l'élément vidéo pour faciliter le retour d'information instantané et la validation des changements apportés à Mux.js.
Au fur et à mesure que le développement se poursuivait, nous rencontrions parfois des flux qui échouaient d'une manière nouvelle et intéressante. Certains de ces échecs étaient, il est vrai, dus à des bogues dans Mux.js. Au fur et à mesure que Mux.js devenait plus robuste, les échecs étaient de plus en plus dus à des problèmes avec les flux ou à des problèmes avec une implémentation particulière de la spécification MSE.
Nous avons fini par comprendre qu'il nous fallait vraiment en savoir plus sur ce qui se passait à l'intérieur de ces vidéos. Nous devions non seulement voir ce qui se passait au niveau du conteneur média, mais aussi aller plus loin, c'est-à-dire jeter un coup d'œil dans les données vidéo elles-mêmes. C'est dans ce but que nous avons créé Thumbcoil.
Thumbcoil est une suite d'outils conçus pour vous donner un aperçu de la structure interne des flux binaires vidéo H.264 contenus dans un fichier conteneur MP4 ou MPEG2-TS. En utilisant les outils de Thumbcoil, vous pouvez obtenir une vue détaillée de la structure interne des deux formats de conteneurs multimédias pris en charge.
En outre, les outils sont capables de vous montrer les informations contenues dans les unités NAL les plus importantes qui composent le flux binaire H.264. Vous êtes-vous déjà demandé quel type d'informations secrètes l'encodeur vidéo a caché pour que les décodeurs puissent les utiliser ? Avec Thumbcoil, vous pouvez le constater par vous-même.
POURQUOI NOUS AVONS CRÉÉ UN INSPECTEUR MP4
En 2016, il y avait très peu de bons outils pour générer un affichage quelque peu graphique de la structure des conteneurs de médias et des données qu'ils contiennent. Le débogage des problèmes de lecture vidéo est généralement une tâche fastidieuse impliquant diverses incantations ésotériques de FFmpeg et FFprobe. Malheureusement, FFprobe n'est capable d'afficher qu'une petite partie des données qui nous intéressent.
Les données exactes contenues dans les différents jeux de paramètres, par exemple, ne sont pas disponibles en ligne de commande. Dans FFprobe, ces données sont analysées et stockées, mais il n'y a pas de moyen simple de restituer ces informations sous une forme lisible par l'homme.
Dans la norme H.264, il existe deux types particuliers d'unités NAL : les unités NAL seq\_parameter\_set
(SPS) et le pic\_parameter\_set
(PPS). Ces deux unités NAL contiennent beaucoup d'informations. Les décodeurs ont besoin de ces informations pour reconstruire la vidéo.
Thumbcoil ne se contente pas de fournir des informations sur les jeux de paramètres dans les moindres détails, il conserve également ces informations dans leur contexte, c'est-à-dire les boîtes dans lesquelles elles étaient contenues ou le cadre avec lequel elles ont été spécifiées. Ce contexte est souvent très important pour comprendre les problèmes ou les particularités des cours d'eau.
COMMENT NOUS AVONS CONSTRUIT UN INSPECTEUR MP4
L'un des aspects les plus intéressants de la façon dont Thumbcoil analyse les ensembles de paramètres est qu'il construit ce qui est appelé en interne un "codec" pour chaque type d'unité NAL. Ces codecs sont spécifiés à l'aide de ce qui est essentiellement une configuration de type combinateur d'analyseur.
La plupart des données des deux ensembles de paramètres sont stockées à l'aide d'une méthode appelée codage exponentiel-golomb. Cette méthode utilise un nombre variable de bits pour stocker les nombres et est particulièrement adaptée aux valeurs qui tendent à être petites.
Chaque fonction utilisée pour construire le codec renvoie un objet avec deux fonctions : décoder et encoder. Cela signifie que nous pouvons spécifier le format, par exemple, d'un fichier seq\_parameter\_set
NAL une seule fois, puis nous pouvons analyser et écrire dans le flux binaire de cette unité NAL particulière.
La grammaire utilisée pour spécifier les codecs de l'unité NAL est très similaire à la grammaire utilisée par la spécification H.264 (ISO/IEC 14496-10). Les types de données que les codecs de Thumbcoil comprennent sont, avec quelques extensions, simplement les mêmes types définis dans la spécification, tels que les entiers exponentiels signés et non signés codés en golomb.
En plus des jeux de paramètres, Thumbcoil donne un aperçu de la structure des couches de tranches elles-mêmes en analysant le fichier slice\_header
données. Cependant, nous n'analysons pas les données réelles des slice\_data
car les choses deviennent rapidement plus difficiles et moins utiles à mesure que l'on descend dans le détail.
Comme tous les projets Video.js, Thumbcoil est un logiciel libre et nous accueillons volontiers les suggestions, les problèmes et les contributions sur Github.
GLOSSAIRE TECHNIQUE
- Transmuxer. Un transmuxer prend un média contenu dans un certain format de fichier, en extrait la vidéo et l'audio compressés bruts (processus appelé démultiplication) et reconditionne les données compressées dans un autre format (appelé remultiplication) sans procéder à une recompression.
- MP4. Les fichiers MP4 sont composés de boîtes - des unités logiques hiérarchiques qui, commodément, commencent toutes par une longueur de 32 bits et un type de boîte de 32 bits. Les boîtes contiennent souvent d'autres sous-boîtes.
- Conteneur multimédia. Dans un conteneur multimédia tel que MP4, la vidéo et l'audio sont contenus dans des données appelées flux binaires. Les flux binaires sont les données produites par les encodeurs pour représenter les signaux audio ou les images vidéo. Les flux binaires les plus courants sont AAC pour l'audio et H.264 (AVC) pour la vidéo.
- Unités NAL. Un flux binaire codé H.264 est composé de ce que l'on appelle des unités NAL (Network Abstraction Layer). Les NAL sont un format de paquet simple conçu pour utiliser les bits le plus efficacement possible.