Come posso ottenere la lunghezza di un file video dalla console?


24

Supponiamo di avere un file video some_video.

Come posso ottenere la sua lunghezza da uno script di shell (con mplayer / transcode / gstreamer / vlc / ffmpeg / qualunque cosa)?

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

Risposte:


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

restituirà la durata del video in secondi.


Non sapevo di ffprobe , grazie!
ckujau,

21

Qualcosa di simile a:

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

Questo fornirà: HH:MM:SS.ms. È inoltre possibile utilizzare ffprobe, fornito con la maggior parte delle installazioni di FFmpeg:

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

… o:

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

Per convertire in secondi (e conservare i millisecondi), esegui il pipe in:

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

Per convertirlo in millisecondi, esegui il pipe in:

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

Se vuoi solo i secondi senza i millisecondi, inserisci:

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

Esempio:

inserisci qui la descrizione dell'immagine


Anche tcprobe è progettato per questo, ma non funziona bene sul mio sistema.
Vi.

1
... la mia modifica è stata respinta, quindi posterò qui che il primo passo può essere realizzato in modo più conciso ffprobe, uno strumento progettato esattamente per questo tipo di scopi che è impacchettato con ffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p'(o ffprobe -show_format input | grep duration | sed 's/.*=//'). Forse @slhck può modificarlo direttamente nella risposta.
evilsoup,

Mi dispiace, @evilsoup. Forse dovrei fare una dichiarazione di non responsabilità sul fatto che tu e LordNeckbeard potete modificare liberamente i miei post: ho già avuto questo problema alcune volte. La prossima volta aggiungi una piccola nota al messaggio di modifica o giù di lì :)
slhck

0

Nel caso in cui non si abbia accesso ffprobe, è possibile utilizzare mediainfo.

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

1
Elimina la necessità jqe tr:mediainfo --Output="General;%Duration/String%" input
llogan del

! Neat Lascerò la mia risposta inedita per ora perché l'output del tuo comando è nella forma X s YYY mscontro X.YYY. Abbastanza facile da regolare | sed -e 's/ s /./' -e 's/ ms//'se si desidera percorrere quel percorso e non si ha accesso jq.
Sostituito il

Che può essere modificato con mediainfo --Output="General;%Duration/String3%" inputoutput 00:01:48.501anziché 1 min 48 s.
Llogan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.