Audio - Vidéo | Encodage, découpage et bidouillage

Image d'illustration

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.

Information sur le fichier vidéo

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

Quelques options FFmpeg

 -vf : video filter

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.

-aspect : ratio

Méta-donnée qui n'agit qu'au niveau du conteneur (MKV, MP4, etc.).

-aspect 16:9

Découper une vidéo

les commandes FFmpeg pour couper ou découper peuvent s'adapter à des fichier audio.

Couper le début de la vidéo

Supprimer les 5 premières secondes de la vidéo

ffmpeg -i input.webm -ss 5 -c copy output.webm

Couper la fin de la vidéo

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

Extraire une portion de vidéo

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

Réduire le poids d'une vidéo

Fichier simple avec 1 piste audio et sans sous-titre

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.

Fichier avec plusieurs pistes audio et/ou sous-titres

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

"-b:v" ou "-crf"

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.

Problèmes rencontrés

Une vidéo dont la seconde piste audio (en) est devenue muette après encodage.

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.

Subtitle encoding currently only possible from text to text or bitmap to bitmap

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

Intégrer (muxer) un sous-titre (srt) à un fichier vidéo

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

Récupérer une séquence d'images d'après une vidéo

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.

Créer une image animée depuis une séquence d'images

ffmpeg -framerate 12 -i img_%04d.png -vf "scale=400:-1:flags=lanczos" -c:v libwebp -loop 0 output.webp

Encodage .vob vers .mkv

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

Enregistrer ce qui se passe à l'écran

Récupérer quelques infos

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.

 Enregistrer l'activité à l'écran

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

Synchroniser un sous-titre (srt) sans décalage progressif avec "ffsubsync"

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 introuvable quand 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

MP3 vers WAV + gravure

Convertir des fichiers MP3 en WAV

ffmpeg -i fichier.mp3 fichier.wav

Automatiser la tache

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

Découper un gros.FLAC en plusieurs grâce au fichier.cue

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

Ajouter une image dans des fichiers .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

Effacer un disque réinscriptible

Avec quel outil?

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

Avec cdrdao

Rapide :

sudo cdrdao blank --device /dev/sr0

Complet :

sudo cdrdao blank --blank-mode full --device /dev/sr0

Avec wodim, cdrskin ou cdrecord

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
27-Jul-2026
^