Introduction

Dans ta quête vers le titre de maître du timing, il est possible que tu sois confronté à des problèmes qui te dépassent:

L'encodage (et @amoethyst qui s'énerve parce que tu l'as mal fait)

C'est peut-être trop tard pour une partie du problème, mais c'est pas grave, ça arrive (et je suis sûr qu'il t'en voudra pas si tu corriges le coup pour la prochaine fois ^^")

Ce guide a pour but de t'apprendre les bases1 de l'encodage vidéo et audio pour que tes karaokes puissent rayonner de beauté2.

1

Ou plus si affinités (et si je trouve le temps de l'écrire)

2

Enfin, le jour où on aura un bon projo et une bonne sono

Principaux formats d'encodages

Pour éviter les erreurs les plus basiques, il te suffit de connaître quelques formats d'encodage qui sont souvent utilisés.

Formats de fichier

D'abort il y a les formats de fichier. Ils servent à contenir les flux audios et vidéos d'un fichier. On trouve par exemple:

  • AVI: Souvent pour des vieilles vidéos
  • MP4: Probablement le format le plus commun aujourd'hui
  • WEBM: Surtout utilisé par les navigateurs
  • M2TS: Format qu'on retrouve dans les BluRay/DVD
  • MKV: Mon format favori, il fait le café comme on dit

Maintenant, pour notre cas ce n'est pas directement ces formats qui vont nous intéresser, mais bien l'encodage des flux audios et vidéos qui sont contenus dans ces fichiers1.

Formats d'encodages de flux

On peut facilement délimiter les formats d'encodages de flux en 2 catégories: lossless et lossy2.

Les formats d'encodage lossless (ou sans pertes) permettent de compresser un flux de façon à pouvoir lire une copie parfaite du fichier original dans un lecteur multimédia. Pour un exemple plus général de ce type de compression, pensez à une archive ZIP: La taille du fichier est plus basse, mais le contenu qui est dedans est le même que dans le fichier d'origine.

Les formats d'encodage lossy (ou avec pertes) sont des formats qui vont compresser le flux plus efficacement, mais qui ne permettront pas de récupérer une copie du fichier original. Pour un flux vidéo ou audio, ce n'est normalement pas un problème puisque les sens des pauvres êtres humains que nous sommes sont limités...

Cela dit ça veut quand même pas dire qu'on à le droit de faire des conneries avec ça ! (voir le prochain chapitre)

Voici donc quelques formats d'encodages communs:

Formats vidéo lossy

  • H.264/AVC: Le plus courant sur internet et dans des BluRay
  • H.265/HEVC: Un nouveau format un peu plus demandeur en ressources pour la lecture
  • VP9: Un format utilisé pour encoder des vidéos sur internet
  • VP8: Même chose mais en moins bien
  • MPEG2/H.262: Parfois dans des DVD/BluRay

Formats vidéo lossless

Il existe des formats vidéos lossless (comme FFV1, ou HuffYUV), mais vous en trouverez jamais.

Ce que vous pouvez trouver par contre, ce sont des vidéos lossy encoder avec des paramètres qui permettent d'être très proche du fichier d'origine. Dans tous les cas si vous avez accès à un BluRay, vous trouverez probablement pas mieux3.

Formats audio lossy

  • MP3: Très commun, c'est de la merde
  • AAC: Un format un peu plus moderne avec une bien meilleure qualité
  • OPUS: Pareil mais en un peu mieux
  • Vorbis: L'ancêtre de OPUS (donc moins bon)

Formats audio lossless

  • WAVE/PCM: C'est de l'audio non compressé
  • FLAC: Le format de compression lossless le plus courant
  • ALAC: Même chose mais par Apple, donc il faut pas l'utiliser :p

La règle ultime ou je te frappe

Globalement il faut essayer de garder en tête les modifications qui ont été faites aux fichiers depuis qu'il a été créé et essayer d'éviter d'en rajouter si c'est pas nécessaire.
Donc si on est dans un format vidéo lossy et que le bitrate est pas trop grand (on va dire pas au dessus de 10.000 kb/s pour du 1080p) on va pas trop y toucher, c'est pas trop mal.
Si tu as de l'audio dans un format d'encodage lossy il ne faut SURTOUT PAS LE RÉENCODER on détruit très vite la qualité de l'audio et ça s'entend. (on verra plus loin comment on peut réencoder la vidéo sans toucher au flux audio)
Si tu as de l'audio en lossless, il faudra le réencoder dans un format lossy comme AAC pour essayer de gagner un peu d'espace, sans perdre trop en qualité sonore.

1

La seule influence que peuvent avoir ces formats de fichiers pour nous, c'est qu'ils ne supporteront pas forcément tous les formats d'encodages vidéo et audio dont on a besoin. C'est le cas pour l'AVI par exemple.

2

Ouais pardon mais je connais qu'en anglais

3

Sauf peut-être le DVD si il est mieux encodé... Non mais ça t'arriveras pas tkt /o\

Encodage simple

Maintenant que tu as atteins la CONNAISSANCE, tu vas pouvoir encoder ta vidéo en sachant un minimum ce que tu fais (enfin j'espère).

1. Les outils

Pour maintenant tu vas avoir besoin d'installer ffmpeg.
Ce logiciel est souvent décrit comme le couteau-suisse de l'encodage vidéo (et c'est plutôt vrai). Il vient également avec la commande ffprobe, que l'on va utiliser tout de suite.

2. Connaître son ennemi

Tout d'abord il va falloir regarder ce qu'on a dans notre fichier d'origine. Pour ça on va utiliser ffprobe <nom du fichier vidéo>:

$ ffprobe \[Snow-Raws\]\ クロスアンジュ\ 天使と竜の輪舞\[ロンド\]\ OP01\(BD\ 1920x1080\ HEVC-YUV420P10\ FLAC\).mkv
ffprobe version 4.2.1 Copyright (c) 2007-2019 the FFmpeg developers
   built with gcc 9.2.0 (Gentoo 9.2.0-r2 p3)
   configuration: --prefix=/usr --libdir=/usr/lib64 --shlibdir=/usr/lib64 --docdir=/usr/share/doc/ffmpeg-4.2.1/html --mandir=/usr/share/man --enable-shared --cc=x86_64-pc-linux-gnu-gcc --cxx=x86_64-pc-linux-gnu-g++ --ar=x86_64-pc-linux-gnu-ar --optflags='-O2 -pipe -fomit-frame-pointer -march=native' --disable-static --enable-avfilter --enable-avresample --disable-stripping --disable-optimizations --disable-libcelt --enable-nonfree --disable-indev=v4l2 --disable-outdev=v4l2 --disable-indev=oss --disable-outdev=oss --enable-nonfree --enable-bzlib --disable-runtime-cpudetect --disable-debug --disable-gcrypt --disable-gnutls --disable-gmp --enable-gpl --disable-hardcoded-tables --enable-iconv --enable-libtls --disable-libxml2 --disable-lzma --enable-network --disable-opencl --disable-openssl --enable-postproc --disable-libsmbclient --enable-ffplay --enable-sdl2 --enable-vaapi --disable-vdpau --enable-xlib --enable-libxcb --enable-libxcb-shm --enable-libxcb-xfixes --enable-zlib --enable-libcdio --disable-libiec61883 --disable-libdc1394 --enable-libcaca --disable-openal --enable-opengl --disable-libv4l2 --disable-libpulse --enable-libdrm --enable-libjack --disable-libopencore-amrwb --disable-libopencore-amrnb --disable-libcodec2 --disable-libdav1d --enable-libfdk-aac --disable-libopenjpeg --enable-libbluray --disable-libgme --disable-libgsm --disable-libaribb24 --disable-mmal --disable-libmodplug --enable-libopus --disable-libilbc --disable-librtmp --enable-libssh --disable-libspeex --disable-libsrt --enable-librsvg --disable-ffnvcodec --enable-libvorbis --enable-libvpx --disable-libzvbi --disable-appkit --disable-libbs2b --disable-chromaprint --disable-cuda-llvm --disable-libflite --disable-frei0r --disable-libfribidi --enable-fontconfig --disable-ladspa --enable-libass --disable-libtesseract --disable-lv2 --enable-libfreetype --disable-libvidstab --disable-librubberband --disable-libzmq --disable-libzimg --disable-libsoxr --enable-pthreads --disable-libvo-amrwbenc --enable-libmp3lame --disable-libkvazaar --enable-libaom --disable-libopenh264 --disable-libsnappy --disable-libtheora --disable-libtwolame --disable-libwavpack --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxvid --disable-gnutls --disable-openssl --disable-armv5te --disable-armv6 --disable-armv6t2 --disable-neon --disable-vfp --disable-vfpv3 --disable-armv8 --disable-mipsdsp --disable-mipsdspr2 --disable-mipsfpu --disable-altivec --disable-amd3dnow --disable-amd3dnowext --disable-fma4 --disable-xop --cpu=host --disable-doc --disable-htmlpages --enable-manpages
   libavutil      56. 31.100 / 56. 31.100
   libavcodec     58. 54.100 / 58. 54.100
   libavformat    58. 29.100 / 58. 29.100
   libavdevice    58.  8.100 / 58.  8.100
   libavfilter     7. 57.100 /  7. 57.100
   libavresample   4.  0.  0 /  4.  0.  0
   libswscale      5.  5.100 /  5.  5.100
   libswresample   3.  5.100 /  3.  5.100
   libpostproc    55.  5.100 / 55.  5.100
Input #0, matroska,webm, from '[Snow-Raws] クロスアンジュ 天使と竜の輪舞[ロンド] OP01(BD 1920x1080 HEVC-YUV420P10 FLAC).mkv':
  Metadata:
    encoder         : libebml v1.3.4 + libmatroska v1.4.5
    creation_time   : 2019-07-02T02:04:17.000000Z
  Duration: 00:01:32.09, start: 0.000000, bitrate: 17118 kb/s
    Stream #0:0(jpn): Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)
    Metadata:
      BPS             : 15411453
      BPS-eng         : 15411453
      DURATION        : 00:01:32.092000000
      DURATION-eng    : 00:01:32.092000000
      NUMBER_OF_FRAMES: 2208
      NUMBER_OF_FRAMES-eng: 2208
      NUMBER_OF_BYTES : 177408950
      NUMBER_OF_BYTES-eng: 177408950
      _STATISTICS_WRITING_APP: mkvmerge v9.4.2 ('So High') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v9.4.2 ('So High') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2019-07-02 02:04:17
      _STATISTICS_WRITING_DATE_UTC-eng: 2019-07-02 02:04:17
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
    Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s32 (24 bit) (default)
    Metadata:
      BPS             : 1704420
      BPS-eng         : 1704420
      DURATION        : 00:01:32.090000000
      DURATION-eng    : 00:01:32.090000000
      NUMBER_OF_FRAMES: 1080
      NUMBER_OF_FRAMES-eng: 1080
      NUMBER_OF_BYTES : 19620011
      NUMBER_OF_BYTES-eng: 19620011
      _STATISTICS_WRITING_APP: mkvmerge v9.4.2 ('So High') 64bit
      _STATISTICS_WRITING_APP-eng: mkvmerge v9.4.2 ('So High') 64bit
      _STATISTICS_WRITING_DATE_UTC: 2019-07-02 02:04:17
      _STATISTICS_WRITING_DATE_UTC-eng: 2019-07-02 02:04:17
      _STATISTICS_TAGS: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES
      _STATISTICS_TAGS-eng: BPS DURATION NUMBER_OF_FRAMES NUMBER_OF_BYTES

OK ça fait un peu peur... PAS DE PANIQUE. On nous répond avec beaucoup d'infos sur le fichier mais il y a une bonne partie qui va pas nous intéresser.

Les lignes qui nous intéressent commence après le "INPUT #0" et les lignes qui suivent et commencent par "Duration" et "Stream":

Input #0, matroska,webm, from '[Snow-Raws] クロスアンジュ 天使と竜の輪舞[ロンド] OP01(BD 1920x1080 HEVC-YUV420P10 FLAC).mkv':
  Duration: 00:01:32.09, start: 0.000000, bitrate: 17118 kb/s

On voit donc que le fichier à un bitrate de 17118 kb/s (ce qui est plutôt gros il faut le dire).

    Stream #0:0(jpn): Video: hevc (Main 10), yuv420p10le(tv, bt709/unknown/unknown), 1920x1080, SAR 1:1 DAR 16:9, 23.98 fps, 23.98 tbr, 1k tbn, 23.98 tbc (default)

Il y a un flux vidéo en HEVC (ou H.265) d'une résolution de 1920x1080 pixels.

    Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s32 (24 bit) (default)

Puis pour l'audio on a du FLAC, donc de l'audio lossless et on vois aussi que c'est du stéréo. On a donc une source plutôt propre pour faire un réencodage. Normalement on devrait pas rencontrer trop de problème pour réencoder ce fichier pour qu'il soit plus petit sans qu'il y ait trop de pertes.

Il faut noter qu'on ne fait ça que parce que le fichier a un bitrate élevé (17118kb/s) et parce que l'audio est dans un format lossless (FLAC). Si l'audio est déjà dans un format lossy (AAC ou OPUS par exemple) et le bitrate est inférieur à 10000kb/s, il vaut mieux garder le fichier tel qu'il est. Dans tous les cas, la première chose à faire avant de penser à réencoder c'est de lancer ffprobe sur le fichier d'origine.

On passe à l'encodage

Maintenant nous allons prendre ce fichier et le réencoder pour réduire un peu sa taille. On va utiliser le format MKV, pour la vidéo du H.264 et en audio du OPUS.

$ ffmpeg -i <nom du fichier> -c:v libx264 -crf 19 -preset slow -c:a libopus -b:a 128k out.mkv

Cette commande va réencoder le fichier en entrée vers un fichier out.mkv qui aura un flux vidéo en H.264 (défini par -c:v libx264) et un flux audio en OPUS (-c:a libopus).

Pour le flux vidéo on utilise un CRF (ou Constant Rate Factor, que l'on définit avec -crf 19), cela nous permet de viser une qualité de vidéo en sortie plutôt qu'un bitrate précis. Je conseille de rester autour de cette valeur de 19. Si tu veux la changer, il faut garder en tête qu'une valeur plus basse augmentera la taille de la vidéo en sortie (en augmentant donc la qualité normalement) et inversement lorsque tu l'augmentes.
Le --preset slow permet globalement de dire à l'encoder vidéo d'essayer de compresser plus la vidéo qu'avec les options par défaut.

Pour le flux audio on utilise un bitrate constant de 128 kb/s, ce qui pour de l'audio en OPUS est normalement indistinguable d'un audio lossless1.

Du coup pour l'exemple ça donne ça:

$ ffmpeg -i \[Snow-Raws\]\ クロスアンジュ\ 天使と竜の輪舞\[ロンド\]\ OP01\(BD\ 1920x1080\ HEVC-YUV420P10\ FLAC\).mkv -c:v libx264 -crf 19 -preset slow -c:a aac -b:a 128k -movflags +faststart out.mp4

On obtient donc un fichier avec un bitrate réduit de moitié, et une qualité qui normalement est toujours au rendez-vous.

1

Si t'es parano tu peux monter à 192k pour du stéréo, au dessus c'est probablement du placebo

Encodage audio

Maintenant que tu sais (au moins à peu près) comment te servir de ffmpeg, parlons un peu plus d'encodage, et d'abord d'encodage audio.

Encore une fois le plus important est de comprendre ce qu'on fait et pour ça rien de mieux que ffprobe. Pour cette partie je vais cacher les infos de la vidéo puisqu'elles ne nous intéressent pas pour le moment.

Un audio déjà encodé dans un format lossy

$ ffprobe 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:30.09, start: 0.000000, bitrate: 8173 kb/s
    Stream #0:1(jpn): Audio: aac (LC), 48000 Hz, stereo, fltp (default)

Ici, la source est déjà encodée en AAC donc on va éviter de réencoder l'audio si on doit réencoder la vidéo. Pour cela il faut préciser dans la commande ffmpeg que l'on veut copier l'audio du fichier d'entrée vers le fichier de sortie.

$ ffmpeg -i 'in.mkv' -c:a copy 'out.aac'

A priori si le fichier d'entrée est dans un format lossy tu devras toujours faire une copie de l'audio. Le seul cas où tu pourrais penser à réencoder c'est si l'audio est dans un format extrèment bizarre qui n'est pas supporté par mkv (comme Bink audio).

Un audio dans un format lossless

$ ffprobe 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:32.10, start: 0.000000, bitrate: 33724 kb/s
    Stream #0:1(jpn): Audio: flac, 48000 Hz, stereo, s16 (default)

La source est en FLAC donc un format lossless qu'on va réencoder en AAC.

$ ffmpeg -i 'in.mkv' -c:a aac -b:a 128k 'out.aac'

Si tu arrives à installer le codec libfdk_aac il est sensé être un peu plus efficace que aac. Il a une option -vbr qui permet de viser une qualité audio plutôt qu'un bitrate de sortie (un peu comme l'option -crf pour la vidéo):

$ ffmpeg -i 'in.mkv' -c:a libfdk_aac -vbr 5 'out.aac'

Et sinon tu peux également utiliser le codec libopus qui est le plus efficace (d'après à peu près tous les tests que j'ai pu voir):

$ ffmpeg -i 'in.mkv' -c:a libopus -b:a 128k 'out.opus'

Un audio lossless mais pas en stéréo

Si le fichier d'entrée n'est pas en stéréo et que l'on donne un bitrate à viser dans notre commande ffmpeg il faut bien faire attention à donner un bitrate suffisant pour que l'audio soit de bonne qualité. Il faut généralement 64 kb/s par channel audio. Donc 128 kb/s pour du stéréo, 256 kb/s pour 4 channels et 374 kb/s pour du 6 channel.

Input #0, mpegts, from '00004.m2ts':
  Duration: 03:17:08.48, start: 4344.833333, bitrate: 27267 kb/s
    Stream #0:2[0x1101]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s16p

Ici, le 5.1(side) veut dire qu'il y a 6 channels dans ce fichier1, il faudra donc en prendre compte lors de l'encodage.

$ ffmpeg -i '00004.m2ts' -c:a libopus -b:a 374k 'out.opus'

Et maintenant le piège

$ ffmpeg 'in.mkv'
Input #0, matroska,webm, from 'in.mkv':
  Duration: 00:01:30.55, start: 0.000000, bitrate: 3045 kb/s
    Stream #0:1: Audio: pcm_s16le, 48000 Hz, 2 channels, s16, 1536 kb/s (default)

Ici, on voit que l'audio est dans le format pcm_s16le. Globalement, c'est le format d'un fichier WAV et c'est donc de l'audio lossless. Mais dans ce cas là il vaut mieux ne pas le réencoder. Et là tu vas me dire:

Mais t'as dit l'inverse 2 lignes au dessus

Et oui c'est vrai mais ce fichier fait peur pour plusieurs raisons. Déjà il est rare de voir un audio en format pcm dans une vidéo parce que c'est de l'audio non compressé, le seul cas possible serait que le fichier vienne d'un bluray et que personne ait pensé à réencoder l'audio en FLAC par exemple (qui est lossless mais compressé donc on peut gagner quelques MB sur la vidéo). Et encore dans ce cas là on devrait voir du pcm_bluray:

Input #0, mpegts, from '00004.m2ts':
  Duration: 03:17:08.48, start: 4344.833333, bitrate: 27267 kb/s
    Stream #0:1[0x1100]: Audio: pcm_bluray (HDMV / 0x564D4448), 48000 Hz, stereo, s32 (24 bit), 2304 kb/s
    Stream #0:2[0x1101]: Audio: dts (DTS-HD MA) ([134][0][0][0] / 0x0086), 48000 Hz, 5.1(side), s16p
    Stream #0:3[0x1102]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo, fltp, 640 kb/s

Bon si c'était que ça il se pourrait que ça soit juste un gars qui a oublié de réencoder et du coup c'est resté en pcm_s16le. Mais on peut voir le bitrate total du fichier juste au dessus: 3045 kb/s
On a donc ici un stream audio qui est plus grand que le stream vidéo. Donc ma théorie c'est que ce fichier est une source de merde et que l'audio en "pcm" est en fait du mp3 qui a été réencodé en pcm et si tu réencodes encore l'audio il y a moyen que ça fasse mal aux oreilles au prochain kara. Donc il vaudrait mieux aller chercher une autre source parce que celle-là elle fait peur.

tl;dr: Si tu vois un fichier comme ça, c'est probablement que t'as regardé des vieilles vidéos dans notre base, et ce paragraphe est là pour te décourager de réencoder leur audio en masse.

Couper une vidéo

Parfois on a besoin de récupérer une partie d'une vidéo (pour récupérer une chanson d'un concert ou l'opening d'un épisode, ...).

tl;dr pour couper une vidéo il faut faire cette commande:

$ ffmpeg -i <vidéo> -ss <timestamp de début> -t <durée à extraire de la vidéo> -map 0:v -map 0:a -c:v libx264 -preset slow -crf 19 -c:a copy out.mkv

En faisant varier le -crf 19 en fonction de la vidéo et de la qualité recherchée.

Explications

Techniquement couper une vidéo est un peu compliqué car la plupart des images qui composent une vidéo ne sont pas encodées directement dans le fichier mais définies comme des modifications d'autres images de la vidéo. Les seules images qui sont présentes dans la vidéo sont appelées les I frames, sur le principes elles sont souvent similaires à des images JPEG.

Donc pour couper une vidéo à une image donnée il faut soit que l'image soit une I frame, soit il faut garder les images I auquels cette image fait référence, soit il faut réencoder la vidéo.

On pourrait faire une copie de la vidéo avec ffmpeg mais dans le cas où on ne coupe pas la vidéo sur une I frame la vidéo pourrait être mal lue dans certains logiciels (comme Aegisub par exemple :/).

$ ffmpeg -ss <timestamp de début> -i <vidéo> -t <durée à extraire de la vidéo> -map 0:v -map 0:a -c copy out.mkv

ffmpeg semble prendre la première I frame avant la timestamp donnée et décale le début de la vidéo dans le container. Il faut donc comprendre que dans le fichier il y a un bout de la vidéo qui ne devrait pas être joué. Certains logiciels (particulièrement vieux) ne prennent pas en compte cette information et afficher les premières images de la vidéo et donc décaler l'audio et la vidéo.

Bref ça marchera probablement un jour de couper une vidéo de cette façon mais pour l'instant c'est embêtant.

Aussi à noter que ce n'est pas un problème pour couper la fin de la vidéo (théoriquement un logiciel con pourrait lire quand même les frames après la fin de la vidéo mais ça ne désynchronisera pas l'audio). Donc si c'est uniquement pour couper la fin de la vidéo on peut utiliser cette commande:

