Respuestas:
Con ffmpeg no sé cómo obtener la longitud como una variable que puedes usar en un script. Pero mp3info sí.
mp3info -p "%S" sample.mp3 // total time in seconds
\n
para imprimir nueva línea también. > mp3info -p "%S\n" sample.mp3
// tiempo total en segundos
ffmpeg
imprimirá todo lo que sabe sobre el archivo si no le da otros argumentos. Use grep
para quitar todo menos la "Duración":
$ ffmpeg -i foo.mp3 2>&1 | grep Duration
Duration: 01:02:20.20, start: 0.000000, bitrate: 128 kb/s
También podrías usar mplayer
. Grep para la línea "ID_LENGTH =":
$ mplayer -ao null -identify -frames 0 foo.mp3 2>&1 | grep ID_LENGTH
ID_LENGTH=3740.00
TOTLENGTH=0; for f in *.mp3; do LENGTH=$(mplayer -ao null -identify -frames 0 "$f" 2>&1 | awk -F= '/ID_LENGTH/ {print $2}' | awk -F. '{print $1}'); TOTLENGTH=$(($TOTLENGTH + $LENGTH)); done; echo $TOTLENGTH
imprimir la longitud total del audio en todos los archivos, en segundos. Probablemente se pueda hacer de manera más eficiente, pero desde que lo escribí como algo único, fue lo suficientemente bueno para mis necesidades. (La segunda invocación de awk elimina los decimales, por lo que el resultado no es 100% exacto, pero de nuevo, lo suficientemente bueno para mis necesidades.)
Estimating duration from bitrate, this may be inaccurate
. Creo que esta respuesta solo es válida con MP3 de velocidad de bits constante .
Curiosamente, la aplicación EXIFTool ofrece la duración de MP3 como la última línea.
$ exiftool somefile.mp3 Número de versión de ExifTool: 7.98 Nombre de archivo: somefile.mp3 Directorio:. Tamaño de archivo: 49 MB Fecha / hora de modificación del archivo: 2009: 09: 10 11: 04: 54 + 05: 30 Tipo de archivo: MP3 Tipo MIME: audio / mpeg Versión de audio MPEG: 2.5 Capa de audio: 3 Velocidad de bits de audio: 64000 Tasa de muestra: 8000 Modo de canal: canal único MS Stereo: apagado Intensidad estéreo: apagado Indicador de copyright: falso Medios originales: verdadero Énfasis: ninguno Tamaño ID3: 26 Género: Blues Duración: 1:47:46 (aprox.)
Las soluciones que usan ffmpeg
me parecen un poco frágiles, ya que analizan resultados que no están diseñados como una interfaz. Dicho esto, probablemente continuarán trabajando durante varios años independientemente.
ffmpeg
viene con una herramienta ffprobe
para obtener información sobre archivos de audio (muchos formatos, incluido mp3) y puede producir una salida legible por máquina. El siguiente comando obtiene la duración de la canción.
ffprobe -show_streams -print_format json song.mp3 -v fatal | jq '.streams[0].duration'
ffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Personalmente uso Mplayer para extraer la información, principalmente porque ya la tengo instalada y no me molesto en instalar un nuevo software innecesariamente. La ventaja de esto es que no está limitado a archivos mp3 en particular, y debería funcionar con cualquier archivo multimedia que Mplayer pueda manejar. El siguiente one-liner devolverá la longitud de la pista en segundos.
mplayer -identify -ao null -vo null -frames 0 Filename.mp3 | grep ^ID_LENGTH= | cut -d = -f 2
Puede usar ffmpeg para obtener la duración del archivo. Solo usa:
ffmpeg -i <infile> 2>&1 | grep "Duration" | cut -d ' ' -f 4 | sed s/,//
Aquí está mi simple uso de la referencia anterior.
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'
10:47:15
Envío ese valor a la variable mp3_full_length
mp3_full_path="$HOME/i/want/the/length/of/file.mp3"
read -r mp3_full_length <<< `ffmpeg -i "$mp3_full_path" 2>&1 | grep Duration | awk -F ' ' '{print $2}' | awk -F '[,|.]' '{print $1}'`
# I can use this variable for my own purpose!
echo $mp3_full_length
10:47:15
Gracias por encima de la gente! Uso tus ideas y conocimientos Gracias por leer, ¡Que tengas un buen día! ;)