ffmpeg

Avertissement

Cette page est en cours de rédaction et n’est pas terminée.

Il s’agit d’un brouillon. J’ai défini un ensemble de sections, mais ce n’est pas garanti que toutes seront remplies ou présentes dans la version finale.

Avant-propos

Ce document n’a pas la prétention d’être entièrement exaustif sur toutes les possibilités de ffmpeg.

Il ne contient que les paramètres que j’utilise le plus, ou que j’ai eu à utiliser.

Les bases

ffmpeg est un outil en ligne de commande. Il existe des interfaces graphiques se greffant par dessus, mais tous les paramètres ne sont pas forcément accessibles.

ffmpeg est en fait constitué de trois outils :

  • ffmpeg : encodage, transcodage, etc ;
  • ffplay : lecture et test des Filtres ;
  • ffprobe : affichage des caractéristiques techniques du fichier média (son, vidéo).

Quelques rappels

Conteneur

Il faut bien séparer la notion de vidéo de la notion de conteneur.

  • Le conteneur, c’est le verre.
  • La vidéo : c’est le liquide (par exemple de l’eau) que l’on met dans le verre.

Avec le même verre (conteneur), on peut utiliser divers contenus. On peut y verser de l’eau, de la limonade, un soda, etc.

Codec

CODEC, pour COdeur DÉCodeur (en français). Il s’agit du nom de l’outil permettant de compresser les images et les sons via des opérations mathématiques.

  • On compresse pour réduire la taille de l’image avec le COdeur.
  • On décompresse l’image avec le DÉCodeur avant de l’afficher sur l’écran.

Avec l’évolution technologique et la puissance des machines augmentant sans arrêt, de nouveaux codecs, permettant de réduire la taille des fichiers tout en prenant en compte des images de plus en plus grandes, sortent régulièrement.

Par exemple, le Video CD (VCD), sorti en 1993, stockait la vidéo au format MPEG 1.

  • La résolution était de 352x288 en PAL/SECAM, et 352x240 en NTSC.
  • L’audio était stocké au format MP2 (le prédécesseur du célèbre MP3).
  • La durée maximale de la vidéo était de 74 minutes.

Le DVD vidéo, sorti en 1996, stocke la vidéo au format MPEG2.

  • La résolution est de 720x576 en PAL, et 720x480 en NTSC.
  • L’audio peut être stockée en AC-3 (Dolby Digital), MP2, DTS voire PCM (sans compression).
  • La durée maximale (sur un DVD9) est de 4 heures.

Le Blu-Ray, sorti en 2006 (2000 pour le format en lui-même), stocke la vidéo aux formats MPEG2 ou MPEG4-part10 (H.264/AVC).

  • La résolution varie entre 720x576 et 3840x2160. On retrouve le plus fréquemment les résolutions de 1920x1080 (16:9) et 1440x1080 (4.3), on PAL comme en NTSC.
  • L’audio peut être stocké en LPCM (non compressé), en AC-3 (Dolby Digital), Dolby Digital Plus, Dolby TrueHD (compression sans perte), DTS, DTS-HD, DTS-HD-MA (compression avec pertes + complément sans pertes), DRA, Dolby Atmos…
  • La durée maximale (sur un disque de 50 Go) est de 9h en 1920x1080 et de 23h en 720x576.

Note

Les codecs ne sont pas figés et peuvent évoluer.

On désigne chaque révision par un profil (baseline, main, high, …).

Les décodeurs matériels peuvent ne supporter qu’un nombre limité de profils. Par exemple, un décodeur matériel à bas coût ne pourrait supporter que les profils baseline et main, car nécessitant moins de ressources que le profil high.

Virer la bannière

La bannière qui apparaît à chaque lancement est très pénible

