29-11-2011 : Remettre dans le débat politique les principes du Conseil National de la Résistance
17-02-2012 : Pétition pour une protection de l’apiculture et des consommateurs face au lobby des OGM
Logo de mon site
Logo de mon site
Faire un don

Luxpopuli / Système / Multimédia / Linux : Conversion / convertir vidéo et audio pour une diffusion sur le Web / Script d'encodage de MP4 et FLV vers le format Webm / VP8





Right menu

Logo du site ez.no  Logo XHTML 1.O du W3C  Logo XHTML 1.O du W3C  Site francophone officiel de Firefox
zero papier grâce aux catalogues et promos en ligne de bonial

Linux : Conversion / convertir vidéo et audio pour une diffusion sur le Web

Table des matières

  1. Outils de conversion des formats vidéo et audio (ogg, ogv, mp4, webm, mp3, flv, etc...)
  2. Diffusion multimédia : flv, h264, mkv, mp3, mp4, ogg, ogv, webm... ?
  3. ffmpeg2theora : conversion de MP4 vers OGG (Theora & Vorbis)
  4. ffmpeg2theora : conversion de FLV vers OGG (Theora & Vorbis)
  5. FFmpeg : conversion de MP4 ou FLV vers Webm (VP8 & Vorbis)
  6. FFmpeg : conversion de AVI vers MP4 (mpeg4)
  7. Script d'encodage de MP4 et FLV vers le format Webm / VP8
  8. Webm : documentation et outils du codec VP8
  9. Convertir les fichiers audio MP3 en fichiers audio OGG
  10. Encodage vidéo : problèmes rencontrés

Script d'encodage de MP4 et FLV vers le format Webm / VP8

Date de publication: le samedi 12 novembre 2011 à 13h27
Dernière modification: par Pascal BOYER le lundi 19 décembre 2011 à 01h09

Voici un script interactif qui permet d'automatiser la conversion de toutes les vidéos MP4 et/ou FLV d'un répertoire en vidéos au format Webm.

Ce script, assez simple, est relativement commenté pour que vous compreniez rapidement ce que j'ai souhaité réaliser. Ce script permet:

  • de définir le type de fichier à convertir: MP4 et/ou FLV
  • possibilité de passer un nom de fichier en paramètre
  • si aucun fichier en paramètre alors tous les fichiers du répertoire courant seront encodés
  • de définir la valeur du paramètre -speed: 0 par défaut sinon valeur dans l'intervalle [-16, 16]
  • contrôle de toutes les données entrées
  • applique les deux commandes d'optimisation:
    • mkclean qui permet de nettoyer et d'optimiser les fichiers Webm
    • mkvalidator qui permet de contrôler la conformité des fichiers Webm
  • une petite musique prévient de la fin de l'encodage
#!/bin/bash
 
# Les 2 lignes ci-dessous placent les logs de débogage dans le fichier log.txt
#exec 2>log_`date |cut -d " " -f 5`.txt
#set -x
 
 
echo "";
echo " ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----";
echo " |   Script pour encoder des vidéos MP4 ou FLV au format WEBM pour la balise <video> HTML 5   |";
echo " ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----";
echo "";
 
echo " --- ---- ---- ---- ---- ---- ---- ---- ----  IMPORTANT ---- ---- ---- ---- ---- ---- ---- ----";
echo " |                                                                                            |";
echo " |    LES NOMS DE VOS FICHIERS VIDÉO mp4 / flv NE DOIVENT CONTENIR AUCUN ESPACE NI ACCENT     |";
echo " |                                                                                            |";
echo " --- ---- ---- ---- ---- ---- ---- ---- ----  IMPORTANT ---- ---- ---- ---- ---- ---- ---- ----";
 
 
echo "";
echo "";
echo -n "Poursuivre (o/N)>: ";
read poursuivre;
if [ "$poursuivre" != "o" ];then
 
   echo "Bye bye...";
   echo "";
   exit;
 
