Ffmpeg

De Linuxmemo.

Sources: https://wiki.debian.org/fr/ffmpeg

https://fr.wikiversity.org/wiki/Formats_vid%C3%A9o

http://www.gouvenelstudio.com/homecinema/resolution.htm

FFmpeg/Libav permet de multiplexer ou de-multiplexer dans différents formats:

   des flux vidéos compressés (ou pas),
   des flux audio compressés (ou pas),
   des sous-titres dans différents formats. 

Et de modifier, à l'aide de filtre, le contenu de chaque flux indépendamment.

insérer (muxer) ou extraire (demuxer) 
"avconv" est un lien symbolic de "ffmpeg".

Sommaire

[modifier] Commandes

ffmpeg - fast audio and video encoder /decoder
ffplay - media player
ffprobe - show media files characteristics
ffserver - broadcast server for multimedia streaming using HTTP and RTSP protocols

[modifier] Encodage

[modifier] Formats + Codecs + Filtres

[modifier] Formats

  • liste des formats (container)
ffmpeg -formats

Conteneurs de références

Vidéos
   Audio Video Interleave (extentions .avi) : développé par Microsoft.
   MPEG 1/2/4 (extensions .mpg, .mpeg)
   Matroska (extensions .mkv, .mka, .mks)
   Advanced Systems Format (extensions .asf, .wmv, .wma (uniquement lorsqu’il ne contient que de l'audio)) : développé par Microsoft.
   QuickTime (extension .mov) : développé par Apple.
   Ogg (extensions .ogg, .ogv, .oga, .ogx), ainsi que Ogg Media (extension .ogm)
   3gp (extensions .3gp, .3g2)
   WebM (extensions .webm, .weba) : basé sur Matroska, développé par Google.
   NUT (extension .nut)
   RealMedia (extension .rm)
   Material eXchange Format (extension .mxf)
   Advanced Stream Redirector (extension .asx) : développé par Microsoft.
   Transport Stream (extension .ts)
   Flash Video (extension .flv) : Développé par Adobe Systems.
Audio
   MPEG-1/2 Audio Layer 3 (extention .mp3) : issu MPEG-1/MPEG-2.
   Advanced Audio Coding (extention .acc) : issu du MPEG-4.
   WAVEform audio format (extension .wav) : développé par Microsoft et IBM, largement utilisé sur la plate-forme Windows.
   Audio Interchange File Format (extensions .aif, .aiff, .aifc) : développé par Apple.
   Au (extensions .au, .snd) : développé par Sun Microsystems.
   Core Audio Format (extension .caf) : également développé par Apple.
   Broadcast Wave Format (extension .bwf)

[modifier] Codecs

  • liste les codecs disponible pour l'encodage
ffmpeg -codecs

http://www.codecsdb.com/

Codec de référence

Codecs propriétaires
   Sorenson (multiples variantes)
   VP6 (pour le web)
   WMV (Windows Media Video)
   DivX (DivX Networks)
   VC-1 (HD Microsoft)
   DVCPRO (Panasonic, avec ses multiples variantes)
   XDCAM (Sony, avec ses multiples variantes)
   AIC, ProRes (Apple)
   H.264 (déclinaison du MPEG-4 de Moving Picture Experts Group sous l’égide de l'International Organization for Standardization)
Codecs libres
   x264 (implémentation libre du H.264)
   Xvid (implémentation libre du DivX)
   Theora (vidéo)
   Ogg Vorbis (audio)
   FLAC (audio)

[modifier] Filtres

  • liste des filtre
ffmpeg -filters
ffmpeg --help filter=filter_name
  • Syntaxe du filtre (filtergraph)
-vf "filter ; filter,filter ; filter"

*Une Description de filtre (filtergraph) est composée de filtre seul ou d'un ou plusieurs "chaîne de filtre" séparé entre elle par un ";". 
(exp: "filtergraph" ou bien "filtergraph ; filtergraph" ...etc.)
*chaine de filtre (filterchain) est composée de filtre seul ou d'un ou plusieurs filtres séparé entre eux par une ",".
(exp: "filtre" ou bien "filtre,filtre" ...etc.)

https://ffmpeg.org/ffmpeg-filters.html

[modifier] Information sur la video

ffmpeg -i file.avi
ou
avprobe file.avi
ou
ffprobe file.avi
tbn = the time base in AVStream that has come from the container
tbc = the time base in AVCodecContext for the codec used for a particular stream
tbr = tbr is guessed from the video stream and is the value users want to see when they look for the video frame rate

[modifier] Stream description

Stream #0:0(eng): Video: vp9 (Profile 0), yuv420p(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 1k tbn, 1k tbc (default)

Video: video codec, standards de diffusion couleur
résolution
SAR  Sample Aspect Ratio
DAR  Display Aspect Ratio

fps (Images par seconde). Frame rate (expressed in frames per second or fps) is the frequency (rate) at which consecutive images called frames appear on a display.
Au cinéma, le nombre d'images par seconde fut normalisé à 24. À la télévision, le système européen PAL (ou SÉCAM en France) est de 25 images par seconde.
Aux États-Unis et au Japon, la norme NTSC est de 30 images par seconde.
Lors d'affichages informatiques, il est également nécessaire de synchroniser l'affichage avec la fréquence de rafraîchissement de l'écran pour éviter des artefacts visuels déplaisants.
Les cadences usuellement employées sont de 30, 60 ou 100 images par seconde. 

Well it's all about time. FFMpeg uses in fact three different timestamps in different bases in order to work.

   tbr = tbr is guessed from the video stream and is the value users want to see when they look for the video frame rate
   tbn = the time base in AVStream that has come from the container
   tbc = the time base in AVCodecContext for the codec used for a particular stream

[modifier] Stream specifiers

les streams sont numérotés de 0 à x.

1er stream est 0
2eme stream est 1
3eme stream est 2 ...

Syntaxe de des options:

-stream_type[:stream_index]
stream_type is one of following: 'v' or 'V' for video, 'a' for audio, 's' for subtitle, 'd' for data, and 't' for attachments.
exemple:
-codec:a:0 ac3
-a:0 ac3
-acodec ac3  This is an alias for "-codec:a"

[modifier] Encoder la vidéo

Les options:

  • débit binaire:
-b configuration du débit binaire par défaut 200 kbps
-sameq copie à l'identique le débit binaire
-qmin détermine le seuil minimum du débit binaire variable (VBR)
-qmax détermine le seuil maximum du débit binaire variable (VBR)
  • résolution
-s lxh configuration de la taille du cadre d'affichage (l est la largeur et h la hauteur) Resolutions
-aspect configuration du format d'affichage (4:3, 16:9 ou 1.3333, 1.7777)
  • le codec vidéo
-vcodec ou -c:v décision du choix du codec
  • le nombre de passr
-pass nombre de passage à l'encodage, une passe (-pass 1) ou deux passes (-pass 2)
  • choix du contenaire vidéo
-f sélectionne le nom du conteneur
  • fram rate
-r définit le nombre d'images par seconde en fps (Frame(s) per second ou FPS sont couramment utilisés pour désigner le nombre d'images par seconde (sigle français : IPS))

Exemple:

ffmpeg -i file.ts -map 0:1 -s 1024x600 -map 0:2 -c:a copy file.avi

Il est important de mapper tous les flux a garder.

[modifier] Encoder le son

-acodec ou -c:a détermine le choix du codec
-ar configuration de la fréquence d'échantillonnage (44100 Hz)
-ab configuration du débit binaire par défaut 64 kbps
-ac configure le nombre de canaux (mono-stéréo)

[modifier] Tester l'encodage dans Vlc a la volé (sans création de fichier)

ffmpeg -i file.ts -s 1024x768 -c:v libxvid -c:a mp3 -f avi - | vlc -

[modifier] Conversion

[modifier] Choix du format de sortie

C'est l’extension du fichier output qui détermine le type de la sortie

ffmpeg -i file.mkv -c copy output.avi
  1. ) lister les streams (pistes): ffmpeg -i file.mkv
  2. ) lister les streams que l'on garde avec -map: ffmpeg -i file.mkv -map 0:1 -map 0:2 -vcodec copy -acodec copy output.mkv

