Twitch a un post à ce sujet. Ils expliquent qu'ils ont décidé d'utiliser leur propre programme pour plusieurs raisons; L'un d'eux était que ffmpeg ne vous permet pas d'exécuter différentes instances x264 dans différents threads, mais consacre plutôt tous les threads spécifiés à une image dans une sortie avant de passer à la sortie suivante.
Si vous ne faites pas de streaming en temps réel, vous avez plus de luxe. La méthode «correcte» consiste probablement à coder à une résolution avec uniquement la taille GOP spécifiée avec -g, puis à coder les autres résolutions en forçant les images clés aux mêmes endroits.
Si vous le souhaitez, vous pouvez utiliser ffprobe pour obtenir les heures des images clés, puis utiliser un script shell ou un véritable langage de programmation pour le convertir en une commande ffmpeg.
Mais pour la plupart des contenus, il y a très peu de différence entre avoir une image clé toutes les 5 secondes et deux images clés toutes les 5 secondes (une forcée et une de scenecut). Il s'agit de la taille moyenne des images I par rapport à la taille des images P et des images B. Si vous utilisez x264 avec des paramètres typiques (la seule raison pour laquelle je pense que vous devriez faire quoi que ce soit pour les modifier est si vous définissez -qmin, comme un moyen médiocre d'empêcher x264 d'utiliser le débit binaire sur un contenu facile; cela limite tous les types de trames à la même valeur , Je pense) et obtenez un résultat comme une taille moyenne de trame I de 46 Ko, une trame P de 24 Ko, une trame B de 17 Ko (moitié moins fréquente que des trames P), puis une trame I supplémentaire chaque seconde à 30 ips est seulement une augmentation de 3% de la taille du fichier. La différence entre h264 et h263 pourrait être constituée d'un tas de diminutions de 3%, mais une seule n'est pas très importante.
Sur d'autres types de contenu, les tailles de trame seront différentes. Pour être honnête, il s'agit de complexité temporelle et non de complexité spatiale, donc ce n'est pas seulement un contenu facile vs un contenu dur. Mais en général, les sites de streaming vidéo ont une limite de débit binaire, et le contenu avec des images I relativement grandes est un contenu facile qui sera encodé à haute qualité quel que soit le nombre d'images clés supplémentaires ajoutées. C'est du gaspillage, mais ces déchets ne seront généralement pas remarqués. Le cas le plus inutile est probablement une vidéo qui n'est qu'une image statique accompagnant une chanson, où chaque image clé est exactement la même.
Une chose dont je ne suis pas sûr est de savoir comment les images clés forcées interagissent avec le limiteur de débit défini avec -maxrate et -bufsize. Je pense que même YouTube a récemment rencontré des problèmes de configuration correcte des paramètres de tampon pour donner une qualité constante. Si vous utilisez simplement des paramètres de débit binaire moyens comme certains sites peuvent le voir (puisque vous pouvez inspecter les options de x264 dans l'atome header / mov? Avec un éditeur hexadécimal), le modèle de tampon n'est pas un problème, mais si vous êtes diffusant du contenu généré par l'utilisateur, le débit binaire moyen encourage les utilisateurs à ajouter un écran noir à la fin de leur vidéo.
L'option -g de Ffmpeg, ou toute autre option d'encodeur que vous utilisez, est mappée à l'option spécifique à l'encodeur. Donc '-x264-params keyint = GOPSIZE' est équivalent à '-g GOPSIZE'.
Un problème avec l'utilisation de la détection de scène est que vous préférez des images clés à proximité de nombres spécifiques pour une raison quelconque. Si vous spécifiez des images clés toutes les 5 secondes et utilisez la détection de scène, et qu'il y a un changement de scène à 4,5, il doit être détecté, mais l'image clé suivante sera à 9,5. Si le temps continue à augmenter comme ça, vous pourriez vous retrouver avec des images clés à 42,5, 47,5, 52,5, etc., au lieu de 40, 45, 50, 55. Inversement, s'il y a un changement de scène à 5,5, alors il y aura une image clé à 5 et 5,5 sera trop tôt pour une autre. Ffmpeg ne vous permet pas de spécifier "créer une image clé ici s'il n'y a pas de changement de scène dans les 30 images suivantes". Cependant, quelqu'un qui comprend C pourrait ajouter cette option.
Pour la vidéo à fréquence d'images variable, lorsque vous ne diffusez pas en direct comme Twitch, vous devriez pouvoir utiliser les changements de scène sans convertir de manière permanente en fréquence d'images constante. Si vous utilisez le filtre 'select' dans ffmpeg et utilisez la constante 'scene' dans l'expression, la sortie de débogage (-v debug ou appuyez plusieurs fois sur '+' lors de l'encodage) affiche le numéro de changement de scène. Ceci est probablement différent et pas aussi utile que le nombre utilisé par x264, mais il pourrait quand même être utile.
La procédure serait alors probablement de faire une vidéo de test uniquement pour les changements d'images clés, mais pourrait peut-être être utilisée pour les données de contrôle de débit si vous utilisez 2 passes. (Je ne sais pas si les données générées sont utiles pour différentes résolutions et paramètres; les données de l'arborescence des macroblocs ne le seront pas.) Convertissez-les en vidéo à fréquence d'images constante, mais voyez ce bogue sur la sortie du bégaiement lors de la réduction de moitié du framerate si jamais vous décidez pour utiliser le filtre fps à d'autres fins. Exécutez-le via x264 avec les images clés et les paramètres GOP souhaités.
Utilisez ensuite ces temps d'images clés avec la vidéo à fréquence d'images variable d'origine.
Si vous autorisez un contenu généré par l'utilisateur complètement fou avec un intervalle de 20 secondes entre les images, alors pour l'encodage à fréquence d'images variable, vous pouvez diviser la sortie, utiliser le filtre fps, utiliser en quelque sorte le filtre de sélection (peut-être créer une expression très longue qui a chaque image clé) ... ou vous pouvez peut-être utiliser la vidéo de test comme entrée et décoder uniquement les images clés, si cette option ffmpeg fonctionne, ou utiliser le filtre de sélection pour sélectionner les images clés. Ensuite, redimensionnez-le à la bonne taille (il y a même un filtre scale2ref pour cela) et superposez la vidéo originale dessus. Utilisez ensuite le filtre d'entrelacement pour combiner ces images clés forcées destinées à être utilisées avec la vidéo d'origine. Si cela se traduit par deux images distantes de 0,001 seconde que le filtre d'entrelacement n'empêche pas, résolvez vous-même ce problème avec un autre filtre de sélection. Le traitement des limites de tampon de trame pour le filtre d'entrelacement pourrait être le problème principal ici. Ceux-ci pourraient tous fonctionner: utiliser une sorte de filtre pour tamponner le flux plus dense (filtre fifo?); se référer au fichier d'entrée plusieurs fois pour qu'il soit décodé plus d'une fois et les images n'ont pas besoin d'être stockées; utiliser le filtre 'streamselect', ce que je n'ai jamais fait, exactement au moment des images clés; améliorer le filtre d'entrelacement en modifiant son comportement par défaut ou en ajoutant une option pour sortir la plus ancienne trame dans un tampon au lieu de supprimer une trame. ce que je n'ai jamais fait, exactement au moment des images clés; améliorer le filtre d'entrelacement en modifiant son comportement par défaut ou en ajoutant une option pour sortir la plus ancienne trame dans un tampon au lieu de supprimer une trame. ce que je n'ai jamais fait, exactement au moment des images clés; améliorer le filtre d'entrelacement en modifiant son comportement par défaut ou en ajoutant une option pour sortir la plus ancienne trame dans un tampon au lieu de supprimer une trame.