44 votes

Comment puis-je obtenir le nombre de frames dans une vidéo sur la ligne de commande Linux?

J'ai un fichier vidéo et je veux obtenir le nombre d'images vidéo qui s'y trouvent. Je peux utiliser ffmpeg pour obtenir la durée de la vidéo et les IPS. Cependant, je ne vois rien d'évident pour le nombre total d'images.

En théorie, on devrait pouvoir multiplier la durée (en secondes) par les IPS pour obtenir le nombre d'images, mais dans ce cas, la durée (34,43 secondes) et le taux d'images par seconde (29,97 ips) donnent un non-entier, ce qui me fait penser que je fais quelque chose de mal.

J'ai besoin de pouvoir faire cela en ligne de commande de manière totalement automatisée et non graphique. J'ai aussi besoin que cela soit assez précis, et non une estimation (si c'est même possible avec des fichiers vidéo)

J'ai essayé d'utiliser tcprobe sur certains fichiers. Pour certains fichiers AVI cela fonctionne, mais pour certains fichiers VOB, la sortie de tcprobe n'indique pas le nombre d'images. Voici la sortie que j'obtiens:

[tcprobe] Flux de programme MPEG (PS)
[tcprobe] Résumé pour myfile.vob, (*) = non par défaut, 0 = non détecté
taille de l'image importée: -g 720x480 [720x576] (*)
     ratio d'aspect: 4:3 (*)
          taux d'images par seconde: -f 29.970 [25.000] frc=4 (*)
                                       PTS=2199.3972, frame_time=33ms bitrate=7000 kbps
                        piste audio: -a 0 [0] -e 48000,16,5 [48000,16,2] -n 0x2000 [0x2000] (*)
                                       PTS=2199.2763, bitrate=192 kbps
                                       -D 3 --av_fine_ms 20 (images & ms) [0] [0]

45voto

Joe Cassara Points 1

ffprobe peut être utilisé pour obtenir des informations sur un fichier multimédia :

ffprobe -select_streams v -show_streams input.avi

Vous obtiendrez des détails sur le flux :

nb_frames=159697

Recherchez nb_frames avec grep :

ffprobe -select_streams v -show_streams input.avi 2>/dev/null | grep nb_frames | sed -e 's/nb_frames=//'

Cela fonctionne pour les fichiers avi, mp4, etc. Pour certains conteneurs, il ne montre pas de valeur valide, par exemple mpeg.

Dans ce cas, cela fonctionne ffprobe -show_packets a.mpg 2>/dev/null | grep video | wc -l

23voto

user23307 Points 6595

C'est horrible, stupide et lent, mais ça semble fonctionner :

ffmpeg -i foo.avi -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1

Cela fonctionnera également correctement sur des fichiers tronqués et des flux bruts (c'est pourquoi vous n'obtenez rien pour les fichiers .vob)

16voto

user12786 Points 454

J'ai posté ceci sur une autre question. En utilisant l'outil tcprobe (du package transcode), le nombre de frames est inclus dans les infos. Utilisez l'interrupteur -i pour obtenir un dump d'info du fichier :

$ tcprobe -i foo.avi
[tcprobe] données RIFF, vidéo AVI
[avilib] V: 29.970 fps, codec=XVID, frames=38630, width=512, height=384
[avilib] A: 48000 Hz, format=0x55, bits=16, canaux=2, débit=128 kbps,
[avilib]    53707 chunks, 21768720 bytes, VBR
[tcprobe] résumé pour foo.avi, (*) = non par défaut, 0 = non détecté
importer taille du frame: -g 512x384 [720x576] (*)
       taux de frame: -f 29.970 [25.000] frc=4 (*)
      piste audio: -a 0 [0] -e 48000,16,2 [48000,16,2] -n 0x55 [0x2000] (*)
                   débit=128 kbps
           durée: 38630 frames, frame_time=33 msec, durée=0:21:28.954

Notez que le nombre de frames est donné sur deux lignes ici (2ème ligne de sortie et dernière ligne de sortie).

12voto

Elder Geek Points 617

J'ai trouvé que mediainfo --fullscan inputfile | grep "Frame count" fonctionne bien pour la plupart des fichiers.

Les systèmes basés sur Debian peuvent l'installer avec apt-get install mediainfo

Si vous obtenez 2 lignes plutôt qu'une de sortie, la première ligne est la piste vidéo et la deuxième ligne est la piste audio. Il semble que cela se produise sur des fichiers avec un débit binaire audio variable.

Testé sur des échantillons .mkv, .m4v, .mp4, flv, vob et .avi à la date de la modification.

Sources : Comment récupérer des informations sur des fichiers vidéo en ligne de commande sous Linux? et tests sous les variantes Ubuntu.

Vous pouvez trouver mediainfo disponible pour votre OS ici.

6voto

xenoid Points 9208

Directement avec mediainfo, pas de grep, pas d'attente, rien :

mediainfo --Inform='Video;%FrameCount%' $the_file

Pour d'autres informations, consultez mediainfo --info-parameters

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X