ffmpeg version 3.4.2-2+b1 Copyright (c) 2000-2018 the FFmpeg developers
built with gcc 7 (Debian 7.3.0-16)
configuration: --prefix=/usr --extra-version=2+b1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
avcodec     configuration: --prefix=/usr --extra-version=2+b1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared --enable-version3 --disable-doc --disable-programs --enable-libopencore_amrnb --enable-libopencore_amrwb --enable-libtesseract --enable-libvo_amrwbenc
libavutil      55. 78.100 / 55. 78.100
libavcodec     57.107.100 / 57.107.100
libavformat    57. 83.100 / 57. 83.100
libavdevice    57. 10.100 / 57. 10.100
libavfilter     6.107.100 /  6.107.100
libavresample   3.  7.  0 /  3.  7.  0
libswscale      4.  8.100 /  4.  8.100
libswresample   2.  9.100 /  2.  9.100
libpostproc    54.  7.100 / 54.  7.100

Heureusement, on peut la masquer avec le paramètre

-hide_banner

Ne pas hésiter à créer un alias dans son bashrc, zshrc ou autre pour ne plus avoir à taper ce paramètre.

alias ffmpeg=ffmpeg -hide_banner

Utilisation de base

Note

Je parlerai de media et non de vidéo, vu que ffmpeg peut traiter aussi bien de la vidéo que de l’audio (et même les deux en même temps).

L’utilisation de ffmpeg est simple. On prend un fichier source, qui sera utilisé en entrée, avec un ensemble de paramètres, qui définiront ce que l’on veut obtenir, et qui donnera au final un fichier de destination.

ffmpeg -i <fichier source> paramètres <fichier de destination>

Par exemple :

ffmpeg -i cucumber.mp4 -c:v libx264 -tune animation -vf "scale=-1:720" -crf 23 -c:a copy cucumber-720p.mp4

On a donc :

  • fichier source : cucumber.mp4
  • fichier cible : cucumber-720p.mp4
  • paramètres : -c:v libx264 -tune animation -vf « scale=-1:720 » -crf 23 -c:a copy

L’encodage donne beaucoup d’informations. Ici, on a obtenu :

ffmpeg -i cucumber.mp4 -c:v libx264 -tune animation -vf "scale=-1:720" -crf 23 -c:a copy cucumber-720p.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cucumber.mp4':
Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.71.100
Duration: 00:01:58.96, start: 0.000000, bitrate: 3148 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 2880x2160 [SAR 1:1 DAR 4:3], 2983 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
    handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 157 kb/s (default)
    Metadata:
    handler_name    : SoundHandler
File 'cucumber-720p.mp4' already exists. Overwrite ? [y/N] y
Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (copy)
Press [q] to stop, [?] for help
[libx264 @ 0x55df0c35e560] using SAR=1/1
[libx264 @ 0x55df0c35e560] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2 AVX XOP FMA3 BMI1
[libx264 @ 0x55df0c35e560] profile High, level 3.1
[libx264 @ 0x55df0c35e560] 264 - core 152 r2854 e9a5903 - H.264/MPEG-4 AVC codec - Copyleft 2003-2017 - http://www.videolan.org/x264.html - options: cabac=1 ref=6 deblock=1:1:1 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=0.40:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=6 lookahead_threads=1 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=5 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=crf mbtree=1 crf=23.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:0.60
Output #0, mp4, to 'cucumber-720p.mp4':
Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.83.100
    Stream #0:0(und): Video: h264 (libx264) (avc1 / 0x31637661), yuv420p, 960x720 [SAR 1:1 DAR 4:3], q=-1--1, 30 fps, 15360 tbn, 30 tbc (default)
    Metadata:
    handler_name    : VideoHandler
    encoder         : Lavc57.107.100 libx264
    Side data:
    cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: -1
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 157 kb/s (default)
    Metadata:
    handler_name    : SoundHandler
