En encodant H.264 en utilisant ffmpeg, je reçois en masse le type d’avertissements 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 de ffmpeg.
Je recevais des milliers de ces avertissements avec un code particulier. Je réduisais la vidéo 1080p en 480p. À un point de montage, où il y avait de la vidéo douteuse en raison d'un défaut du disque laser source, ces messages ont commencé à s'afficher, puis sont apparus pour chaque image par la suite. Ils ont continué encore et encore, comme ce court extrait:
Past duration 0.901115 too large= 535031kB time=00:54:15.06 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 31 times
Past duration 0.901115 too large= 535031kB time=00:54:15.62 bitrate=1346.3kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 34 times
Past duration 0.901115 too large= 535031kB time=00:54:16.21 bitrate=1346.0kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 36 times
Past duration 0.901115 too large= 535338kB time=00:54:16.83 bitrate=1346.5kbits/s dup=0 drop=19 speed=1.15x
Last message repeated 39 times
L'invocation ffmpeg originale était la suivante:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv
En suivant les suggestions ici, j’ai d’abord ajouté -framerate 60000/1001 à l’entrée. Cela n'a rien amélioré. J'ai retenu -framerate et ajouté -r 60000/1001 à la sortie. Cela n'a encore rien amélioré. En retenant les deux, j'ai finalement ajouté -async 1 -vsync 1. Cela m'a valu de recevoir un seul avertissement, et c'est tout. Cette invocation était:
ffmpeg -i input.mp4 -framerate 60000/1001 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -r 60000/1001 -async 1 -vsync 1
La seule différence que j'ai trouvée dans un vidage détaillé de MediaInfo est la suppression de cette ligne trouvée dans l'invocation d'origine, mais pas dans la seconde:
Delay relative to video : -33ms
Cependant, j'ai vérifié la synchronisation A/V au début et à la fin des fichiers et il n'y avait aucune différence perceptible de synchronisation entre les deux fichiers. Leurs temps de parcours é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:
ffmpeg -i output.mkv -map 0:v:0 -c copy -f null -
et en recherchant "frame = #" vers la fin de la sortie.
Il s'avère que la vidéo source était longue de 375226 images, l'invocation initiale donnait 375195 images et la deuxième invocation, 375200. Ainsi, la seconde 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 étaient inutiles, et le simple fait d'utiliser les deux indicateurs de synchronisation était suffisant. Cela a produit des résultats identiques à ceux de la deuxième invocation ci-dessus. La troisième et plus simple invocation que j'ai trouvée pour résoudre le problème est la suivante:
ffmpeg -i input.mp4 -s 720x480 -c:v libx264 -preset slower -crf 17 -c:a copy -y output.mkv -async 1 -vsync 1
Et un autre fichier a ensuite produit une série de ces avertissements, même avec les drapeaux de synchronisation, mais en rajoutant les drapeaux de taux "corrigés" (produit seulement deux avertissements au lieu de milliers). Alors 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 espère que cela résoudra la plupart de ces problèmes.
C'était tout avec la version 4.0 de ffmpeg.
L'un des responsables du projet DVDStyler sur SourceForge a déclaré this à ce sujet:
Les versions FFMpeg postérieures au 15 janvier 2015 affichent souvent cet avertissement. Il a été ajouté pour avertir du risque de distorsion du contrôle du taux, sinon il ne cause aucun dommage.
Ce message d'avertissement apparaît lorsque vous tentez de coder une source à haute fréquence d'images sur une sortie à faible fréquence d'images, ce qui signifie que des images doivent être supprimées.
J'ai eu cette erreur parce que je voulais convertir une série d'images en vidéo:
ffmpeg -i %05d.png -r 24 -c:v libx264 -crf 5 out.mkv
Le problème semble être que si aucune cadence n’est donnée pour l’entrée, on suppose une cadence de 25 fps:
Input #0, image2, from 'frames/%04d.bmp':
Duration: 00:00:15.96, start: 0.000000, bitrate: N/A
Stream #0:0: Video: bmp, bgra, 920x650, 25 fps, 25 tbr, 25 tbn, 25 tbc
Ceci peut également être vu sur le nombre total d'images encodées. J'avais 400 images, mais la commande ci-dessus ne codait que 384:
frame= 384 fps= 68 q=-1.0 Lsize= 10931kB time=00:00:15.91 bitrate=5626.1kbits/s dup=0 drop=15
video:10928kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.033807%
Les messages d'erreur disparaissent en définissant la fréquence d'images d'entrée à la place de la fréquence d'images en sortie. La fréquence d'images en sortie sera alors automatiquement choisie pour être celle de l'entrée. De plus, dans les nouvelles versions de ffmpeg, vous devez faire attention, car lorsque vous utilisez des images PNG avec l'option -i
ou plutôt le format d'entrée image2
ou v4l2
, vous devez utiliser -framerate
. au lieu de -r
, voir le documentation pour l'option -r
) .
ffmpeg -framerate 24 -i %05d.png -c:v libx264 -crf 5 out.mkv
Il est également possible de spécifier la cadence d'images de l'entrée et de la sortie séparément:
ffmpeg -framerate 25 -i %05d.png -r 10 -c:v libx264 -crf 5 out.mkv
Dans ce cas, seules les images 161/400 seront codées. Les autres cadres intermédiaires seront supprimés. De plus, le message d'erreur disparaît, afin de ne pas ralentir ffmpeg en envoyant du spam à la sortie standard, voir:
En regardant 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 fixée à 0.6.
Extraits de la source:
delta0 = sync_ipts - ost->sync_opts;
delta = delta0 + duration;
...
if (delta0 < 0 &&
delta > 0 &&
format_video_sync != VSYNC_PASSTHROUGH &&
format_video_sync != VSYNC_DROP) {
double cor = FFMIN(-delta0, duration);
if (delta0 < -0.6) {
av_log(NULL, AV_LOG_WARNING, "Past duration %f too large\n", -delta0);
} else
av_log(NULL, AV_LOG_DEBUG, "Cliping frame in rate conversion by %f\n", -delta0);
sync_ipts += cor;
duration -= cor;
delta0 += cor;
}
Ce n’est qu’un rapide coup d’œil, alors n'hésitez pas à creuser plus profondément.
Conformément à numéro FFmpeg n ° 4700 - durée antérieure 0.999992 trop importante il s’agit simplement d’un avertissement. Utilisation:
ffmpeg -loglevel -quiet -i input_file.xyz ....
Pour l'arrêter.
Ned