Scripts de transcodage de vidéos

Date: 8/07/2010 | Catégories: Gstreamer,Open-source,Planet-libre,Video | Tags: ,,,,,

Il existe de nombreux logiciels pour transcoder (WIKI) une vidéo d'un format vers un autre. On peut notamment citer Transmageddon, Handbrake, VLC... Néanmoins, votre distribution GNU/Linux intègre le framework GStreamer permettant d'effectuer ces taches de transcodage directement en ligne de commande et sans installer de logiciel supplémentaire. En dehors du fait que c'est un bon exercice pour comprendre le fonctionnement de ce fabuleux framework, c'est également un moyen simple d'intégrer ce transcodage dans des scripts automatisés (par exemple, transcoder toutes les vidéos déposées dans un répertoire dans un format unique).

Nous allons dans ce billet voir comment effectuer ce transcodage dans trois formats "standard" (industriellement parlant...):

  • MP4 avec codec vidéo H.264 et codec audio AAC
  • OGG avec codec vidéo Theora et codec audio Vorbis
  • WEBM avec codec vidéo VP8 et codec audio Vorbis

Installation des plugins GStreamer

L'installation standard de GStreamer n'inclue pas la prise en charge de tout les codecs vidéos et audios. Afin de remédier à ça, je vous conseille d'installer "la totale" avec les commandes suivantes:

wget https://raw.github.com/nicolargo/ubuntupostinstall/master/gstreamerinstall.sh

chmod a+x ./gstreamerinstall.sh

sudo ./gstreamerinstall.sh

rm ./gstreamerinstall

Ces commandes vont récupérer un script maison qui va installer le PPA de l'équipe de développement de GStreamer, puis installer les paquets GStreamer.

Un peu de pipeline

Je donnerai en fin d'article un lien vers trois scripts shell qui vont automatiser les phases de transcodage. Cependant, nous allons dans ce paragraphe voir comment faire un transcodage à la main en utilisant la commande gst-launch.

Pour illustrer notre exemple, prenons une vidéo au format .MOV (H.264 + AAC) que l'on soughaite convertir dans un format plus "libre", c'est à dire WEBM (VP8 + VORBIS). La pipeline (ligne de commande) correspondante est la suivante:

gst-launch -t filesrc location=source.mov ! progressreport ! decodebin name=decoder \

decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \

webmmux name=muxer \

decoder. ! queue ! ffmpegcolorspace ! vp8enc ! queue ! \

muxer. muxer. ! queue ! filesink location=destination.webm

La première ligne (filesrc location=source.mov ! progressreport ! decodebin name=decoder \) permet de charger le fichier source au format .MOV et de décoder les pistes audio et vidéo.

La seconde ligne (decoder. ! queue ! audioconvert ! vorbisenc ! queue ! \) prend la piste audio du fichier source et la transcode au format VORBIS.

La troisième ligne (webmmux name=muxer \) précise que l'on utilisera un conteneur multimédia de destination de type Webm.

La quatrième ligne (decoder. ! queue ! ffmpegcolorspace ! vp8enc ! queue ! \) prend la piste vidéo du fichier source et la transcode au format VP8.

Enfin la dernière ligne (muxer. muxer. ! queue ! filesink location=destination.webm) prend les pistes audio et vidéo transcodées puis génère le fichier destination au format .WEBM.

Des scripts ! Des scripts !

"C'est bien beau la théorie mais moi je veux juste faire rapidement un transcodage..."...

Ok Michel, voici trois script shell permettant de faire un transcodage de n'importe quel type de vidéo vers un des formats suivants:

Pour les utiliser, il faut dans un premier temps les rendre executable avec la commande:

chmod a+x *encoder.sh

L'utilisation est des plus simple. Exemple de transcodage en MP4:

./mp4encoder.sh Inception-1080p.mov

Exemple de transcodage en OGG:

./oggencoder.sh Inception-1080p.mov

Exemple de transcodage en WEBM:

./webmencoder.sh Inception-1080p.mov

Et si je veux modifier les paramètres de transcodage ?

Ben c'est possible Miche, Nicolargo a pensé à toi. Il suffit d'éditer le script puis de mettre les paramètres dans la variable AUDIO_ENCODER_PARAMETERS pour le codec audio et VIDEO_ENCODER_PARAMETERS pour le codec vidéo.

Par exemple pour modifier le script webmencoder.sh afin d'encoder avec une qualité vidéo supérieure, il faut éditer le fichier et modifier la ligne suivante:

VIDEO_ENCODER_PARAMETERS="quality=7 speed=2"

