Lors de l'encodage H.264 à l'aide de ffmpeg, j'obtiens en masse le type d'avertissement suivant:
Past duration 0.603386 too large
Past duration 0.614372 too large
Past duration 0.606377 too large
Que signifient-ils? Je n'ai rien trouvé de clair en ligne ou dans la documentation ffmpeg.
Réponses:
Je recevais des milliers de ces avertissements avec un encodage particulier. Je réduisais la vidéo 1080p à 480p. À un point de montage, où il y avait une vidéo douteuse en raison d'un défaut dans le disque laser source, ces messages ont commencé à apparaître et sont ensuite apparus pour, je pense, chaque image par la suite. Ils ont continué encore et encore, comme ce court extrait:
L'appel original de ffmpeg était le suivant:
Suite aux suggestions ici, j'ai d'abord ajouté -framerate 60000/1001 à l'entrée. Cela n'a rien amélioré. J'ai conservé -framerate et ajouté -r 60000/1001 à la sortie. Cela n'a toujours rien amélioré. En conservant les deux, j'ai finalement ajouté -async 1 -vsync 1. Cela m'a permis de recevoir un seul avertissement, et c'est tout. Cette invocation était:
La seule différence que j'ai trouvée dans un vidage détaillé de MediaInfo était la suppression de cette ligne trouvée dans l'invocation d'origine mais pas dans la seconde:
Cependant, j'ai vérifié la synchronisation A / V vers le début des fichiers et vers la fin, et il n'y avait aucune différence perceptible de synchronisation entre les deux fichiers. Leurs temps de fonctionnement étaient également les mêmes, mais cela n'était mesuré qu'à la seconde près, en VLC. J'ai donc vérifié le nombre d'images en utilisant ffmpeg comme ceci:
et recherchez "frame = #" vers la fin de la sortie.
Il s'avère que la vidéo source a une longueur de 375226 images, l'invocation d'origine a donné 375195 images et la deuxième invocation a donné 375200. Ainsi, la deuxième invocation, avec beaucoup moins de messages d'avertissement, a également perdu 5 images de moins.
Des tests ultérieurs ont montré que -framerate et -r n'étaient pas nécessaires et que l'utilisation des deux indicateurs de synchronisation était suffisante. Cela a produit des résultats identiques à la deuxième invocation ci-dessus, donc la troisième et la plus simple invocation que j'ai trouvée pour résoudre le problème est la suivante:
Et encore un autre fichier a produit par la suite un tas de ces avertissements même avec les drapeaux de synchronisation, mais en rajoutant les indicateurs de taux "corrigés" il (produit seulement deux au lieu de milliers d'avertissements). Parfois, la deuxième invocation fonctionne alors que la troisième ne fonctionne pas. Pour mes besoins immédiats, je vais me contenter de la deuxième invocation et j'espère qu'elle résoudra la plupart de ces problèmes.
C'était tout avec ffmpeg version 4.0.
la source
-async 1 -vsync 1
je l'ai résolu.Un des responsables du projet DVDStyler sur SourceForge a dit ceci à ce sujet:
la source
Ce message d'avertissement apparaît lorsque vous essayez d'encoder une source à fréquence d'images élevée sur une sortie à faible fréquence d'images, ce qui signifie que les images doivent être supprimées.
J'ai eu cette erreur car je voulais convertir une série d'images en vidéo:
Le problème semble être que si aucune fréquence d'images n'est donnée pour l'entrée, une fréquence d'images de 25 ips est supposée:
Cela peut également être vu sur le nombre total de trames codées. J'avais 400 images, mais la commande ci-dessus n'a encodé que 384:
Les messages d'erreur disparaissent en définissant la fréquence d'images d'entrée à la place si la fréquence d'images de sortie. La fréquence d'images de sortie sera alors automatiquement choisie pour être celle de l'entrée. De plus, dans les versions plus récentes de ffmpeg, vous devez faire attention, car lorsque vous utilisez des images PNG avec l'
-i
option ou plutôt le format d'entréeimage2
ouv4l2
, vous devez utiliser à la-framerate
place de-r
, voir la documentation de l'-r
option .Il est également possible de spécifier séparément la fréquence d'images de l'entrée et de la sortie:
Dans ce cas, seules 161/400 trames seront encodées. Les autres images intermédiaires seront supprimées. De plus, le message d'erreur disparaît, je suppose que pour ne pas ralentir ffmpeg en envoyant du spam à stdout, voir:
la source
-r
travaillé là où l'utilisation-framerate
ne l'a pas fait.ffmpeg -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
pour cela sans plus d'avertissementffmpeg -framerate 50 -pattern_type glob -i '*.jpg' -filter:v "setpts=0.25*PTS" -r 50 "$( date "+%Y-%m-%d_%H%M%S")-timelapse-x4-50fps.mp4"
(notez l'-framerate 50
ajout pour l'entrée)En regardant le code source, il semble que la différence entre le temps de présentation (pts) dans le flux d'entrée diffère de celle du flux de sortie de plus d'une limite fixe fixée à 0,6.
Extraits de la source:
...
Ce n'est qu'un rapide coup d'œil, alors n'hésitez pas à creuser plus profondément.
la source
format_video_sync = VSYNC_DROP
ouformat_video_sync = VSYNC_PASSTHROUGH
voir si l'une de ces options est viable dans votre cas d'utilisation.-r
commutateur "fixe" ces avertissements.Selon FFmpeg issue # 4700 - La durée passée 0,999992 est trop grande, ce n'est qu'un avertissement. Utilisation:
Pour l'arrêter.
Ned
la source
La commande devrait en fait être:
Il n'y a pas de préfixe "-" pour le paramètre "quiet", car ce n'est pas une option, mais plutôt une valeur pour l'option "-loglevel".
la source