Obtenga longitud MP3 en Linux / FreeBSD

27

Tengo un montón de archivos mp3 con varias longitudes. Quiero reducirlo a 50% -60% de longitud. Dice, de 1 minuto a 30 segundos. Debería ser trivial usando ffmpeg. Pero no sé cómo determinar su longitud original como base para procesar usando ffmpeg.

¿Alguien tiene una idea?

ariefbayu
fuente

Respuestas:

31

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
Un enano
fuente
Sí, no hay forma de obtener información de longitud en ffmpeg. Ya dije allí, uso ffmpeg solo después de obtener la longitud. De todos modos, gracias por los jefes UP.
ariefbayu
44
Vale la pena señalar que esto solo proporciona la longitud como un entero. Por lo tanto, puede no ser lo suficientemente preciso para algunos casos de uso.
Ross
¡La mejor respuesta ya que funciona incluso con MP3 de velocidad de bits promedio o variable!
KrisWebDev
1
Agregar \npara imprimir nueva línea también. > mp3info -p "%S\n" sample.mp3 // tiempo total en segundos
nexayq
22

ffmpegimprimirá todo lo que sabe sobre el archivo si no le da otros argumentos. Use greppara 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
quijote curandero
fuente
3
$ ffmpeg -i foo.mp3 2> y 1 | awk '/ Duration / {print substr ($ 2,0, length ($ 2) -1)}' Solo por la parte de tiempo
Craig Tataryn
Para sumar la longitud de un conjunto de archivos MP3, puede usar algo como 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 $TOTLENGTHimprimir 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.)
un CVn
Tenga cuidado con la bandera de análisis de ffmpeg. Básicamente, los números que informa son estimaciones después de un cierto punto para ahorrar CPU.
mlissner
Usando un MP3 de velocidad de bits promedio, ffmpeg informa una duración incorrecta junto con esta advertencia Estimating duration from bitrate, this may be inaccurate. Creo que esta respuesta solo es válida con MP3 de velocidad de bits constante .
KrisWebDev
9

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.)
nik
fuente
3

Solo otra forma de obtener la duración solo usando ffmpegy grep:

# ffmpeg -i rara.mp3 2>&1 |grep -oP "[0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{2}"
00:03:49.12
FC
fuente
2

Las soluciones que usan ffmpegme 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.

ffmpegviene con una herramienta ffprobepara 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'
Att Righ
fuente
2
Solo puedes hacerffprobe -show_entries stream=duration -of compact=p=0:nk=1 -v fatal song.mp3
Gyan
1

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
goldPseudo
fuente
1

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/,//
Monica Sol
fuente
0

Tuve el mismo problema y encontré que el comando mplayer (goldPseudo) funcionó bien, pero luego descubrí que si abres un álbum en RhythmBox verás que su línea de estado proporciona la cantidad de pistas, el tiempo total de reproducción y el tamaño del disco.

AFH
fuente
-1

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! ;)

Jeongpyo Lee
fuente