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 .....`
Vi.
la source

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.

John Lemberger
la source
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

slhck
la source
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 '"'`
Être remplacé
la source
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