Last updated on 2 octobre 2017
Voir aussi : ffmpeg – premier pas
Avec ffmpeg, il est possible de convertir par lot n’importe quel format de vidéo.
Pour ce faire, voici un exemple de conversion vidéo du format H.265 en H.264 :
for i in *.mp4 ; do
ffmpeg -i "$i" -c:v libx264 -vf scale=1280:-2 -c:a copy -map 0:0 -map 0:1 "H $i"
sleep 3
done
Explication du code :
for i in *.MP4 ; do
Ceci va prendre tout les fichiers présent dans le dossier indiqué au préalable via le terminal avec l’extension .MP4 pour le traitement par lot. Pour les novices, « for » est utilisé en programmation pour faire des boucles.
ffmpeg -i "$i"
Exécute le programme ffmpeg et introduit l’input.
-map 0:0 -map 0:1
Fait comprendre à ffmpeg qu’on a besoin que des deux premiers stream, 0:0 correspond au stream vidéo, 0:1 au stream audio. Ceci est dans le but d’alléger le fichier si d’autres streams sont présents, comme une autre piste audio…etc. Cette ligne est totalement optionnelle.
-c:v libx264
Spécifies le codec. On peut personnaliser cette ligne en rajoutant par exemple -preset slow, déterminer le -crf…etc.
S’écrit aussi ainsi : -c:v au lieu de -vcodec
En savoir plus sur les options du H.264.
scale=1280:-2
On va mettre à la même résolution toutes les vidéos avec une largeur de 1280 et une hauteur proportionnelle. Utile quand les fichiers vidéos n’ont pas la même résolution.
-c:a copy
On va recopier tel quel le stream audio.
"H $i"
Vu que le nouveau fichier va se créer dans le même répertoire, on va le renommer afin de ne pas écraser le fichier source. Les nouveaux fichiers vont commencer par « H ».
sleep 3
Accorde au processus un temps de repos.
Un autre exemple pour extraire l’audio
En supposant que l’audio dans le stream 0:1 est en AAC, voici comment extraire en lot :
for i in *.MP4; do ffmpeg -i "$i" -vn -acodec copy "${i%}.aac" sleep 3 done
-vn va enlever tout les streams vidéos.
-acodec copy ou -c:a copy va simplement copier le stream audio sans le ré-encoder, ce qui représente un gain de temps dans l’extraction.
Script et Multithread
#!/bin/bash function encode { base="${1%.*}" extension="${1##*.}" out="${base}_output.${extension}" ffmpeg -i $1 -c:v libx264 -vf scale=1280:-2 -c:a copy -map 0:0 -map 0:1 $out } encode video1.mp4 & encode video2.mp4 & echo "ZZzzzzzzZZzzzzz" wait ~ ~
On peut créer aussi un script avec bash très simple afin d’automatiser la conversion en multithread, c’est à dire que chaque coeur du processeur va s’occuper d’une vidéo, ceci va considérablement accélérer la conversion.
Vous pouvez créer le script avec VIM et l’exécuter via le terminal en faisant ./nomdufichier à la racine du répertoire.
Soyez le premier à commenter