frame= 3568 fps= 44 q=-1.0 Lsize=   13094kB time=00:01:58.93 bitrate= 901.9kbits/s speed=1.45x
video:10689kB audio:2284kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.925057%
[libx264 @ 0x55df0c35e560] frame I:28    Avg QP:18.78  size: 34398
[libx264 @ 0x55df0c35e560] frame P:1130  Avg QP:22.74  size:  5832
[libx264 @ 0x55df0c35e560] frame B:2410  Avg QP:28.14  size:  1407
[libx264 @ 0x55df0c35e560] consecutive B-frames: 11.2% 11.0%  8.2% 11.8% 12.3% 45.4%
[libx264 @ 0x55df0c35e560] mb I  I16..4: 42.6% 31.4% 26.0%
[libx264 @ 0x55df0c35e560] mb P  I16..4:  4.4%  4.8%  2.9%  P16..4: 11.4%  3.7%  1.9%  0.0%  0.0%    skip:70.8%
[libx264 @ 0x55df0c35e560] mb B  I16..4:  0.4%  0.3%  0.3%  B16..8: 13.9%  2.0%  0.4%  direct: 0.3%  skip:82.5%  L0:48.4% L1:48.7% BI: 2.9%
[libx264 @ 0x55df0c35e560] 8x8 transform intra:37.1% inter:54.3%
[libx264 @ 0x55df0c35e560] coded y,uvDC,uvAC intra: 19.9% 31.3% 22.8% inter: 1.7% 2.4% 1.0%
[libx264 @ 0x55df0c35e560] i16 v,h,dc,p: 36% 59%  3%  2%
[libx264 @ 0x55df0c35e560] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu: 25% 29% 38%  1%  1%  1%  1%  1%  1%
[libx264 @ 0x55df0c35e560] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu: 29% 22% 19%  5%  5%  6%  5%  5%  4%
[libx264 @ 0x55df0c35e560] i8c dc,h,v,p: 59% 26% 13%  2%
[libx264 @ 0x55df0c35e560] Weighted P-Frames: Y:2.7% UV:2.6%
[libx264 @ 0x55df0c35e560] ref P L0: 53.0%  5.4% 15.0% 10.0%  6.8%  7.6%  2.2%  0.0%
[libx264 @ 0x55df0c35e560] ref B L0: 70.0% 15.1%  8.9%  4.1%  1.9%
[libx264 @ 0x55df0c35e560] ref B L1: 93.8%  6.2%
[libx264 @ 0x55df0c35e560] kb/s:736.21

Avertissement

Cela semble compliqué à première vue, mais en fait, cela se compose de plusieurs parties.

Tout d’abord, les informations sur le fichier source :

Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cucumber.mp4':
Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.71.100
Duration: 00:01:58.96, start: 0.000000, bitrate: 3148 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 2880x2160 [SAR 1:1 DAR 4:3], 2983 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
    handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 157 kb/s (default)
    Metadata:
    handler_name    : SoundHandler

On a tout d’abord le type de conteneur du fichier média.

Ici, le conteneur est de type mov,mp4,m4a,3gp,3g2,mj2. Les extensions sont différentes, mais c’est le même type de conteneur.

Ensuite, on a des métadonnées. Elles ne sont pas forcément importantes. On y retrouve généralement le logiciel qui a encodé la vidéo (ici lavf, en version 57.71.100), parfois le titre (ici, non renseigné).

En dessous, on trouve les informations sur la durée du fichier. Ici, c’est 1 minute, 58 secondes et 96 centièmes.

Le bitrate moyen (si bitrate variable) ou constant (cela dépend du codec utilisé) est également affiché. Ici, 3 148 kb/s.

En dessous, on retrouve les informations intéressantes.

Chaque flux (Stream) est désigné par un numéro. En général, la vidéo est sur #0:0, la première langue audio sur #0:1, la seconde langue sur #0:2, les sous-titres d’une première langue sur #0:3, etc.

Ici, le flux #0:0 contient la vidéo (VideoHandler), au format (codec) h264, en profil « high », avec une résolution de 2880x2160 (4:3), avec un bitrate moyen de 2 983 kb/s, et une vitesse de 30 images par secondes.

Le flux #0:1 contient de l’audio (SoundHandler), au format aac LC, avec une fréquence d’échantillonnage de 44 100Hz en stéréo, et un bitrate moyen de 157 kb/s.

Note

la commande ffprobe affiche exactement les mêmes informations.

Résultat de la commande ffprobe avec le même fichier source :

ffprobe cucumber.mp4
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'cucumber.mp4':
Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf57.71.100
Duration: 00:01:58.96, start: 0.000000, bitrate: 3148 kb/s
    Stream #0:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 2880x2160 [SAR 1:1 DAR 4:3], 2983 kb/s, 30 fps, 30 tbr, 15360 tbn, 60 tbc (default)
    Metadata:
    handler_name    : VideoHandler
    Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 157 kb/s (default)
    Metadata:
    handler_name    : SoundHandler

