Récupère le nombre d’images par ffmpeg

Est-ce que quelqu’un sait comment récupérer le nombre total d’images d’un fichier vidéo en utilisant ffmpeg? La sortie de rendu de ffmpeg montre l’image en cours et j’ai besoin du nombre d’images pour calculer la progression en pourcentage.

Remarque: La présence d’une liste de modification dans MP4 / M4V / M4A / MOV peut affecter votre numéro d’image. Voir Modifier les listes ci dessous.

ffprobe & ffmpeg

ffprobe : ffprobe le conteneur

 ffprobe -v error -count_frames -select_streams v:0 -show_ensortinges stream=nb_frames -of default=nokey=1:noprint_wrappers=1 input.mp4 
  • C’est une méthode rapide.
  • Tous les formats ne signaleront pas le nombre d’images, ce qui entraîne la sortie de N/A Voir les autres méthodes énumérées ci-dessous.

ffprobe : ffprobe et compte le nombre d’images

 ffprobe -v error -count_frames -select_streams v:0 -show_ensortinges stream=nb_read_frames -of default=nokey=1:noprint_wrappers=1 input.mkv 
  • C’est une méthode lente. Comme tout le fichier doit être décodé, son exécution peut prendre un certain temps, en fonction de la durée et de la complexité de votre saisie.

ffmpeg : décode et compte le nombre d’images

Si vous n’avez pas ffprobe vous pouvez utiliser ffmpeg et awk place:

 ffmpeg -i input.mkv -map 0:v:0 -c copy -f null - 2>&1 | awk '/frame=/ {print $2}' 
  • C’est une méthode lente. Comme tout le fichier doit être décodé, son exécution peut prendre un certain temps, en fonction de la durée et de la complexité de votre saisie.
  • Vous pouvez omettre 2>&1 | awk '/frame=/{print $2}' 2>&1 | awk '/frame=/{print $2}' si vous n’avez pas awk , comme sous Windows, et que vous vous référez à frame= près de la fin de la sortie de la console.

Ne comptez que les images clés

Ajoutez -skip_frame nokey .

  • Fonctionne pour ffprobe et ffmpeg .

Modifier les listes

Ignorez la liste d’édition MP4 / M4V / M4A / MOV avec l’option d’entrée -ignore_editlist 1 . La valeur par défaut est de ne pas ignorer la liste de modification.

Que signifient les options de ffprobe

  • -v error Cela masque la sortie “info” (informations de version, etc.), ce qui facilite l’parsing.

  • -count_frames Comptez le nombre d’images par stream et signalez-le dans la section de stream correspondante.

  • -select_streams v:0 Sélectionnez uniquement le stream vidéo.

  • -show_ensortinges stream=nb_frames ou -show_ensortinges stream=nb_read_frames Affiche uniquement l’entrée pour nb_frames ou nb_read_frames .

  • -of default=nokey=1:noprint_wrappers=1 Définit le format de sortie (alias “writer”) par default , n’imprime pas la clé de chaque champ ( nokey=1 ) et n’imprime pas l’en-tête ni le pied de page ( noprint_wrappers=1 ). Il existe des alternatives plus courtes telles que -of csv=p=0 .

Regarde aussi

  • Documentation FFprobe
  • FFmpeg Wiki: Astuces FFprobe

mediainfo

L’outil mediainfo bien connu peut générer le nombre d’images:

 mediainfo --Output="Video;%FrameCount%" input.avi 

MP4Box

Pour les fichiers MP4 / M4V / M4A.

MP4Box de gpac peut afficher le nombre d’images:

 MP4Box -info input.mp4 

Reportez-vous à la ligne Media Info dans la sortie du stream vidéo en question:

 Media Info: Language "Undetermined (und)" - Type "vide:avc1" - 2525 samples 

Dans cet exemple, le stream vidéo a 2525 images.


boxdumper

Pour les fichiers MP4 / M4V / M4A / MOV.

boxdumper est un outil simple de l-smash. Il produira une grande quantité d’informations. Sous la stsz taille d’échantillon stsz , reportez-vous à la section sample_count pour le nombre d’images. Dans cet exemple, l’entrée comporte 1900 images vidéo:

 boxdumper input.mp4 ... [stsz: Sample Size Box] position = 342641 size = 7620 version = 0 flags = 0x000000 sample_size = 0 (variable) sample_count = 1900 
  • Sachez qu’un fichier peut avoir plus d’un atome de stsz .

Dans Unix, cela fonctionne comme du charme:

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

Calculez-le en fonction du temps, à la place.

C’est ce que je fais et cela fonctionne très bien pour moi et pour beaucoup d’autres.) Premièrement, trouvez la longueur de la vidéo dans l’extrait 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/Dissortingct9.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 capable de trouver régulièrement et en toute sécurité Duration: hh:mm:ss.nn pour déterminer la taille du clip vidéo source. Ensuite, pour chaque ligne de mise à jour (CR, pas de LF), vous pouvez parsingr le texte correspondant à l’heure actuelle:

 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 

Soyez attentif à ne pas toujours vous attendre à une 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 simple: time / durration * 100 = % done .

Tous les formats ne stockent pas leur nombre d’images ou leur durée totale – et même s’ils le sont, le fichier peut être incomplet – par conséquent, ffmpeg ne les détecte pas correctement par défaut.

Au lieu de cela, essayez de chercher à la fin du fichier et lisez l’heure, puis comptez l’heure actuelle pendant que vous partez.

Alternativement, vous pouvez essayer AVFormatContext->nb_index_ensortinges ou la durée détectée, qui devrait fonctionner sur AVI / MOV au moins intact, ou sur la bibliothèque FFMS2, ce qui est probablement trop lent pour une barre de progression.

