Petite commande fort sympatoche pour encoder tout un répertoire avec ffmpeg en ligne de commande.
(Il faut avoir ffmpeg d’installé: voir ici pour le compiler ou plus bas)
sous Ubuntu (avec un max de codecs):
sudo apt-get install libavcodec-unstripped-52 libavdevice-unstripped-52 libavformat-unstripped-52 libavutil-unstripped-50 libpostproc-unstripped-51 libswscale-unstripped-0 ffmpeg |
Ouvrez un shell dans le répertoire où se trouve les fichiers (videos, mp4, wav, etc) à convertirs en mp3 tapez:
for file in *.*; do `ffmpeg -i "$file" "$file.mp3"`;done |
Ffmpeg va automatiquement encoder en mp3 44khz stéréo vos fichiers en un tour de main. Vous pouvez rajouter des options de bitrate (ie: -b 192k) ou utilisez le filtre pour convertir qu’un certain type de fichier en remplacant *.* par *.avi , *.mp4, etc.
Ps: N’hésitez pas à partager vos lignes de commandes utiles, je les rajouterai si besoin (encodage audio / video)
Ma participation :
ffmpeg -threads 8 -slices 4 -y -progress progress.txt -i masource.ext -filter_complex join=inputs=2:channel_layout=2 -i logo.png -filter_complex overlay -pix_fmt yuv420p -aspect 16:9 -profile:v high -preset:v slow -s 640x360 -codec:v h264 -b:v 400k -g 250 -bf 3 -strict experimental -codec:a aac -ac 2 -b:a 160k -f mp4 madest.mp4
Un MPEG4 (h264+AAC), en utilisant plusieurs threads, avec le retour de la progression de ffmpeg (que je parse pour un suivi en temps réel), le remix de deux pistes mono en une paire stéréo, l’incrustation d’un logo en png, le bla-bla pour un bon résultat en vidéo (gop de 250, images B, profile high…).
Après cela, je passe un coup de qt-faststart, et voila, c’est prêt !
Je n’utiliserais pas ffmpeg pour ça mais sox :
ls | while read file ; do sox $file ${file%.*}.mp3 ; done
Le format de sox pour convertir est :
sox fichier1 fichier2
Pour ceux qui ne sont pas très familiers de bash, ${var%regex} enlève la plus courte chaine de charactère correspondant à “regex” à la fin de la variable var.
À noter également, il y a des oneliners sympa dans la faq du site lolicri.es pour extraire images et son en employant ffmpeg.
Ah pas mal le fait d’entourer le nom du fichier avec des guillemets. Parce que je me fais souvent avoir dans ce genre de script par les espaces dans les noms de fichiers. Et dans les noms des fichiers audio, y’a souvent des espaces!
Je connaissais pas, merci ;)
Je n’ai pas trop le temps de faire le ménage, mais je vous donne mes notes perso audio-video par souci de partage.
lien
Et pour simplement redimensionner des images par lot, vous faites comment?
Avec Convert (Imagemagick).
Je plussoie imagemagick est une pure tuerie en manipulation d’image.
J’ai des collègue sous photoshop et il hallucine de la puissance de imagemagick pour les traitements par lots ou même du graphisme de prod.Il faut se taper le man mais ça vaut le coup.
http://www.imagemagick.org/script/index.php
Attention aux backquotes
`ffmpeg -i "$file" "$file.mp3"`
car elles ont pour but de récupérer les éléments affichés par la commande ; afin de les réutiliser ailleurs (dans une variable)Exemple:
var=`pwd`; echo "Je me trouve dans $var"
ou plus simplementecho "Je me trouve dans $pwd et on est le `date`"
Ici, manifestement, récupérer le stdout de ffmpeg n’est pas utile donc pas de backquotes =>
ffmpeg -i "$file" "$file.mp3"
Ce n’est même pas une option car avec les backquotes, ce qu’affiche la commande est réutilisé dans le contexte de la ligne. Or tout premier mot de la ligne doit être impérativement une instruction shell valide. Donc si la commande ffmpeg affiche qqchose, cet affichage sera réutilisé en tant que commande shell.
Donc conclusion, réellement pas de backquotes.
Sinon j’aime bien la solution de cym13 basée sur
ls | while read var
. En effet, le for se cale sur l’espace pour travailler ce qui pose soucis sur des fichiers dont le nom contient un espace. Or, comme le read se cale sur le return et non sur l’espace, on est certain avec cette méthode de ne pas avoir de souci avec des noms contenant un espace. Toutefois ce pb ne survient que sur des instructions typefor var in `commande`
et non sur des instructions typefor var in metacharactère
car dans ce dernier cas, le shell encapsule chaque nom de guillemets.Attention aux backquotes
`ffmpeg -i "$file" "$file.mp3"`
car elles ont pour but de récupérer les éléments affichés par la commande ; afin de les réutiliser ailleurs (dans une variable).Exemple:
var=`pwd`; echo "Je me trouve dans $var"
ou plus simplementecho "Je me trouve dans `pwd` et on est le `date`"
Ici, manifestement, récupérer le stdout de ffmpeg n’est pas utile donc pas de backquotes =>
ffmpeg -i "$file" "$file.mp3"
Ce n’est même pas une option car avec les backquotes, ce qu’affiche la commande est réutilisé dans le contexte de la ligne. Or tout premier mot de la ligne doit être impérativement une instruction shell valide. Donc si la commande ffmpeg affiche qqchose, cet affichage sera réutilisé en tant que commande shell.
Donc conclusion, réellement pas de backquotes.
Sinon j’aime bien la solution de cym13 basée sur
ls | while read var
. En effet, le for se cale sur l’espace pour travailler ce qui pose soucis sur des fichiers dont le nom contient un espace. Or, comme le read se cale sur le return et non sur l’espace, on est certain avec cette méthode de ne pas avoir de souci avec des noms contenant un espace. Toutefois ce pb ne survient que sur des instructions typefor var in `commande`
et non sur des instructions typefor var in metacharactère
car dans ce dernier cas, le shell encapsule chaque nom de guillemets.Très exactement le shell n’utilise pas des regex mais des wildcards
${var%regex}${var%wildcard}${var%regex} ${var%wildcard}
D’accord! Ça m’a chiffonné cette histoire.