¿Cómo puedo obtener la longitud de un archivo de video desde la consola?

24

Supongamos que tenemos un archivo de video some_video.

¿Cómo puedo obtener su longitud de un script de shell (con mplayer / transcode / gstreamer / vlc / ffmpeg / whatever)?

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

Respuestas:

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

devolverá la duración del video en segundos.

John Lemberger
fuente
No sabía sobre ffprobe , gracias!
ckujau
21

Algo similar a:

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

Esta entregará: HH:MM:SS.ms. También puede usar ffprobe, que se suministra con la mayoría de las instalaciones de FFmpeg:

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

... o:

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

Para convertir en segundos (y retener los milisegundos), canalice en:

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

Para convertirlo en milisegundos, canalice en:

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

Si desea solo los segundos sin los milisegundos, canalice en:

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

Ejemplo:

ingrese la descripción de la imagen aquí

slhck
fuente
También tcprobe está diseñado para ello, pero no funciona bien en mi sistema.
Vi.
1
... mi edición fue rechazada, por lo que publicaré aquí que el primer paso se puede lograr de manera más concisa ffprobe, una herramienta diseñada para exactamente este tipo de propósitos que se incluye con ffmpeg: ffprobe -show_format input | sed -n '/duration/s/.*=//p'(o ffprobe -show_format input | grep duration | sed 's/.*=//'). Tal vez @slhck pueda editar esto directamente en la respuesta.
evilsoup
Lo siento, @evilsoup. Tal vez debería hacer un descargo de responsabilidad de que usted y LordNeckbeard pueden editar libremente mis publicaciones. Ya he tenido este problema varias veces. La próxima vez solo agregue una pequeña nota al mensaje de edición más o menos :)
slhck
0

En caso de que no tenga acceso ffprobe, puede usar mediainfo.

# Outputs a decimal number in seconds
mediainfo some_video --Output=JSON | jq '.media.track[0].Duration' | tr -d '"'`
Ser remplazado
fuente
1
Elimine la necesidad jqy tr:mediainfo --Output="General;%Duration/String%" input
llogan
¡Ordenado! Voy a dejar mi respuesta sin editar por ahora porque la salida de su comando es de la forma X s YYY msversus X.YYY. Es lo suficientemente fácil de ajustar | sed -e 's/ s /./' -e 's/ ms//'si desea seguir esa ruta y no tiene acceso jq.
ToBeSustituido el
Eso se puede cambiar con mediainfo --Output="General;%Duration/String3%" inputsalida en 00:01:48.501lugar de 1 min 48 s.
lema