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.
Réponses
Trop de publicités?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
.
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.