102 votes

Récupérer le nombre d'images avec ffmpeg

Personne ne sait comment récupérer le nombre de cadres à partir d'un fichier vidéo à l'aide de ffmpeg? Le rendu de sortie de ffmpeg montre l'image en cours et j'ai besoin que le nombre d'images à calculer la progression en pourcentage.

23voto

ataraxic Points 319

Cela fonctionne comme un charme:

ffmpeg -i 00000.avi -vcodec copy -acodec copy -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

13voto

Stu Thompson Points 16599

Calculer en fonction de l'heure, à la place.

C'est ce que je fais et ça marche très bien pour moi, et beaucoup d'autres.) Tout d'abord, trouver la longueur de la vidéo dans l'extrait de code ci-dessous:

Seems stream 0 codec frame rate differs from container frame rate: 5994.00 
(5994/1) -> 29.97 (30000/1001)
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/stu/Movies/District9.mov':
  Duration: 00:02:32.20, start: 0.000000, bitrate: 9808 kb/s
    Stream #0.0(eng): Video: h264, yuv420p, 1920x1056, 29.97tbr, 2997tbn, 5994tbc
    Stream #0.1(eng): Audio: aac, 44100 Hz, 2 channels, s16
    Stream #0.2(eng): Data: tmcd / 0x64636D74

Vous devez être en mesure de toujours et en toute sécurité trouver Duration: hh:mm:ss.nn afin de déterminer la source de vidéo clip la taille. Ensuite, pour chaque ligne de mise à jour (CR, pas de LF), vous pouvez analyser le texte à l'heure actuelle marque c'est:

frame=   84 fps= 18 q=10.0 size=       5kB time=1.68 bitrate=  26.1kbits/s    
frame=   90 fps= 17 q=10.0 size=       6kB time=1.92 bitrate=  23.8kbits/s    
frame=   94 fps= 16 q=10.0 size=     232kB time=2.08 bitrate= 913.0kbits/s    

Juste attention de ne pas toujours attendre de sortie parfaite de ces lignes d'état. Ils peuvent inclure des messages d'erreur comme ici:

frame=   24 fps= 24 q=-1.0 size=       0kB time=1.42 bitrate=   0.3kbits/s    
frame=   41 fps= 26 q=-1.0 size=       0kB time=2.41 bitrate=   0.2kbits/s    
[h264 @ 0x1013000]Cannot parallelize deblocking type 1, decoding such frames in
sequential order
frame=   49 fps= 24 q=26.0 size=       4kB time=0.28 bitrate= 118.1kbits/s    
frame=   56 fps= 22 q=23.0 size=       4kB time=0.56 bitrate=  62.9kbits/s    

Une fois que vous avez le temps, c'est un simple calcul: time / durration * 100 = % done.

8voto

alex strange Points 892

Pas tous les formats de magasin de leur nombre d'images ou la durée totale - et même s'ils le font, le fichier est peut-être incomplet - si ffmpeg ne pas détecter de façon précise par défaut.

Au lieu de cela, essayez de rechercher jusqu'à la fin du fichier et lire le temps, puis de compter le temps actuel, tandis que vous allez.

Sinon, vous pouvez essayer d' AVFormatContext->nb_index_entries ou à la détection de la durée, qui doit travailler sur amende d'au moins intact AVI/MOV, ou à la bibliothèque FFMS2, qui est probablement trop lente à s'embêter avec une barre de progression.

8voto

a1kmm Points 656

Essayez quelque chose comme:

ffmpeg -i "path to file" -f null /dev/null

Il écrit le numéro de l'image sur la sortie stderr, de sorte que vous pouvez récupérer la dernière image de cette.

4voto

Julien Points 31

essayez ceci:

ffmpeg -i "path to file" -f null /dev/null 2>&1 | grep 'frame=' | cut -f 2 -d ' '

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X