[FFMPEG] – Encoder un répertoire entier en mp3 13


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)

13 thoughts on “[FFMPEG] – Encoder un répertoire entier en mp3

  • hdsdi3g

    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 !

  • cym13

    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.

  • Cédric

    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!

  • Max Post author

    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.

    Je connaissais pas, merci ;)

  • Fred

    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 simplement echo "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 type for var in `commande` et non sur des instructions type for var in metacharactère car dans ce dernier cas, le shell encapsule chaque nom de guillemets.

  • Fred

    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 simplement echo "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 type for var in `commande` et non sur des instructions type for var in metacharactère car dans ce dernier cas, le shell encapsule chaque nom de guillemets.

Leave a comment

Des questions Python sans rapport avec l'article ? Posez-les sur IndexError.