[modifier] Changer de format sans toucher au flux

ffmpeg -i file.mkv -c copy file.mov
-c copy: copie à l'identique la totalité des flux
-c:v copy : copie à l'identique les pistes vidéos (ou -vcodec copy)
-c:a copy : copie à l'identique les pistes audio (ou -acodec copy)
-c:s copy : copie à l'identique les pistes sous-titres (ou -scodec copy)

[modifier] Changer l'ordre des flux (mapping)

ffmpeg -i file.mkv -map 0:0 -map 0:2 -map 0:1 -map 0:4 -map 0:3 -c copy file-v2.mkv

[modifier] Ajouter un flux

Le paramètre -map permet aussi d'ajouter un flux, dans l'exemple qui suit un sous-titre en espagnol (TOS-es.srt) en position 4 :

ffmpeg -i file.mkv -i TOS-es.srt -map 0:0 -map 0:1 -map 0:2 -map 1:0 -map 0:3 -map 0:4 -c:v copy -c:a copy -metadata:s:s:0 language=esp file-v2.mkv

[modifier] Extraire un flux

En utilisant les possibilités du mapping il est très facile d'extraire un seul flux d'un fichier en comportant plusieurs :

ffmpeg -i file.mkv -map 0:2 -acodec copy file_BO.mkv