Essayez quelque chose comme:

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

Il écrit le numéro de trame sur stderr, vous pouvez donc récupérer la dernière image.

Vous pouvez utiliser ffprobe pour obtenir le numéro d’image avec les commandes suivantes

  1. première méthode

ffprobe.exe -i video_name -print_format json -loglevel fatal -show_streams -count_frames -select_streams v

qui indiquent à imprimer des données au format json

select_streams v indiquera à ffprobe de nous donner video données de stream video et si vous les supprimez, il vous fournira également audio informations audio

et la sortie sera comme

 { "streams": [ { "index": 0, "codec_name": "mpeg4", "codec_long_name": "MPEG-4 part 2", "profile": "Simple Profile", "codec_type": "video", "codec_time_base": "1/25", "codec_tag_ssortingng": "mp4v", "codec_tag": "0x7634706d", "width": 640, "height": 480, "coded_width": 640, "coded_height": 480, "has_b_frames": 1, "sample_aspect_ratio": "1:1", "display_aspect_ratio": "4:3", "pix_fmt": "yuv420p", "level": 1, "chroma_location": "left", "refs": 1, "quarter_sample": "0", "divx_packed": "0", "r_frame_rate": "10/1", "avg_frame_rate": "10/1", "time_base": "1/3000", "start_pts": 0, "start_time": "0:00:00.000000", "duration_ts": 256500, "duration": "0:01:25.500000", "bit_rate": "261.816000 Kbit/s", "nb_frames": "855", "nb_read_frames": "855", "disposition": { "default": 1, "dub": 0, "original": 0, "comment": 0, "lyrics": 0, "karaoke": 0, "forced": 0, "hearing_impaired": 0, "visual_impaired": 0, "clean_effects": 0, "attached_pic": 0 }, "tags": { "creation_time": "2005-10-17 22:54:33", "language": "eng", "handler_name": "Apple Video Media Handler", "encoder": "3ivx D4 4.5.1" } } ] } 

2. vous pouvez utiliser

 ffprobe -v error -show_format -show_streams video_name 

qui vous donnera des données de stream, si vous voulez des informations sélectionnées comme la fréquence d’images, utilisez la commande suivante

 ffprobe -v error -select_streams v:0 -show_ensortinges stream=avg_frame_rate -of default=noprint_wrappers=1:nokey=1 video_name 

qui donnent une base numérique à vos informations vidéo, le problème est que lorsque vous utilisez cette méthode, il est possible que vous obteniez un N/A en sortie.

pour plus d’informations, consultez cette page Astuces FFProbe

essaye ça:

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

pour tirer parti de la réponse de stu. Voici comment j’ai trouvé la fréquence d’images d’une vidéo à partir de mon téléphone portable. J’ai exécuté la commande suivante pendant un moment. Je laisse le décompte d’environ 10 000 avant que je ne sois impatient et que je n’appuie sur ^ C:

 $ ffmpeg -i 2013-07-07\ 12.00.59.mp4 -f null /dev/null 2>&1 ... Press [q] to stop, [?] for help [null @ 0x7fcc80836000] Encoder did not produce proper pts, making some up. frame= 7989 fps= 92 q=0.0 Lsize=N/A time=00:04:26.30 bitrate=N/A dup=10 drop=0 video:749kB audio:49828kB subtitle:0 global headers:0kB muxing overhead -100.000042% Received signal 2: terminating. $ 

alors, j’ai saisi deux informations de cette ligne qui commence par “frame =”, le nombre d’images, 7989 et l’heure, 00: 04: 26.30. Vous devez d’abord convertir le temps en secondes, puis diviser le nombre d’images par secondes pour obtenir “images par seconde”. “images par seconde” est votre fréquence d’images.

 $ bc -l 0*60*60 + 4*60 + 26.3 266.3 7989/(4*60+26.3) 30.00000000000000000000 $ 

le framerate pour ma vidéo est de 30 images par seconde.

La seule précision que j’ai pu faire est la suivante:

 ffprobe -i my_video.mp4 -show_frames 2>&1|grep -c '^\[FRAME' 

Pour que cela fonctionne avec la vidéo:

 ffprobe -i my_video.mp4 -show_frames 2>&1 | grep -c media_type=video 

J’utilise le php_ffmpeg alors je peux obtenir tous les temps et toutes les images d’un film. Comme belows

 $input_file='/home/strone/workspace/play/CI/abc.rmvb'; $ffmpegObj = new ffmpeg_movie($input_file); echo $ffmpegObj->getDuration(); echo $ffmpegObj->getFrameCount(); 

Et puis le détail est sur la page.

http://ffmpeg-php.sourceforge.net/doc/api/ffmpeg_movie.php

Désolé pour la réponse necro, mais peut-être aurez-vous besoin de cela (car je n’ai pas trouvé de solution pour les versions récentes de ffmpeg).

Avec ffmpeg 3.3.4, j’ai trouvé que l’on peut trouver avec les éléments suivants:

 ffprobe -i video.mp4 -show_streams -hide_banner | grep "nb_frames" 

À la fin, le nombre d’images sera généré. Cela a fonctionné pour moi sur des vidéos avec audio. Il donne deux fois une ligne “nb_frames”, mais la première ligne était le nombre d’images réel sur les vidéos que j’ai testées.

linux

 ffmpeg -i "/home/iorigins/Завантаження/123.mov" -f null /dev/null 

rbuy

 result = `ffmpeg -i #{path} -f null - 2>&1` r = result.match("frame=([0-9]+)") pr[1]