La section suivante indique comment va être organisé l’encodage.

Stream mapping:
Stream #0:0 -> #0:0 (h264 (native) -> h264 (libx264))
Stream #0:1 -> #0:1 (copy)

Ici, il n’y a qu’un seul flux vidéo et qu’un seul flux audio. Le mappage est donc le même.

Si le média source contenait plusieurs flux audio, on pourrait soit tous les encoder (ou les copier tels quels), soit n’en sélectionner qu’un seul (ou plusieurs).

Note

Ne pas tenir compte de la ligne suivante :

File “cucumber-720p.mp4” already exists. Overwrite ? [y/N] y

Cette ligne n’apparaît que pour confirmer le remplacement de la vidéo de destination déjà existante.

Encodage de l’audio

Extraction simple et conversion en MP3

L’extraction de l’audio est très simple :

ffmpeg -i <fichier source> -vn -acodec mp3 <fichier destination.mp3>

On utilise le paramètre -vn pour indiquer que l’on ne traitera pas de l’audio.

On indique que l’on souhaite utiliser le codec MP3.

Si on ne précise pas le bitrate, la valeur de 128kb/s sera utilisée par défaut. Si on souhaite utiliser un bitrate de 192kb/s, il suffit de le préciser avec le paramètre suivant :

-b:a 192k

Exemple :

ffmpeg -i cucumber.mp4 -vn -acodec mp3 -b:a 192k cucumber.mp3

Cas de plusieurs flux audio

Il faut alors préciser quel flux audio on veut traiter. Pour cela, on affiche les informations avec ffprobe, puis on spécifie la piste avec le paramètre -map.

Informations remontées par ffprobe :

ffprobe A\ Silent\ Voice\ VOSTFR-VF.mkv

Stream #0:0(jpn): Video: h264 (High), yuv420p(progressive), 1920x1080 [SAR 1:1 DAR 16:9], 23.98 fps, 23.98 tbr, 1k tbn, 47.95 tbc (default)
Stream #0:1(fre): Audio: aac (LC), 48000 Hz, 6 channels, fltp (default)
Stream #0:2(jpn): Audio: aac (LC), 48000 Hz, 6 channels, fltp
Stream #0:3(fre): Subtitle: ass (default) (forced)

Dans ce fichier, il y a 4 pistes. Une vidéo, avec l’id 0:0, deux pistes audio aac 5.1, en japonais avec l’id 0:1, en français avec 0:2, et une piste de sous-titres ass avec l’id 0:3

Pour l’exemple, je veux extraire uniquement la piste audio en français, donc 0:2.

Extraction de la seconde piste audio :

ffmpeg -i A\ Silent\ Voice\ VOSTFR-VF.mkv -vn -map 0:2 -c:a mp3 -b:a 192k  A\ Silent\ Voice\-vf.mp3

Guessed Channel Layout for Input Stream #0.1 : 5.1
Guessed Channel Layout for Input Stream #0.2 : 5.1
Input #0, matroska,webm, from 'A Silent Voice VOSTFR-VF.mkv':

Et on voit que seule la piste audio 0:2 est extraite :

Stream mapping:
  Stream #0:2 -> #0:0 (aac (native) -> mp3 (libmp3lame))
Press [q] to stop, [?] for help
Output #0, mp3, to 'A Silent Voice-vf.mp3

Encodage de la vidéo

Plusieurs fichiers pour la source

Découpage

Crop

Temps

Encodage, transcodage

Conteneur mov/mp4

Ce conteneur stocke l’index à la fin du fichier.

On peut indiquer à ffmpeg que l’on veut que cet index soit au début du fichier.

Pour cela, il suffit d’ajouter le paramètre suivant :

-movflags faststart

Lien vers la documentation : https://ffmpeg.org/ffmpeg-formats.html#mov_002c-mp4_002c-ismv

Vers h264

Encodage matériel

Encodage logiciel

Vers h265

Encodage matériel

Encodage logiciel

Filtres

Désentrelacement

Filtre : yadif

Ce filtre de désentrelacement est assez efficace, lorsqu’utilisé avec le paramètre 1 (doubleur d’images). Cela permet de faire une conversion 50i -> 50p.

