Table des matières
- Outils de conversion des formats vidéo et audio (ogg, ogv, mp4, webm, mp3, flv, etc...)
- Diffusion multimédia : flv, h264, mkv, mp3, mp4, ogg, ogv, webm... ?
- ffmpeg2theora : conversion de MP4 vers OGG (Theora & Vorbis)
- ffmpeg2theora : conversion de FLV vers OGG (Theora & Vorbis)
- FFmpeg : conversion de MP4 ou FLV vers Webm (VP8 & Vorbis)
- FFmpeg : conversion de AVI vers MP4 (mpeg4)
- Script d'encodage de MP4 et FLV vers le format Webm / VP8
- Webm : documentation et outils du codec VP8
- Convertir les fichiers audio MP3 en fichiers audio OGG
- 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














