Comment obtenir la longueur d'un fichier vidéo depuis la console?


24

Supposons que nous ayons un fichier vidéo some_video.

Comment puis-je obtenir sa longueur à partir d'un script shell (avec mplayer / transcode / gstreamer / vlc / ffmpeg / que ce soit)?

VIDEO_LENGTH_IN_SECONDS=`ffmpeg .... -i some_video ... | grep -o .....`

Réponses:


33
ffprobe -i some_video -show_entries format=duration -v quiet -of csv="p=0"

renverra la durée de la vidéo en secondes.


Je ne connaissais pas ffprobe , merci!
ckujau

21

Quelque chose de similaire à:

ffmpeg -i input 2>&1 | grep "Duration"| cut -d ' ' -f 4 | sed s/,//

Cela fournira: HH:MM:SS.ms. Vous pouvez également utiliser ffprobe, qui est fourni avec la plupart des installations FFmpeg:

ffprobe -show_format input | sed -n '/duration/s/.*=//p'

… ou:

ffprobe -show_format input | grep duration | sed 's/.*=//')

Pour convertir en secondes (et conserver les millisecondes), canalisez en:

awk '{ split($1, A, ":"); print 3600*A[1] + 60*A[2] + A[3] }'

Pour le convertir en millisecondes, canalisez en:

awk '{ split($1, A, ":"); print 3600000*A[1] + 60000*A[2] + 1000*A[3] }'

Si vous voulez juste les secondes sans les millisecondes, dirigez-vous vers:

awk '{ split($1, A, ":"); split(A[3], B, "."); print 3600*A[1] + 60*A[2] + B[1] }'

Exemple:

entrez la description de l'image ici


Aussi tcprobe est conçu pour cela, mais cela ne fonctionne pas bien sur mon système.
Vi.

1
... ma modification a été rejetée, donc je posterai ici que la première étape peut être accomplie de manière plus concise avec ffprobe, un outil conçu pour exactement ce genre de fins qui est fourni avec ffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p'(ou ffprobe -show_format input | grep duration | sed 's/.*=//'). Peut-être que @slhck peut le modifier directement dans la réponse.
evilsoup

Désolé pour ça, @evilsoup. Je devrais peut-être faire une mise en garde que vous et LordNeckbeard êtes autorisés à modifier librement mes messages — j'ai déjà eu ce problème plusieurs fois. La prochaine fois, il suffit d'ajouter une petite note au message d'édition :)
slhck

0

Si vous n'y avez pas accès ffprobe, vous pouvez utiliser mediainfo.

# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`

1
Éliminez le besoin de jqet tr:mediainfo --Output="General;%Duration/String%" input
llogan

Soigné! Je vais laisser ma réponse non modifiée pour l'instant car la sortie de votre commande est de la forme X s YYY msversus X.YYY. Assez facile à régler | sed -e 's/ s /./' -e 's/ ms//'si vous souhaitez emprunter cette route et que vous n'y avez pas accès jq.
ToBeReplaced

Cela peut être changé avec mediainfo --Output="General;%Duration/String3%" inputen sortie 00:01:48.501au lieu de 1 min 48 s.
llogan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.