Par défaut, le paramètre est à 0 (50i -> 25p).

Exemple : :

ffmpeg -i mavideo.mp4 -c:a copy -c:v libx264 -vf yadif=1 sortie.mp4

http://ffmpeg.org/ffmpeg-filters.html#yadif-1

Sous-titres et karaoké

Fichier de sous-titres au format .ass.

Filtre : ass

Pas de difficulté particulière, il suffit d’indiquer le nom du fichier .ass à utiliser :

ass=<fichier.ass>

Exemple :

ffmpeg -i cucumber.mp4 -c:v libx264 -tune animation -vf "ass=cucumber.ass" -crf 23 -c:a copy cucumber-karaoke.mp4
Incrustation d'un fichier .ass.

Avertissement

Avec ce filtre, on est limité au format .ass (Advanced Substation Alpha). Ce qui n’est pas forcément dérangeant si on utilise aegisub.

Lien vers la documentation : https://ffmpeg.org/ffmpeg-filters.html#ass

Fichier de sous-titres au format pgs (conteneur sub).

Là, c’est un peu plus compliqué. Ce format utilisé avec les Blu-Ray est similaire au format vobsub. Ce sont des images avec une information indiquant à quel moment les afficher.

Il y a deux possibilités :

  • Extaire les images et les passer dans un logiciel de reconnaissance optique de caractères (OCR). Ça fonctionne relativement bien, mais c’est très consommateur de temps en relecture et corrections (par exemple, tous les e se sont changés en o). Une fois validé, on peut brûler le sous-titres avec le filtre ass.
  • Brûler les sous-titres tels-quels.

Dans ce second cas, c’est un peu plus compliqué. En effet, on ne peut pas utiliser le filtre ass, qui demande un fichier texte.

On utilisera alors le paramètre filter_complex, comme ceci :

ffmpeg -i source.mkv -c:a aac -c:v libx264 -filter_complex "[0:v]yadif=1[y];[y][0:s:0]overlay[v]" -map "[v]" -map 0:1 sortie.mp4

Explications :

On part de la source vidéo [0:v], sur laquelle le filtre yadif est d’abord appliqué (ici, la vidéo étant entrelacée, il faut d’abord la désentrelacer avant de brûler les sous-titres). La sortie de yadif est définie sur [y]. On utilise ensuite le filtre overlay, qui prend deux sources en entrée. D’où l’utilisation de [y] suivi de la source des sous-titres [0:s:0]. La sortie du filtre overlay est envoyé sur [v], qui est ensuite mappé comme source vidéo via -map « [v] ». Comme on utilise le paramètre map, il peut être nécessaire de préciser également le mapage de l’audio avec -map 0:1.

C’est un peu complexe, mais pas insurmontable.

Note

Ici, le fichier de sous-titres est contenu dans le conteneur mkv source. On peut très bien utiliser un fichier externe pour les sous-titres.

Tracer un rectangle

Filtre : drawbox.

J’ai déjà eu à masquer par un rectangle noir une portion de vidéo.

Le seul truc : le rectangle ne doit pas être affiché tout au long de la vidéo, mais seulement sur une partie.

Première difficulté : trouver les coordonnées du rectangle. Pour cela, il n’y a pas 36 solutions. Celle que j’utilise :

  • Lancer la vidéo dans smplayer (un frontend au dessus de mpv) ;
  • Prendre une capture de la vidéo (snapshot) via la touche “S” ;
  • Ouvrir l’image avec The GIMP ;
  • Utiliser l’outil de sélection rectangulaire, et regarder les coordonnées qui s’affichent dans la barre d’état ;
  • Tester avec ffplay, et ajuster si besoin.

Seconde difficulté : trouver les temps de début et de fin pour tracer (et effacer) le rectangle.

  • Lancer la vidéo dans smplayer ;
  • S’arrêter et compter les frames via les touches “,” et “.” ;
  • Noter ces deux informations ;
  • Regarder le framerate de la vidéo, et diviser le nombre de frames comptées par le framerate pour avoir le temps en centièmes de secondes ;
  • Tester avec ffplay et ajuster si besoin.