else
 
   if [ "$1" = "" ];then # Ici aucun fichier n'est passé en paramètre
 
      echo "";
      echo " ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----";
      echo " |  Aucun nom de fichier vidéo au format MP4 ou FLV n'est passé en paramètre donc le script   |";
      echo " |             va encoder TOUS les vichiers MP4 et/ou FLV du répertoire courant.              |";
      echo " ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----";
      echo "";
      echo "";
      echo " Quel type de fichiers faut-il encoder ?  (1=MP4  2=FLV  3=MP4 et FLV) ";
      echo "";
      echo -n "Réponse (1, 2 ou 3)>:  ";
      read typeFichier;
      typesPossibles[1]="mp4";
      typesPossibles[2]="flv";
 
      if !([ "$typeFichier" = "1" ] || [ "$typeFichier" = "2" ] || [ "$typeFichier" = "3" ]); then
 
         echo "";
         echo " Vous devez indiquer un type de fichier en répondant 1, 2 ou 3";
         echo " Bye bye...";
         echo "";
         exit;
 
      elif [ "$typeFichier" = "1" ] || [ "$typeFichier" = "2" ];then # On traite ici les fichiers MP4 ou FLV
 
         echo "";
         echo " Quelle valeur faut-il attribuer au paramètre « -speed » ? (valeur par défaut: 0)";
         echo "";
         echo -n "Réponse (-16 à 16)>:  ";
         read speed;
 
         # Si $speed n'est pas comprise entre -16 et 16 ou n'est pas vide alors on sort
         # Lorsque $speed est vide alors c'est 0 qui sera appliquée comme valeur à -speed
         # Le if ci-dessous correspond à la seule syntaxe que j'ai trouvée qui ne renvoie aucun message
         # d'erreur quelle que soit la valeur tapée par l'utilisateur (positive, négative, avec ou sans signe -,
         # numérique, alphabétique ou alphanumérique)
 
         if !([[ $speed =~ ^[\-+]?[0-9]{1}$ ]] || [[ $speed =~ ^[\-+]?[1]{1}[0-6]{1}$ ]] || [ "$speed" = "" ]); then
 
            echo "";
            echo " Vous devez indiquer une valeur comprise entre -16 et 16";
            echo " Bye bye...";
            echo "";
            exit;
 
         else # Ici $speed est bien comprise entre -16 et 16 et est bien une valeur numérique
 
            if [ "$speed" = "" ];then # Ici -speed vaut 0
 
               for i in `ls -1 *.${typesPossibles[$typeFichier]}`
                  do
                     baseFilename=`basename $i .${typesPossibles[$typeFichier]}`;
                     `ffmpeg -i $i -speed 0 -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
 
            else # Ici -speed vaut la valeur donnée par l'utilisateur
 
               for i in `ls -1 *.${typesPossibles[$typeFichier]}`
                  do
                     baseFilename=`basename $i .${typesPossibles[$typeFichier]}`;
                     `ffmpeg -i $i -speed $speed -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
            fi
         fi
 
      else # Ici on traite les fichiers MP4 et FLV
 
         echo "";
         echo " Quelle valeur faut-il attribuer au paramètre « -speed » ? (valeur par défaut: 0)";
         echo "";
         echo -n "Réponse (-16 à 16)>:  ";
         read speed;
 
         if !([[ $speed =~ ^[\-+]?[0-9]{1}$ ]] || [[ $speed =~ ^[\-+]?[1]{1}[0-6]{1}$ ]] || [ "$speed" = "" ]); then
 
            echo "";
            echo " Vous devez indiquer une valeur comprise entre -16 et 16";
            echo " Bye bye...";
            echo "";
            exit;
 
         else
 
            if [ "$speed" = "" ];then # Ici -speed vaut 0
 
               for i in `ls -1 *.mp4`
                  do
                     baseFilename=`basename $i .mp4`;
                     `ffmpeg -i $i -speed 0 -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
 
               for i in `ls -1 *.flv`
                  do
                     baseFilename=`basename $i flv`;
                     `ffmpeg -i $i -speed 0 -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
 
            else # Ici -speed vaut la valeur donnée par l'utilisateur
 
               for i in `ls -1 *.mp4`
                  do
                     baseFilename=`basename $i .mp4`;
                     `ffmpeg -i $i -speed $speed -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
 
               for i in `ls -1 *.flv`
                  do
                     baseFilename=`basename $i flv`;
                     `ffmpeg -i $i -speed $speed -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $baseFilename.webm`;
                  done
            fi
         fi
      fi
 
   else # Ici un fichier est passé en paramètre
 
      echo "";
      echo " Quelle valeur faut-il attribuer au paramètre « -speed » ? (valeur par défaut: 0)";
      echo "";
      echo -n "Réponse (-16 à 16)>:  ";
      read speed;
 
      if !([[ $speed =~ ^[\-+]?[0-9]{1}$ ]] || [[ $speed =~ ^[\-+]?[1]{1}[0-6]{1}$ ]] || [ "$speed" = "" ]); then
 
         echo "";
         echo " Vous devez indiquer une valeur comprise entre -16 et 16";
         echo " Bye bye...";
         echo "";
         exit;
 
      else
 
         if [ "$speed" = "" ];then # Ici -speed vaut 0
 
            echo "";
            echo "";
            `ffmpeg -i $1 -speed 0 -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $1.webm`;
            echo "";
            echo "";
 
         else # Ici -speed vaut la valeur donnée par l'utilisateur
 
            echo "";
            echo "";
            `ffmpeg -i $1 -speed $speed -rc_lookahead 16 -keyint_min 0 -g 360 -skip_threshold 0 -level 116 -vcodec libvpx -b 700k -ab 96k $1.webm`;
            echo "";
            echo "";
 
         fi
      fi
   fi
fi
 
# À présent on applique les commandes d'optimisation mkclean et mkvalidator
for i in `ls -1 *.webm`
   do
      echo "";
      echo "";
      echo "Optimisation: mkclean --optimize --remux $i";
      echo "";
      echo "";
      `mkclean --optimize --remux $i $i.clean`;
      `rm -f $i`;
      `mv $i.clean $i`;
      echo "";
      echo "";
      echo "Optimisation: mkvalidator $i";
      echo "";
      echo "";
      `mkvalidator $i`;
      echo "";
      echo "";
   done
 
# On joue en mode quiet un son lorsque tous les encodages sont terminés
`play -q /usr/share/sounds/KDE_Startup_new.wav`;
echo "`date` : l'encodage est terminé.";
echo "";
echo "";
exit;

 N'hésitez pas à faire des commentaires sur la qualité de mon script. N'étant pas un expert du scripting, je m'efforce de faire des scripts pratiques et exempts de dysfonctionnement. En revanche, comme je laisse de côté leur optimisation, j'en appelle à vos compétences pour contribuer à leur amélioration.

Commentaires