¿Cómo verificar cuánto tiempo un video (mp4) usa el shell?

16

Necesito cargar ftp todos los archivos mp4 en un directorio con duración> 4 minutos usando el shell. No puedo encontrar ningún script para verificar cuánto dura un video. ¿Alguien tiene alguna idea de cómo hacer eso?

¡Muchas gracias!

Thomas
fuente
1
vea este stackoverflow.com/questions/3844430/… :-) espero que esto ayude
harish.venkat

Respuestas:

23

Esto te dará la duración de un video.

ffmpeg -i myvideo 2>&1 | grep Duration | cut -d ' ' -f 4 | sed s/,//
por
fuente
También funciona para urls de video remotas, por ejemplo, ffmpeg -i " instagram.fewr1-1.fna.fbcdn.net/t50.2886-16/… " 2> & 1 | grep Duración | corte -d '' -f 4 | sed s /, //
skidadon
¿Se garantiza el formato de mensajes de registro de FFmpeg? Si no, no me gusta tanto, podría dejar de funcionar con cualquier versión.
Ondra Žižka
7

Mediainfo es una herramienta rápida para este propósito:

$ mediainfo --Inform="Video;%Duration%"  [inputfile]

Puede encontrar más opciones en una respuesta más completa .

En mis pruebas, ffprobetoma 0.3 segundos y mediainfotoma 0.09 segundos.

qubodup
fuente
Esto da resultados extraños ... como 2679600 ... mejor usar mediainfo --Inform="Video;%Duration/String%" [inputfile]... lo que te daría algo ike 43 min 50s
Robert Riedl
5

Puede intentar usar el comando avconv .

Primero debes instalar:

Instalar a través del centro de software

si escribe el comando con la bandera -i, obtendrá información sobre el video:

avconv -i test.mp4

En la salida hay un campo llamado Duración

avconv version 0.8.4-4:0.8.4-0ubuntu0.12.04.1, Copyright (c) 2000-2012 the Libav developers
  built on Nov  6 2012 16:51:33 with gcc 4.6.3
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'test.mp4':

  Duration: 00:58:28.05, start: 0.000000, bitrate: 888 kb/s
    Stream #0.0(eng): Video: h264 (High), yuv420p, 720x404, 748 kb/s, 25 fps, 25 tbr, 20k tbn, 50 tbc
    Stream #0.1(und): Audio: aac, 48000 Hz, stereo, s16, 127 kb/s

Ahora puede usar el comando para obtener solo el valor del campo Duración

Tipo:

avconv -i file.mp4 2>&1 | grep 'Duration' | awk '{print $2}' | sed s/,//

En mi caso el resultado es:

00:58:28.05

58 minutos y 28.05 segundos.

Espero que esto sea útil!

Raguet romano
fuente
1
Esto también se puede usar con avprobe: no es necesario -i, pero de lo contrario funciona exactamente de la misma manera. O ffprobepara la respuesta de @ per.
evilsoup
4

exiftool(originalmente destinado a leer metadatos de cámara de archivos de imagen, pero luego se expandió para leer y escribir metadatos de casi cualquier tipo de archivo multimedia) es muy conveniente de usar para esto. Ejecútalo con:

exiftool FILE.mp4 | grep Duration

Probablemente necesite instalar exiftoolprimero, pero esto se hace fácilmente con el siguiente comando (en Debian y derivados como Ubuntu, etc.):

apt install libimage-exiftool-perl

Por supuesto, esta respuesta es solo otra alternativa. Muchas de las otras respuestas también son buenas. :)

zrajm
fuente
2

Aún más simple:

avprobe file.mp4 -show_format_entry duration
Joan Albert Silvestre
fuente
Actualmente recibo el mensaje "La opción 'show_format_entry' está en desuso, use '-show_entries format = Duration' en su lugar"
Faheem Mitha
1

Agregando a la solución pers , esto se puede usar en un directorio completo:

for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done

incluso puede ampliarse | sortpara ordenar los archivos por su longitud.

puede agregar esto .bashrco .bash_aliasespara poder hacerlo lsvlength | sorten un directorio

alias lsvlength='for f in *; do ffmpeg -i "$f" 2>&1 | grep Duration | cut -d " " -f 4 | sed s/,//  | tr -d "\n" && echo " $f"; done'
mcnesio
fuente
1

ffprobees una solución más elegante que la ffmpegque arroja un error si no se le da la ruta de salida.

ffprobe video.mp4 2>&1 | grep -E '^ +Duration' | cut -d':' -f2- | cut -d, -f1
Ondra Žižka
fuente
0

Si desea ver la duración de algunos videos en un directorio, puede usar el siguiente comando

exiftool * | grep ^ Duración | corte -d '' -f 26

meisamhakimi
fuente
1
No es necesario usar grepy tal. Simplemente exiftool -T -Duration *.mkv(o cualquier patrón de archivo)
PerlDuck
0

Como puede ver, hay numerosas formas de lograr esto. ffprobe mediafile -show_entries format=format=duration 2>&1 | grep DURATIONdonde mediafile es el nombre del archivo, proporcionará una salida similar a la siguiente. El primero es la duración de la primera transmisión (típicamente video) y el segundo proporciona la duración de la segunda transmisión (generalmente audio)

  DURATION        : 00:21:40.132000000
  DURATION        : 00:21:40.062000000
Elder Geek
fuente