Le filtre « drawbox » prend les informations suivantes : x, y, w, h, color.

  • x, y : coordonnées x et y (coin haut gauche) du rectangle à tracer ;
  • w, h : largeur et hauteur du rectangle ;
  • color : couleur@opacité. Par exemple, pour tracer un rectangle noir avec aucune transparence (donc opacité à 100%), il suffit d’écrire black@1.0. Pour une opacité à 50%, écrire black@0.5.
  • t : épaisseur. Si on veut tracer juste le contour (par exemple, épaisseur de 10 pixels), indiquer 10. Pour avoir un rectangle plein, indiquer max.

Note

Pour la couleur, on peut utiliser un nom de couleur prédéfini (red, black…) ou une valeur au format 0xRRGGBB[AA], avec RR pour le rouge, GG pour le vert, BB pour le bleu, et AA pour la transparence (éventuellement). Remplacer les deux lettres de la couleur par une valeur hexadécimale (donc entre 00 et FF).

Par exemple, pour du rouge, on écrirait 0xFF0000.

Note

Pour faire les tests, le rectangle sera de couleur rouge et non de couleur noire. Cela permettra de contrôler la présence du rectangle, y conpris dans les frames noires.

Ici, les coordonnées trouvées sont x=0, y=610, w=1920, h=490.

Il faudra donc écrire :

drawbox=x=0:y=610:w=1920:h=490:color=red@1.0:t=max

Le filtre doit être actif entre les temps 14 secondes et 258.68.

Il faudra donc ajouter :

enable='between(t,14,258.68)'

Ce qui donne au final :

drawbox=enable='between(t,14,258.68)':x=0:y=610:w=1920:h=490:color=red@1.0:t=max

Il reste à contrôler avec ffplay :

ffplay The\ World\ is\ Saved.mp4 -vf "drawbox=enable='between(t,14,258.68)':x=0:y=610:w=1920:h=490:color=red@1.0:t=max"

Exemples en images :

Rectangle plein. Rectangle avec un contour rouge. Épaisseur définie à 50.

Une fois contrôlé (et ajusté) via ffplay, on peut utiliser le filtre avec ffmpeg et encoder la vidéo.

Une fois que c’est bon, utiliser la couleur noire (black) à la place de la couleur rouge (red) dans la commande ffmpeg

ffmpeg -i The\ World\ is\ Saved.mp4 -vf "drawbox=enable='between(t,14,258.68)':x=0:y=610:w=1920:h=490:color=black@1.0:t=max" -acodec aac -vcodec libx264 -crf 22 -tune animation TheWorldIsSaved.mp4

Lien vers la documentation : https://ffmpeg.org/ffmpeg-filters.html#drawbox

Incrustation d’images

Filtre :

Réduire la saturation

Filtre : eq, saturation

J’ai eu à traiter une vidéo qui était hyper saturée.

Pour augmenter ou réduire la saturation, il suffit d’utiliser le filtre eq, paramètre saturation.

eq=saturation=<valeur désirée>

La valeur désirée va de 0.0 (désaturée) à 3.0 (saturation à 300%).

Faire des tests avec ffplay pour trouver la bonne valeur.

Par exemple : :

ffplay -i cucumber.mp4 -vf "eq=saturation=0.4"

Exemples en image :

eq=saturation=0.0

Image désaturée.

eq=saturation=0.4

Saturation à 40%.

eq=saturation=1.0

Saturation à 100%.

eq=saturation=2.0

Saturation à 200%.

eq=saturation=3.0

Saturation à 300%.

Lien vers la documentation : https://ffmpeg.org/ffmpeg-filters.html#eq

Note

Le filtre eq permet aussi de modifier la luminosité, le contraste, le gamma (global ou par canal R, G, B).

Autres

Prendre une capture d’une frame à une position donnée

Je veux une capture de la vidéo d’une frame, à la 37e seconde.

Pour cela, il suffit de définir que je ne veux pas d’audio, que le temps de départ est à la seconde 37, et que la durée doit être inférieure à une frame.

Ce qui donne : :

-an -ss 0:00:37 -t 0.01

Par exemple : :

ffmpeg -i cucumber.mp4 -an -ss 0:00:37 -t 0.01 ffmpeg-cucumber.jpg
Image obtenue.