Créer une vidéo DivX Plus HD sur Linux

Pendant des années, j’ai enregistré des émissions et films de la télévision, en utilisant ma vieille carte d’acquisition « Pinnacle PCTV Stereo », essentiellement sur un PC de salon avec un processeur VIA Nehemiah à 1GHz, puis encore un peu sur un PC avec un processeur Intel Core2Duo E4300 à 1,8GHz.

Le PC de salon n’est plus (alimentation grillée). Maintenant, j’utilise un lecteur de salon grand-public, capable d’accéder à mes enregistrements par DLNA. Ce lecteur n’accepte pas la même diversité de formats qu’un PC, mais par chance, il accepte le format « DivX Plus HD », un format idéal puisqu’il s’appuie sur un conteneur Matroska (.mkv), ce qui permet d’inclure des chapitres, des sous-titres, etc.

This article has been translated to English.

Comme ma carte d’acquisition vidéo est minimale et que mon premier PC de salon était peu puissant, mes enregistrements ont toujours été réalisés dans un format aussi minimaliste (et volumineux) que possible : un flux vidéo MJPEG et de l’audio brut, encapsulés dans un conteneur AVI. Un post-traitement en deux passes transformait ensuite ces enregistrements dans un format plus compact. J’ai globalement utilisé 3 formats :

  • quelques films au format SVCD, en général destinés à être gravés sur CD,
  • quelques films au format DVD (notamment mes vieilles VHS, que j’ai numérisées), en général destinés à être gravés sur DVD,
  • la majorité de mes enregistrements dans le format MPEG2, plus compact et moins contraint mais que je savais n’être lisible que sur ordinateur.

Bien sûr, c’est ce troisième format que mon nouveau lecteur DLNA de salon ne sait pas lire… D’où la nécessité de « transcoder ». Et comme le format Matroska permet d’ajouter des sous-titres, je peux même prendre en compte les vidéos familiales pour lesquelles les « sous-titres » sont en fait mes notes sur les lieux et personnes présentes ;-)

Après de multiples essais, il s’avère que créer un fichier compatible avec un lecteur matériel (et non un logiciel) est assez ardu. D’un côté, la norme DivX Plus HD n’est pas toujours respectée, d’un autre côté, certains aspects de cette norme sont parfois observés strictement sur des détails qui peuvent paraître insignifiants.

J’ai finalement réussi à trouver une combinaison d’outils et de paramètres qui font que le résultat est 100 % compatible (avec avance et retour rapide, etc.) à coup sûr. Le script est disponible dans mon dépôt Git.

Ce script est en principe interactif : il pose des questions sur les flux à intégrer au fichier final. Normalement, les réponses par défaut conviennent et il suffit de valider chaque réponse. Si c’est effectivement ce que vous constatez, le paramètre -y permet de rendre le script automatique en prenant systématiquement les réponses par défaut.

Notez que ce script part de quelques hypothèses :

  • Le flux vidéo de départ est supposé ne pas être déjà au format x264 avec les caractéristiques requises pour DivX Plus HD, et est donc systématiquement transcodé.
  • Les fichiers produits ne dépassent jamais 25 images par seconde, d’une part parce que moins d’images impliquent moins d’octets, plus utilement utilisés pour augmenter la qualité ; d’autre part parce qu’au-delà de 30 images par seconde, les dimensions maximales d’image acceptées par la norme changent, et que je n’avais pas envie de devoir gérer cette dualité.
  • ffmpeg est supposé supporter le codec fdk_aac ; si tel n’est pas le cas, il faut modifier le script pour remplacer « -c:a libfdk_aac » par « -c:a aac ».

Ce script se veut aussi éducatif. Non seulement il peut fonctionner comme un simple outil de transcodage, mais il peut aussi assister dans un transcodage manuel.

Par défaut, le script affiche chaque commande avant de l’exécuter. On peut se contenter de l’affichage (paramètre -n) pour voir quelles commandes auraient été exécutées sans que rien ne soit modifié sur le disque dur. On est alors libre d’adapter ces commandes et les exécuter manuellement.

On peut aussi simplement demander quelles informations ont été détectées (paramètre -h) dans les fichiers donnés en entrée (paramètre -i) : flux vidéo, audio, sous-titres, chapitres.

Comme indiqué dans le script lui-même, les sites qui m’ont beaucoup apporté pour atteindre ce résultat sont :

Mises à jour :

  • 2017-11-06 — Le script est maintenant hébergé dans Git.
  • 2015-04-04 — J’ai découvert par hasard que le filtre crop de x264 n’accepte que des valeurs paires ; ainsi, si je dois enlever 6 pixels, je dois en enlever 2 d’un côté et 4 de l’autre et non 3 de chaque côté. Script corrigé.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

La discussion continue ailleurs

URL de rétrolien : http://yalis.fr/cms/index.php/trackback/68

Fil des commentaires de ce billet