web-dev-qa-db-fra.com

Que signifie "durée passée X.XXX trop grande"?

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.

125
Erik

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.

16
larryy

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.

85
Josh Davis

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:

53
mxmlnkn

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.

47
Erik

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

2
Ned