
Voici une liste non exhaustive de différents outils et commandes que j'ai eu besoin d'utiliser pour travailler sur des fichiers audio et vidéo. FFmpeg y tient naturellement une place importante mais j'y explore aussi d'autres paquets pour des usages plus spécifiques.
On peut obtenir des informations sur un fichier vidéo de plusieurs manières avec FFmpeg, mais l'outils recommandé et fourni est FFprobe.
ffprob FICHIER_VIDEO
Redimensionne la vidéo à 1280x720 (largeurxhauteur)
-vf scale=1280:720
Coupe une portion de l’image (rect 640x360 à partir du coin haut-gauche)
-vf crop=640:360:0:0
Désaturation (noir&blanc)
-vf "hue=s=0"
Rotation de 90° dans le sens horaire
-vf "transpose=0"
Rotation de 90° dans le sens antihoraire
-vf "transpose=1"
Rotation de 90° dans le sens horaire + miroir vertical
-vf "transpose=2"
Rotation de 90° dans le sens antihoraire + miroir vertical
-vf "transpose=3"
Rotation de 180°
-vf "transpose=1,transpose=1"
-vf "rotate=PI"
Rotation de 33° horaire / antihoraire (rad = deg*PI/180)
-vf "rotate=-33*PI/180"
-vf "rotate=33*PI/180"
Miroir vertical / horizontal
-vf "vflip"
-vf "hflip"
Ajuste la luminosité et le contraste
-vf "eq=contrast=1.5:brightness=0.1"
Sample Aspect Ratio (SAR) ou Pixel Aspect Ratio (PAR) largeur/hauteur d’un pixel (1 == 1:1)
-vf "setsar=1"
Display Aspect Ratio (DAR), indique comment l’image doit être affichée peut importe la résolution.
-vf "setdar=16:9"
On peut enchaîner les arguments en les séparant par une virgule, dans ce cas les guillemets deviennent indispensables:
"scale=-2:720,setsar=1,setdar=16/9"De manière générale, il est recommandé d'utiliser les guillemets car certains caractères, comme la barre oblique /, pourraient être mal interprétés.
Méta-donnée qui n'agit qu'au niveau du conteneur (MKV, MP4, etc.).
-aspect 16:9
les commandes FFmpeg pour couper ou découper peuvent s'adapter à des fichier audio.
Supprimer les 5 premières secondes de la vidéo
ffmpeg -i input.webm -ss 5 -c copy output.webm
En fait on ne supprime pas le fin de la vidéo mais au contraire on garde un certain temps du début. Ce temps doit être donné en seconde :
ffmpeg -i input.webm -t 4800 -c copy output.webm
L'option -c copy est rapide puisqu'elle ne ré-encode pas la vidéo mais peut, en retour, manquer de précision sur le point de coupure qui se situe au niveau des GOPs (groupes d’images compressées).
Découper à partir de 1mn30 sur une durée de 20 secondes :
ffmpeg -ss 00:01:30 -i input.mp4 -t 00:00:20 output.mp4
Découper à partir de 1mn30 jusqu'à 1mn50. ATTENTION -ss et -to doivent se suivre :
ffmpeg -ss 00:01:30 -to 00:01:50 -i input.mp4 output.mp4
Découper à partir de 1mn30 sur une durée de 20 secondes avec ré-encodage fin:
ffmpeg -ss 00:01:30 -i input.mp4 -t 00:00:20 -c:v libx264 -c:a aac output.mp4
Avec l'option -c copy, ffmpeg coupe au keyframe le plus proche. C'est plus rapide mais moins précis :
ffmpeg -ss 00:01:30 -to 00:01:50 -c copy -i input.avi output.mp4
ffmpeg -i input.mkv \
-vf scale=-2:720 \
-c:v libx264 \
-b:v 930k \
-preset faster \
-c:a aac \
-b:a 128k \
output.mp4
L'option "preset" est propre à l'encodeur libx264 et ne sera pas forcément disponible avec un autre codec.
ffmpeg -i input.mkv -vf scale=-2:720 \
-map 0:v:0 -map 0:a -map 0:s \
-c:v libx264 -b:v 930k -preset faster \
-c:a aac -b:a 128k \
-c:s mov_text \
-max_muxing_queue_size 1024 \
-shortest output.mp4
Plutôt que l'option "-b:v" qui force un bitrate constant et permet le contrôle du poids final de la vidéo, l'option "-crf" quand à elle, maintiens un niveau de qualité visuelle (mouvements, grain, action).
Un CRF à 18 donnera un résultat de très haute qualité. 23 est un bon compromis entre qualité et poids. 26 et plus correspond à une compression très agressive.
Après analyse (ffmpeg -i => Stream #0:2(eng): Audio: ac3, 48000 Hz, 5.1(side), fltp, 256 kb/s), on vois que le la piste audio du fichier source était encodée en AC3 5.1 et que ma commande de ré-encodage l'a converti en AAC 5.1. Donc, soit le lecteur ne supporte pas bien l’AAC multicanal, soit c'est une erreur de FFmpeg qui a mal gérer l'encodage (canaux mal mappés → résultat silencieux).
Solution 1 : Forcer une conversion en stéréo (2.0) quitte à perdre le "surround 5.1".
ffmpeg -i input.mkv \
-vf scale=-2:720 \
-map 0:v:0 -map 0:a -map 0:s \
-c:v libx264 -b:v 930k -preset slow \
-c:a aac -b:a 128k -ac 2 \
-c:s mov_text -max_muxing_queue_size 1024 \
-shortest output.mp4
Solution 2 : Garder la piste 5.1 mais corriger le "mapping" des canaux.
ffmpeg -i input.mkv \
-vf scale=-2:720 \
-map 0:v:0 -map 0:a -map 0:s \
-c:v libx264 -b:v 930k -preset slow \
-c:a aac -b:a 192k -ac 6 \
-c:s mov_text -max_muxing_queue_size 1024 \
-shortest output.mp4
j'avoue ne pas avoir essayé de conserver le format vidéo original MKV.
Ce message signifie que le sous-titre n'est pas compatible avec le format MP4. Rendre le sous-titre compatible avec ce format implique de l'extraire puis de le Convertir en .srt avec un outil OCR avant de le réinjecter avec l'option mov_text. Le plus simple étant de le conserver telle quel avec le format MKV.
ffmpeg -i input.mkv \
-vf scale=-2:720 \
-map 0 \
-c:v libx264 -b:v 930k -preset faster \
-c:a aac -b:a 128k \
-c:s copy \
-max_muxing_queue_size 1024 \
-shortest output.mkv
Le fichier est intégré au fichier mais pas incrusté dans l'image. Vous pourrez ou non, l'activer lors de la lecture de la vidéo.
Avant tout, s'assurer que le fichier est écrit au format UTF-8
file subs.srt
Si cette commande ne retourne pas quelque chose comme Unicode text ou UTF-8 text c'est que le fichier n'est probablement pas encodé en UTF-8.
Cas courant d'un fichier.srt créé sur Windows :
file subs.srt
subs.srt: Non-ISO extended-ASCII text, with CRLF line terminators
Convertir ce fichier en UTF-8 avec iconv.
iconv -f WINDOWS-1252 -t UTF-8 subs.srt -o subs_utf8.srt
Facultatif mais prudent, normaliser les fins de ligne.
sed -i 's/\r$//' subs_utf8.srt
Après ça la commande file devrait retourner :
subs_utf8.srt: Unicode text, UTF-8 text
Maintenant que le fichier srt est bien encodé on peut le "muxer" dans le fichier vidéo sans tout ré-encoder. J'ai généralement deux formats de fichiers vidéo ; MP4 et MKV. La commande diffère légèrement selon le format.
Muxer un sous-titre dans un MKV
ffmpeg -i input.mkv -i fr.srt \
-map 0 -map 1 \
-c copy \
-c:s srt \
-metadata:s:s:0 language=fra \
-metadata:s:s:0 title="Français" \
output.mkv
Muxer un sous-titre dans un MP4
ffmpeg -i input.mp4 -i fr.srt \
-map 0 -map 1 \
-c copy \
-c:s mov_text \
-metadata:s:s:0 language=fra \
-metadata:s:s:0 title="Français" \
output.mp4
Hormis les fichiers d'entrée et de sortie, la seule différence est l'option "-c:s" qui est facultative pour le format MKV et qui prend le paramètre "mov_text" pour le MP4.
Le conteneur AVI ne supporte pas nativement les pistes de sous-titres intégrées. Il suffit d'utiliser une des deux commandes ci dessus mais d'indiquer le nom du fichier.avi en entré.
Muxer plusieurs sous-titres
ffmpeg -i input.mp4 \
-i fr.srt -i en.srt -i es.srt \
-map 0 -map 1 -map 2 -map 3 \
-c copy \
-c:s mov_text \
-metadata:s:s:0 language=fra -metadata:s:s:0 title="Français" \
-metadata:s:s:1 language=eng -metadata:s:s:1 title="English" \
-metadata:s:s:2 language=spa -metadata:s:s:2 title="Español" \
output.mp4
ffmpeg -i video.mp4 -ss 00:01:00 -to 00:02:00 -vf "fps=0.5" img_%04d.png
Si vous placez -ss avant l'option -i, FFmpeg se déplace rapidement à la position donnée dans le fichier d'entrée avant de commencer le traitement. C'est plus rapide mais moins précis.
ffmpeg -framerate 12 -i img_%04d.png -vf "scale=400:-1:flags=lanczos" -c:v libwebp -loop 0 output.webp
Vous disposez d'un répertoire VIDEO_TS qui contient une suite de documents .IFO, .BUF et surtout .VOB.
Créez une liste (par exemple liste.txt) contenant les fichiers .vob, tous ne sont généralement pas utiles.
file 'VTS_01_1.VOB'
file 'VTS_01_2.VOB'
file 'VTS_01_3.VOB'
file 'VTS_01_4.VOB'
file 'VTS_01_5.VOB'
Ceci fait exécutez cette commande:
ffmpeg -f concat -safe 0 -i liste.txt -map 0:v -map 0:a? -map 0:s? -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k -c:s mov_text output.mkv
Identifier la résolution de son écran :
xrandr | grep '*'
Qui chez moi retourne : 1600x1200 60.00*+
Lister les sources audio :
pactl list short sources
Retourne chez moi :
0 alsa_input.usb-GENERAL_GENERAL_WEBCAM_JH0802_20211110_v011-02.mono-fallback module-alsa-card.c s16le 1ch 16000Hz SUSPENDED
1 alsa_output.pci-0000_29_00.6.analog-stereo.monitor module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
2 alsa_input.pci-0000_29_00.6.analog-stereo module-alsa-card.c s16le 2ch 44100Hz SUSPENDED
On distingue 3 sources audio ; la première (0) identifiée comme "WEBCAM" est en fait un microscope USB qui déclare aussi une interface audio USB même s'il n'en a pas réellement (compatibilité Windows). Ce sont les deux autres vont nous intéresser puisqu'il s'agit (1) de la sortie audio système, les hauts parleurs branchés sur ma carte son et (2) le micro lui aussi branché sur ce périphérique.
Capturer tout l'écran
ffmpeg -video_size 1600x1200 -framerate 30 -f x11grab -i :0.0 output.mp4
Capturer une zone de l'écran
ffmpeg -video_size 800x600 -framerate 30 -f x11grab -i :0.0+100,100 output.mp4
Installer ffsubsync
pip install ffsubsync
réaligner automatiquement les sous-titres
ffsubsync "video.avi" -i video.srt -o video-sync.srt
Chez moi l'installation s'est correctement déroulée mais avec ce message d'avertissement :
WARNING: The scripts ffs, ffsubsync and subsync are installed in '/home/manu/.local/bin' which is not on PATH.Cela signifie que le répertoir où à été installé ffsubsync n'est pas dans ma variable globale $PATH entraînant du coup l'erreur
bash: ffsubsync : commande introuvablequand on lance la commande.
Soit on ajoute ~/.local/bin au PATH, soit on lance la commande avec le chemin complet :~/.local/bin/ffsubsync "video.avi" -i video.srt -o video-sync.srt
ffmpeg -i fichier.mp3 fichier.wav
Convertir en .wav, tous les fichiers .mp3 trouvés dans le répertoire courant tout en conservant leur nom original.
shopt -s nocaseglob
for fichier in *.mp3; do
ffmpeg -i "$fichier" "${fichier%.*}.wav"
done
shopt -u nocaseglob
Si besoin installer les paquets :
sudo apt install shntool cuetools flac
Puis :
shnsplit -f "fichier.cue" -t "%n - %t" -o flac "gros fichier.flac"
Si les méta données existent dans le fichier .cue on peut aussi les ajouter :
cuetag "fichier.cue" *.flac
Si besoin :
apt install flac
Puis, en supposant que vous ayez un fichier cover.jpg (ou png) dans le dossier courrant :
for f in *.flac; do
metaflac --remove --block-type=PICTURE "$f"
metaflac --import-picture-from="cover.jpg" "$f"
done
Pas de ré-encodage donc sans perte
Il existe un grand nombre d'applications capables d’interagir avec un lecteur/graveur de CD/DVD. Je montre ici quelques commandes pour les plus courantes. Toutefois, avant d'installer quoi que ce soit, il peut être intéressant de chercher celle déjà présente sur sa distribution. On peut faire ça avec une cherche par mots clés parmis les programmes installés :
dpkg -l | grep -i "cd\|dvd\|burn\|record"
Contrairement aux CDs audio, Linux monte automatiquement les CDs de données à l'insertion, vous devrez les démonter avant de pouvoir les modifier :
sudo umount /dev/sr0
Rapide :
sudo cdrdao blank --device /dev/sr0
Complet :
sudo cdrdao blank --blank-mode full --device /dev/sr0
Pour ces trois applications les commandes sont identiques, seul le nom change.
Rapide :
sudo wodim -v dev=/dev/sr0 blank=fast
Complet :
sudo wodim -v dev=/dev/sr0 blank=all