Ce site contient essentiellement des notes de travail. Le contenu est en constante évolution, et loin d'être achevé. (+ d'infos)
La plupart des documentations informatiques sont orientées Debian / Ubuntu.

Informatique/Softwares/FFmpeg/Recettes/H.264 - mauvais frame rate

De Ordinoscope.net
Aller à : navigation, rechercher

Introduction

Le codec H.264 est un compromis fabuleux entre la qualité et la taille des fichiers. La plupart des programmes et systèmes d'exploitation le lisent sans ajout d'un codec externe, et tout fonctionne pour le mieux la majorité du temps, enfin presque.

J'ai recompressé quasi tous mes films en H.264, pour la plupart avec Avidemux et HandBrake. Pendant quelques semaines, début 2011 si je me souviens bien, certains devenaient illisibles sur mon Asus O!Play. Il pouvait démarrer correctement, puis tilter lors d'une avance rapide, ou alors directement démarrer en accéléré, sans permettre de le ralentir. Toutefois, ils se lisent correctement sur VLC, Mplayer ou XBMC.

Explication

La plupart des containers permettent à leur niveau de définir les propriétés du stream, et la majorité des players se servent de l'information contenue dans le container. Dans ce cas, tout fonctionne pour le mieux, et au pire, il suffit de modifier le container. Avec du MKV, c'est un jeu d'enfant. Malheureusement, l'Asus O!Play se sert du header du stream H.264, et ne tient pas compte des informations du container. Donc toute modification du container est vaine.

Ffmpeg affiche assez clairement ce problème:

ffmpeg -i movie.mkv
ffmpeg version N-31792-g51fb933, Copyright (c) 2000-2011 the FFmpeg developers
...
Seems stream 0 codec frame rate differs from container frame rate: 2000.00 (2000/1) -> 23.98 (24000/1001)
...

Le problème devient encore plus sensible en cas de manipulation des flux:

ffmpeg -i movie.mkv -vcodec copy -acodec copy out.mkv
ffmpeg version 0.7.3-4:0.7.3-0ubuntu0.11.10.1, Copyright (c) 2000-2011 the Libav developers
Seems stream 0 codec frame rate differs from container frame rate: 2000.00 (2000/1) -> 23.98 (24000/1001)
...
[matroska @ 0xaf98c0] Application provided invalid, non monotonically increasing dts to muxer in stream 0: -83 >= -83
av_interleaved_write_frame(): Invalid argument

Solution

Toute tentative de recompression du flux est inutile. On obtient des images ralenties, accélérées, décalées temporellement (va et vient), mais en aucun cas un résultat correct. Ce n'est pas faute d'avoir essayé, mais quand la source est fausse, le résultat l'est aussi.

Par chance, je suis tombé sur cette discussion: http://forum.doom9.org/archive/index.php/t-152419.html

Une bonne âme a eu l'idée de créer un filtre pour ffmpeg, permettant de modifier les headers (SPS) du flux H.264, et non pas celui du container. Il n'est disponible qu'en version compilée pour Windows, mais fonctionne à merveille sur Linux avec Wine.

Une fois le programme téléchargé, il suffit d'indiquer le frame rate désiré (selon l'original):

./ffmpeg.exe -i movie.mkv -vcodec copy -acodec copy -vbsf h264_changesps=fps=24000:1001 out.mkv

C'est super rapide, ne nécessite aucune recompression, et fonctionne à merveille !