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
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
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}'
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. Ajoutez -skip_frame nokey
.
ffprobe
et ffmpeg
. 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.
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
.
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
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 ' '
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
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.
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]