Pour avoir la liste des paramètres pour un codec (par exemple pour l'encodeur VP8 ; vp8enc), il faut saisir la commande suivante:

gst-inspect vp8enc

Conclusion

C'est à vous de jouer pour intégrer ces scripts dans vos processus d'automatisation de transcodage de vidéo/audio !

  • Pingback: Tweets that mention Scripts de transcodage de de vidéos -- Topsy.com()

  • Je ne comprends pas trop pourquoi mais j’ai une erreur:
    > Syntaxe: /home/willy/Vidéos/mp4encoder.sh

  • @Willy: il faut donner un nom de fichier source en paramètre, par exemple:

    Syntaxe: /home/wily/Vidéos/mp4encoder.sh mavideo.avi

  • ninja21a

    Bonjour Nico,

    Lorsque j’utilise ton script webmencoder.sh, et que je place mon fichier dans flumotion, je n’ai toujours pas de son alors que dans le fichier original (format MP4), j’en ai.

    Une idée ?

    Merci.
    🙂

  • @ninja21a: si tu essayes de jouer en local le fichier WebM tu as le son ?

  • ninja21a

    Oui, j’ai le son en le jouant en local.

  • ninja21a

    @nicolargo: seul le fichier .ogv fonctionne avec flumotion. J’ai essayé de réencoder en webm après avoir installé les librairies manquantes et je n’ai pas plus de succès. Le son des mp4 ne passe pas non plus sur flumotion.

  • Avec tes scripts,
    Si tu encode un fichier .mp4 qui est en 720×576, le format standard d’un film sur DVD, il ressort au même format, ou tu peux modifier le format de sortie en le mettant en 1080×720? Afin qu’il soit plein écran?

    Merci

    • Je ne pense pas que c’est à l’encodage qu’il faut faire cela. Tu vas perdre en qualité et en efficacité au niveau du codec vidéo. Pour l’afficher en plein écran je te conseille de forcer le mode avec ton player vidéo (c’est à dire lors de la lecture). Par exemple VLC fait cela très bien.

      • OK, merci

      • J’ai un problème avec les scripts que tu as fait pour les encodages.
        En effet, quand je lance ./oggencoder.sh mon fil.mp4, il repasse en ligne de commande et me marque:
        Syntaxe: ./oggencoder.sh
        Cela fait avec les 3 scripts…
        une idée?

      • il manque une partie…
        Syntaxe: ./oggencoder <>!

  • Bon, et bien le script oggencoder me met des erreurs!
    (gst-launch-0.10:4869): GLIB-GObject-warning **: value ‘5.000000’ of type ‘gfloat’ is invalid or out of range for property ‘quality’ of type ‘gfloat’
    « Pipeline erroné: pas de propriété speed dans l’élément ‘theoraenc0’
    Une petite idée?
    D’autre part, comment mettre les pages avec le film afin quelles soient vues sans que le client doive copier l’adresse du lien et la mettre dans VLC, par exemple?
    Bonne nuit…

  • Bon, ben faut que je trouve autre chose…
    En effet, les vidéos en mp4 sont d’une qualité irréprochable image et son, mais les films s’affichent sur la page web en petit format!
    Je travail avec worpress, et cela ne fonctionne pas correctement!
    Dommage…

    • Tu devrais regarder du coté de http://videojs.com/
      Ils ont un plugin pour WordPress et une fonction pour passer en full screen…

      • Merci NicoLargo.
        Et je pourtant j’ai cherché ce genre de plugin.
        J’en utilse 1 pour un site de bandes annonces de films, mais qui est du pseudo-streamer et pour flash et mp4! Mais tu dois avoir d’abord du flash et ensuite du mp4!
        Je vais donc tester ce nouveau plugin. et je te tiens au courant.
        Encore merci

  • Cher NicoLargo,
    Je n’ai toujours pas pu installer la version 0.8.0 de Flumotion! J’ai donc installé la version 0.6.1.1 qui fait partie des packages de Ubuntu 10.10. Elle tourne, sans souçis.
    Le plugin est pas mal, mais pas très compatible avec Flumotion. Par contre, le script video-js pour HTML5 s’accorde parfaitement avec Flumotion.
    Dans tous les cas un grand merci pour ton aide, et j’espère que Ubuntu fera prochainement une mise à jour de Flumtion.

    LG

  • leglaude51

    Hello,
    Je suis entrain de faire des comparaisons des différents encodages, en webm, ogg et mp4. J’ai une vidéo en flv.
    En ogg, c’est bon, en webm également, mais en mp4, pas de son!!!
    Une petite idée?
    Actuellement je suis sous Ubuntu 10.10 Desktop sur un portable pour faire les tests.

    • Il faut vérifier que tu as le plugin Gstreamer FAAC (le codec AAC).

      Puis cela, il faut saisir la commande:

      # gst-inspect faac

      qui doit te retourner la doc du plugin.

      • leglaude51

        Ok, merci je vais regarder cela de suite.
        Par contre, est-il normal que pour encoder un AVI en MP4 Qualité 9, cela met plus de 12h?
        Surtout que cela tourne sous un quad core de 2,7GHz. Bon, c’est vrai que le film d’origine fait 1.9Gb…

        • Cela me semble un peu long quand même… Le script n’est pas forcement optimisé pour « faire vite ». Ce que tu peux essayer pour voir c’est de modifier le script en ajoutant les options suivants à la ligne n°21

          VIDEO_ENCODER_PARAMETERS= »threads=4″
          puis
          VIDEO_ENCODER_PARAMETERS= »threads=4 speed-preset=5″

          Tiens nous au corant si tu as un gain de vitesse d’encodage

          PS: tu peux regarder la liste des options disponibles avec:

          # gst-inspect x264enc

  • leglaude51

    Encore une question:
    Connais-tu un programme sous Ubuntu, pour ripper les DVD et les convertir en MP4 HD?
    J’ai essayé DVDRip, il refuse de lire les DVD?
    Sous windaube, j’utilise DVDFab, mais j’aimerai tout passer sous linux, même mes programmes de gestion, etc.. et abandonner complètement windaube?
    Je sais, je suis difficile, mais je suis un perfectionniste…
    Merci d’avance

    • Oui, pour moi le top du top est Handbrake. A installer avec la manip suivante:

      # sudo add-apt-repository ppa:stebbins/handbrake-releases
      # sudo aptitude install handbrake-gtk

      Puis à lancer à partir du menu Applications > Son et Vidéo > Handbrake.

      • leglaude51

        Et après 15h d’encodage, qualité d’images exceptionnelles! Mais pas de son!!
        quand je fais un inspect voilà ce que cela me donne:
        claude@claude-M60J:~$ gst-inspect x264enc
        Aucun élément ou greffon « x264enc »
        Pour le Faac, c’est ok! Je n’y comprend plus rien…

        • Je ne comprends pas… Tu as bien utilisé le script mp4encoder.sh ? Si c’est le cas, le script en question (comme les autres d’ailleurs) vérifie que tu as les bons plugins avant de se lancer…

          Pour analyser ton fichier lance la commande suivante:

          # ffmpeg -i tonfichier.mp4

          Il va te donner des infos sur pistes vidéo et audio (codec, débit, fréquence…).

          • leglaude51

            Oui, je comprends que tu ne comprenne pas!
            C’est bien simple, le fichier mp4encoder.sh se plante et me met des erreurs, comme quoi je n’ai pas x264enc!
            J’ai donc utiliser la ligne de commande:
            x264 –tune animation –crf 23 -o avatar-Q9.mp4 avatar.avi
            Voilà…
            Je viens d’installer Handbrake, et je vais le tester cette nuit.
            Je te tiens au courant.
            Merci de ton aide et de ta patience envers moi!

  • Alors je comprends 🙂 ! x264 ne fait « que » de l’encodage vidéo, c’est donc normal de ne pas avoir d’audio sur ton fichier encodé…

    Ce qui est moins normal c’est de ne pas avoir le plugin Gstreamer x264enc. As tu bien suivi la procédure d’installation de GStreamer qui est donnée dans le premier paragraphe ???

    • leglaude51

      OK, J’ai fait une bourde!
      J’ai donc essayé de modifier les paramètres dans mp4encoder, soit:
      VIDEO_ENCODER_PARAMETERS= »threads=4 speed-preset= »5″
      Il a mis 3h pour encoder Avatar, mais la qualité est déplorable. A chaque mouvement, apparaît des pixels gros comme des morceaux de sucre!!
      Handbrake ne lit pas mes DVD, il met que des erreurs! Je suis maudit…
      Je vais installer une version d’Ubuntu 10.04 LTS en 64 bits, pour pouvoir exploiter au max mon portable.
      Je te tiens au courant.

  • leglaude51

    Hello Nicolargo,
    Je suis entrain de ré-encoder mes films en mp4 HD!
    Et je viens de lire un article qui m’a froid dans le dos…
    Il semblerait que Google abandonne définitivement le h264 au profit du webm!
    Qu’en penses-tu? Faut-il que je continue à encoder en h264, ou alors me mettre au webm afin d’être dans la « norme »? et question qualité? Pour moi je trouve que le mp4 est de meilleur facture que le webm, mais j’aimerais ton avis de pro! Et quel encodeur pour le webm sous windows?
    Merci d’avance pour ta réponse et à bientôt
    PS. J’ai testé le plugin vidéo-js, avec du Html5, génial, encore merci

    LG

    • Salut, sous Windows, je te conseille d’utiliser l’encoder WebM fourni directement sur le site officiel: http://www.webmproject.org/tools/.

      Pour un éclairage de la problématique des codecs vidéos sur Internet, je te conseille de lire l’article suivant:
      http://www.framablog.org/index.php/post/2011/01/20/video-web-google-chrome-webm-h264

      A+

      • leglaude51

        Merci pour les infos! En fait, on ne c’est plus à quel saint ce vouer! Pour moi, le H264 est le meilleur. J’ai converti des DVD de concerts, et c’est presque aussi bon que le DVD lui-même!
        Certes,les fichiers sont assez lourds, env. 4Gb, mais images et son c’est plus que parfait.
        Etant mon propre hébergeur, la qualité prime sur le poids.
        Quand à l’adresse que tu m’as donné pour le webm,j’ai regardé pour windows, mais il y a que 2 fichiers, et je les ai installé, mais rien…
        pas de programme d’encodage.
        Connais-tu l’astuce?
        c’est webmdshow-0.9.12.0-20101216.zip avec un instal, et vpx-vp8-debug-src-x86-win32mt-vs8-v0.9.5.zip où il n’y a que des fichiers en C!

        a+

  • leglaude51

    Encore une petite chose:
    On dit que le format webm/Vp8 est un format libre!
    Alors pourquoi les encodeurs sont payants?
    Et c’est libre jusqu’à quand? Tu ne crois pas qu’une fois que Google aura imposé son format, il y aura une redevance?

    • Je ne pense pas que Google fasse cela. En libérant ce codec c’est le meilleur moyen de l’imposer sur le marché et de le faire adopter par les services de vidéos en lignes.

      Pour l’encodeur sous Windows je suis loin d’être un spécialiste mais d’après les noms des fichiers je pense que le premier doit installer des filtres DirectShow pour l’encodage/décodage. Il faut donc que tu trouves un encodeur qui se base sur DirectShow…

  • leglaude51

    Salut NicoLargo,
    Je suis entrain de tester un logiciel gratuit pour la conversion en WebM. C’est XMedia Recode.
    Le connais-tu?
    Il a l’air de bien fonctionner. Juste question paramètres je suis pas très au clair…
    Codage en temps Réel, cela veut-il dire que si le film fait 2h, il va mettre 2 heures pour la conversion? Il y a plusieurs façon d’encodage:
    Below Normal, Normal, Above Normal, Haut, et Temps réel!
    Je ne sia le quel choisr, ayant un quad core, je penserai pour temps réel ou Haut!
    Quand penses-tu?
    A+

    • Je ne connais pas du tout cet encodeur (mais bon je n’utilise pas Windows…). Un encodage temps réel est un encodage « à la volée », c’est à dire que le flux vidéo va être traité au fur et à mesure qu’il sera lu. Je pense que la qualité associée à ce paramétrage ne doit pas être terrible. A vérifier.

      • Salut Nicolargo,
        Effectivement sais de la daube…
        Mais j’ai essayé plusieurs méthodes, mais aucune de bonnes!
        Ah, notre bien vieux Handbrake… Bon, si tu fais du WebM en HD, le poids est pratiquement le même qu’en MP4.
        Par contre, j’ai un problème avec Handbrake. En effet, il te fait un fichier en m4v, qui est du mp4, mais même en changeant l’extension en mp4, il n’est pas lu par le plugin que tu m’a donné, le Video-js Html5 pour wordpress! As-tu une idée pourquoi?
        Allez, a+
        LG

  • tintin

    j’ai besoin de transcoder des fichiers video( .mov et .mts) pour pouvoir les lire sur une TV samsung.
    malheureusement, ton script mp4encoder.sh est
    inaccessible sur ton blog (echec de telechargement avec wget).

    • Je viens juste de mettre à jour les liens…

      Bon encodage 🙂

  • marco

    Bonjour!

    Félicitations pour ce blog très complet et accessible.

    Pouvez-vous m’aider à résoudre un blocage du processus d’encodage d’un fichier ts
    –> webm? Je reste planté sur  » […] BALISE TROUVÉE : découverte
    par l’élément « aacparse1 ».
    débit maximum: 74812
    Redistribution de latence…
    progressreport0 (00:00:06): 2461696 / 3783955336 bytes ( 0,1 %) »
    Merci