$ ffmpeg -i <vidéo> -t <durée à extraire de la vidéo> -map 0:v -map 0:a -c copy out.mkv

Couper une vidéo sans tout réencoder et sans tout casser

Ok donc c'est bien tout ça mais c'est un peu chiant de devoir tout réencoder pour si peu. Il y a donc une façon de faire qui nécessite uniquement de réencoder le début de la vidéo. Globalement la seule partie de la vidéo qu'il faut réencoder est celle entre la première I frame avant la frame où on coupe la vidéo et la première I frame après la frame où on coupe la vidéo. Donc c'est ce qu'on va faire ;)

Pour ça je vais utiliser mkvtoolnix car ça simplifie beaucoup de choses pour couper la vidéo.

mkvmerge --split timestamps:XX:XX:XX.XXX -o split.mkv <la vidéo à couper>

XX:XX:XX.XXX dois être le temps auquel on voudra couper la vidéo. D'après ce que je vois la timestamp doit forcément être dans ce format débile mais ça marche

En sortie mkvmerge devrait créer 2 fichiers: split-001.mkv et split-002.mkv split-001.mkv aura la vidéo jusqu'à la première I frame après la timestamp donnée en paramètre et split-002.mkv aura le reste de la vidéo.

Ensuite on réencode le début de la vidéo.

$ ffmpeg -i split-001.mkv -ss XX:XX:XX.XXX -map 0:v -map 0:a -c:v libx264 -crf 19 -preset slow -c:a copy split_reenc.mkv

Et après on concatène les 2 vidéos. Il faut créer un fichier qu'on va donner à ffmpeg:

file '<chemin/vers/split_reenc.mkv>'
file '<chemin/vers/split-002.mkv>'

Puis on concatène les deux vidéos, en assumant que le fichier créé au dessus s'appelle concat.txt:

ffmpeg -f concat -safe 0 -i concat.txt -map 0:v -map 0:a -c copy -t <durée à extraire de la vidéo> out.mkv

Ça donnera une vidéo coupée qui fonctionnera même dans les logiciels les plus débiles.

Il est possible de faire tout ça avec ce script bash: proper_split

Pour l'appeler:

$ ./proper_split <vidéo à couper> XX:XX:XX.XXX <durée à extraire de la vidéo>

XX:XX:XX.XXX étant encore la timestamp du début de la partie de la vidéo qu'on veut extraire dans le format de la commande mkvmerge

Le script devrait créer un fichier ayant le nom de la vidéo d'origine suivi de '_cut' avec la vidéo coupée.