Dans cet exemple, on ne copie qu'une seule des pistes audio.

[modifier] Extraire une piste audio

  • mp3
ffmpeg -i file.mkv -map 0:2 -acodec libmp3lame -ar 44100 -ac 2 -ab 192k file_BO.mp3
  • ogg (.oga for audio only files)
ffmpeg -i "input.webm" -vn -acodec copy "output.oga"

https://en.wikipedia.org/wiki/Audio_file_format (.oga for audio only files, .ogv for video with or without sound (including Theora), and .ogx for multiplexed Ogg.)

[modifier] Extraire un sous-titre

ffmpeg -i file.mkv -map 0:4 -c:s srt file_FR.srt

[modifier] Découpage

Extraire un segment

FFmpeg/Libav permet d'extraire, des morceaux d'un média, en précisant un point d'entrée avec -ss (-ss 00:06:46) et précisant un durée avec -t (-t 00:01:00). Cette fonction est très utile pour faire des tests d'encodage et pour valider sa commande. À noter que -ss et -t doivent être placés devant le premier input (-i).

ffmpeg -ss 00:06:46 -t 00:01:00 -i file.mkv -c copy file_extrait.mkv

Parfois la durée -t n'est pas prise en compte. On peut utiliser l'option -to en la plaçant au niveau du fichier de sortie

ffmpeg -ss 00:06:46 -i file.mkv -c copy -to 00:01:00 file_extrait.mkv

[modifier] Actuces

  • choisir ses codecs
ffmpeg -i input.webm -c:v copy -c:a flac output.mkv
-c:v copy => codec:video copy l'originale
-c:a flac => codec:audio en flac
ou bien
-c:av copy -> en une seule option
  • supprimer des pistes audio ou vidéo (streams)
  • utiliser plusieurs "threads"
ffmpeg -threads 4 -i file.mkv -c copy file.avi
  • cacher la bannière de configuration
ffprobe -hide_banner

https://www.linuxtricks.fr/wiki/ffmpeg-la-boite-a-outils-multimedia

info:

ffmpeg knows that the %d means a single numeric character and so increments through the list of files. So it is ffmpeg doing this rather than the shell - this is important to make sure the images are in sequence.
Note that if your numeric suffixes are more than single digit - like image001.jpg up to image110.jpg then you need to let it know:
ffmpeg -r 0.1 -i uploads/image%03d.jpg uploads/video.mp4
The "%03d" means 3 digit numbers, left padded with zeros (eg 005). "%05d" would mean 5 digit numbers left padded with zeros (eg 00044)
Also note that you cannot have gaps in the numbers, so rename if you do.
More details on the formatting of the number here: http://www.pixelbeat.org/programming/gcc/format_specs.html
Outils personnels