Lors du conditionnement d'un flux pour la lecture DASH, les points d'accès aléatoires doivent se trouver exactement au même moment du flux source dans tous les flux. La façon habituelle d'y parvenir est de forcer une fréquence d'images fixe et une longueur de GOP fixe (c'est-à-dire une image clé toutes les N images).
Dans FFmpeg, la fixation de la fréquence d'images est facile (-r NUMBER).
Mais pour des emplacements d'images clés fixes (longueur du GOP), il existe trois méthodes... laquelle est "correcte" ? La documentation de FFmpeg est désespérément vague à ce sujet.
Méthode 1 : modifier les arguments de libx264
-c:v libx264 -x264opts keyint=GOPSIZE:min-keyint=GOPSIZE:scenecut=-1
Il semble qu'il y ait un débat pour savoir si le scenecut doit être désactivé ou non, car il n'est pas clair si le "compteur" d'images clés est relancé lorsqu'une scène est coupée.
Méthode 2 : fixer une taille GOP fixe :
-g GOP_LEN_IN_FRAMES
Ceci est malheureusement seulement documenté en passant dans la documentation FFMPEG, et donc l'effet de cet argument est très peu clair.
Méthode 3 : insérer une image clé toutes les N secondes ( Peut-être ? ):
-force_key_frames expr:gte(t,n_forced*GOP_LEN_IN_SECONDS)
Ce site est explicitement documenté. Mais il n'est toujours pas clair si le "compteur de temps" redémarre après chaque image clé. Par exemple, dans un GOP attendu de 5 secondes, s'il y a un scenecut
image clé injectée 3 secondes par libx264, l'image clé suivante serait-elle 5 secondes plus tard ou 2 secondes plus tard ?
En fait, la documentation de FFmpeg fait la différence entre cette méthode et celle de la -g
mais il ne dit pas vraiment en quoi ces deux options ci-dessus sont un tant soit peu différentes (évidemment, -g
va nécessiter une fréquence d'images fixe).
Lequel est le bon ?
Il semblerait que le -force_key_frames
serait supérieur car il n'est pas nécessaire d'avoir une fréquence d'images fixe. Cependant, cela exige que
- il est conforme aux spécifications GOP de la norme H.264 ( le cas échéant )
- il GARANTIT qu'il y aura une image clé dans la cadence fixe, indépendamment de libx264
scenecut
images clés.
Il semblerait également que -g
ne pourrait pas fonctionner sans forcer une fréquence d'images fixe ( -r
) car il n'y a aucune garantie que de multiples exécutions de ffmpeg
avec des arguments codecs différents fourniraient la même fréquence d'images instantanée dans chaque résolution. Les fréquences d'images fixes peuvent réduire les performances de compression (IMPORTANT dans un scénario DASH !).
Enfin, le site keyint
la méthode semble juste comme un hack . J'espère contre toute attente que ce n'est pas la bonne réponse.
Références :
Un exemple utilisant le -force_key_frames
méthode