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

Et que vlc aussi :

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 :

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

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.

Celui-là n'est pas disponible par défaut sur Windows. Utiliser aac à la place si besoin.

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

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

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

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.