Table des matières
Sous-titre
srt -> ass
ffmpeg -i sous-titre.srt sous-titre.ass
Sous-titre non détecté
Il faut augmenter probesize
et analyzeduration
.
ffmpeg -analyzeduration 100000k -probesize 100000k -i input.ts
Why does FFmpeg not see the subtitles in my VOB file? Archive du 10/11/2019 le 11/11/2019
Sous-titre à une vidéo
Incorporation d'un sous-titre externe
Format de sortie mkv
. mp4 - Use ffmpeg to add text subtitles - Stack Overflow Archive du 29/12/2011 le 11/11/2019
ffmpeg -i entree.mp4 -i sous-titre.fr.ass -i sous-titre.us.ass -c copy -map 0 -map 1 -map 2 -metadata:s:s:0 language=fra -metadata:s:s:1 language=eng sortie.mkv
Le -map 0
indique tous les flux de la vidéo d'origine. Il est important de mettre un map pour chaque fichier d'entrée. Il est possible de mettre X:Y
avec le premier chiffre indique le fichier et le deuxième le flux correspondant. Pour avoir la liste complète, une lecture des entêtes avec avplay
permet de tous les avoir.
-metadata:s:s:0
: s
pour stream
et s
pour subtitle
et 0
pour le premier sous-titre. Si la vidéo d'origine possède déjà un sous-titre et qu'on souhaite définir la langue uniquement pour le deuxième sous-titre, il faut juste mettre -metadata:s:s:1 …
. FFMPEG An Intermediate Guide_subtitle options - Wikibooks, open books for an open world Archive du 26/09/2019 le 11/11/2019
Si on souhaite utiliser le container mkv
et que le format de sous-titre n'est pas compatible (Subtitle codec 94213 is not supported.
), il faut ajouter -c:s srt
après -c copy
. Subtitle Codec 94213 is Not Supported in FFmpeg Archive du 26/04/2018 le 09/01/2022
Vérification que ffmpeg
a bien compris la langue (entre parenthèse) :
Stream #0:2(fra): Subtitle: ssa Stream #0:3(eng): Subtitle: ssa Stream mapping: Stream #0:0 -> #0:0 (copy) Stream #0:1 -> #0:1 (copy) Stream #1:0 -> #0:2 (copy) Stream #2:0 -> #0:3 (copy)
ffmpeg
choisit de modifier le map
Liste des langues reconnues : language-codes-full.csv, Archive. Base du constat : avlanguage.c, Archive
Activation d'un sous-titre par défaut
Utiliser l'option -disposition:s:s:0
avec la même syntaxe que -metadata
.
Fichier source mkv
Après des tests avec VLC, il n'arrive pas à lire les sous-titres du mkv
d'origine. Il faut donc les extraire avant de faire la fusion.
mkvextract tracks input.mkv 2:en.srt ffmpeg -i input.mkv -i fr.srt -i en.srt -map 0:0 -map 0:1 -map 1 -map 2 -c copy -metadata:s:s:0 language=fre -metadata:s:s:1 language=eng output.mkv
On détaille le map
du fichier source pour ne pas prendre le sous-titre d'origine.
Encodage
Paramètres généraux
x265 :
ffmpeg -i input.mp4 \ -threads 8 \ -map 0 \ -c:a libfdk_aac -ar 44100 -b:a 128k -ac 2 \ -c:v libx265 -r 30 -aspect 1920:1080 -vf scale=1920:1080 \ -preset veryslow -crf 22 -x265-params aq-mode=3 \ -pix_fmt yuv420p10le output.mkv
x264 :
ffmpeg -i input.mp4 \ -threads 8 \ -map 0 \ -c:a libfdk_aac -ar 44100 -b:a 128k -ac 2 \ -c:v libx264 -r 30 -aspect 1920:1080 -vf scale=1920:1080 \ -preset veryslow -crf 22 -aq-mode 3 \ -pix_fmt yuv420p10le output.mkv
Ordre des streams
Choix des paramètres :
-map 0
:
Cela indique de reprendre toutes les pistes / streams du premier paramètre -i input.mp4
. Si on ne le fait pas, la conversion pourrait oublier certaines données comme ne conserver que le premier sous-titre ou encore oublier les chapitres avec leur titre.
En faisant -i input1.mp4 -i input2.mp4 -map 1 -map 0
, cela va fusionner les données du média 1 et du média 2 mais en considérant en premier les données du média 2.
Il est encore possible de faire -map 0:1 -map 0:0
en supposant que les deux streams sont les deux audios d'une vidéo, cela va inverser leur ordre et donc inverser l'audio par défaut au démarrage de la vidéo.
Audio
-ar
: fréquence de l'audio :44100
ou48000
Hz généralement. Il est possible d'utiliser-ar:0
pour le stream 0.
-b:a
: débit de l'audio. Il est possible d'utiliser-b:a:0
pour le stream 0.
Il est conseillé d'appliquer la formule (bitrate for stereo) * (channels / 2)
. Soit 128k
pour du stéréo et du 384k
pour du 5.1. Guidelines for high quality lossy audio encoding Archive du 23/06/2019 le 28/12/2020
Si -ab
<= 48000
, ajouter l'option -profile:a aac_he_v2
. Attention, aac_he_v2
ne supporte que la stéréo, pour du mono, utiliser aac_he
.
-c:a libfdk_aac
: codec audio. Il est possible d'utiliser-c:a:0 libfdk_aac
pour le stream 0.
Celui-là n'est pas disponible par défaut sur Windows. Utiliser aac
à la place si besoin.
-ac 2
: nombre de canal audio. 2 pour stéréo, 6 pour 5.1. Il est possible d'utiliser-ac:0 2
pour le stream 0.
Attention, ce paramètre s'applique pour toutes les stream audio. Si une bande est en stéréo et l'autre en 5.1, il faut utiliser -ac:0 2 -ac:1 6
.
Vidéo
-c:v libx265
: codec audio. Il est possible d'utiliser-c:v:0 libx265
pour le stream 0.
-r 30
: nombre d'images par seconde. Il est possible d'utiliser-r:0 30
pour le stream 0.
-crf 22
: très bonne qualité pour des scènes claires (faible risque d'apparition de carrés à l'écran). Compromis entre la taille et la qualité. Il n'est PAS possible d'utiliser-crf:0 22
pour le stream 0.
Mettre une valeur de 17 ou 18 pour une qualité *presque* identique à l'original (H.264 Video Encoding Guide Archive du 09/08/2020 le 23/09/2020).
Quand les scènes sont sombres, il faut utiliser l'option -aq-mode 3
. Sinon les scènes sombres auront des mauvais des dégradés de couleur. Sans cette option, un crf < 15 est nécessaire pour ne pas voir les carrés dans les dégradés très sombres.
Il faut garder le même paramètre entre x264 et x265 pour avoir la même qualité. Encoding 8-bit video at 8/10/12-bit in Handbrake (x264/x265) : comparaison en ligne uniquement de quelques images type en format x264 et x265, Video Compression Testing: x264 vs x265 CRF in Handbrake 0.10.5 Archive du 27/08/2016 le 12/08/2020
-pix_fmt
:yuv420p
pour du 8 bits ouyuv420p10le
pour du 10 bits YUV 420, YCbCr 422, RGB 444, c’est quoi le chroma subsampling 2? Archive le 11/11/2019. Il est possible d'utiliser-pix_fmt:0 yuv420p
pour le stream 0.
Il est préférable d'encoder en 10 bits, même si la source est en 8 bits car l'algorithme de compression est meilleur. Why does 10-bit save bandwidth (even when content is 8-bit)? Archive du 2010 le 10/02/2020
Sous-titres
-c:s copy
: copie les sous-titres. Il est possible d'utiliser-c:s:0 copy
pour le stream 0.
Taille spécifique
Avant, on utilise un CFR à 22 pour avoir une qualité très bonne même si pas parfaite.
Il est parfois nécessaire d'avoir une taille précise : 700Mo pour un CD, 25Mo pour Messenger, …
La formule est la suivante :
(200 MiB * 8192 [converts MiB to kBit]) / 600 seconds = ~2730 kBit/s total bitrate 2730 - 128 kBit/s (desired audio bitrate) = 2602 kBit/s video bitrate
Il suffit alors de remplacer le paramètre -crf 22
par -b:v 2600k
et d'activer l'encodage en deux étapes :
ffmpeg -i input.mp4 -threads 8 -acodec libfdk_aac -ar 44100 -ab 128k -profile:a aac_he_v2 -ac 2 -vcodec libx264 -f mp4 -r 30 -aspect 1920:1080 -vf scale=1920:1080 -preset veryslow -b:v 2600k -pass 1 -pix_fmt yuv420p output.mp4 ffmpeg -i input.mp4 -threads 8 -acodec libfdk_aac -ar 44100 -ab 128k -profile:a aac_he_v2 -ac 2 -vcodec libx264 -f mp4 -r 30 -aspect 1920:1080 -vf scale=1920:1080 -preset veryslow -b:v 2600k -pass 2 -pix_fmt yuv420p output.mp4
H.264 Video Encoding Guide Archive du 09/08/2020 le 23/09/2020
Concaténer
Pour les DVD, les pistes sont dans des fichiers découpés avec une taille de 1 Go (1073739776 o). Un cat
suffit pour les concaténer.
cat VTS_01_{1,2,3,4,5,6}.VOB > output.VOB
Pour les fichiers avec l'extension ts
, ffmpeg possède une fonction dédiée :
ffmpeg -i "concat:input1.ts|input2.ts|input3.ts" -c copy output.ts
m3u8
C'est une liste de fichier .ts
.
ffmpeg.exe -i http://example.com/link.m3u8 -c copy output.mp4
Effets
Rotation
Sans ré-encoder, il est possible de mettre un tag pour indiquer la rotation.
ffmpeg -i input.mkv -map_metadata 0 -metadata:s:v rotate="90" -codec copy output.mkv
Pour que cela fonctionne l'extension du fichier de sortie doit être le même que celui d'entrée.