2012-05-03 22 views
18

Solía ​​calcular la duración de los archivos MP3 en el servidor utilizando ffmpeg, lo que parecía funcionar bien. Hoy descubrí que algunos de los cálculos eran incorrectos. De alguna manera, por alguna razón, ffmpeg calculará mal la duración y parece suceder solo con archivos mp3 de tasa de bits variable.Cómo obtener la duración real y real de un archivo MP3 (VBR o CBR) del lado del servidor

Al probar esto localmente, noté que ffmpeg imprimía dos líneas adicionales en verde.

Comando utilizado:

ffmpeg -i song_9747c077aef8.mp3 

ffmpeg dice:

[mp3 @ 0x102052600] max_analyze_duration 5000000 reached at 5015510 
[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate 

Después de una buena sesión, Google cálido, he descubierto algunos puestos en este, pero no se encontró una solución.

Luego trató de aumentar la duración máxima:

ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3 

Después de esto, ffmpeg regresó sólo la segunda línea:

[mp3 @ 0x102052600] Estimating duration from bitrate, this may be inaccurate 

Pero en cualquier caso, la duración calculada era simplemente errónea. Al compararlo con VLC noté que la duración es correcta.

Después de más investigación tropecé con la información mp3 que instalé y usé.

mp3info -p "%S" song_9747c077aef8.mp3 

MP3Info luego regresó a la duración CORRECTO, pero sólo como un entero, que no puedo utilizar como necesito un número más exacto aquí. La razón de esto fue explicada en un comentario más abajo, por usuario blahdiblah - mp3info simplemente está extrayendo la información ID3 del archivo y no está realizando ningún cálculo.

También intenté usar mplayer para recuperar la duración, pero al igual que ffmpeg, mplayer está devolviendo el valor incorrecto.

+0

http://www.id3.org/ –

+0

Gracias, pero no puedo suponer la información de duración adecuada en los encabezados MP3s/etiquetas ID3, incluso si quisiera. Tengo que calcularlo para obtener un resultado 100% preciso. – SquareCat

+0

Ahh, entonces creo que tendrías que ir a través del mp3, y encontrar cada fotograma, luego calcular una duración de eso. –

Respuesta

17

Finalmente encontré una solución adecuada a este problema utilizando Sox, que devuelve la información correcta.

sox file.mp3 -n stat 
Samples read:   19321344 
Length (seconds): 219.062857 
Scaled by:   2147483647.0 
Maximum amplitude:  1.000000 
Minimum amplitude: -1.000000 
Midline amplitude: -0.000000 
Mean norm:   0.141787 
Mean amplitude:  0.000060 
RMS  amplitude:  0.191376 
Maximum delta:   0.947598 
Minimum delta:   0.000000 
Mean delta:   0.086211 
RMS  delta:   0.115971 
Rough frequency:   4253 
Volume adjustment:  1.000 

Duración (segundos): 219,062857

+0

Si necesita una solución más rápida (Medias parece que va a leer todas las muestras del archivo) echa un vistazo a la solución usando NAudio - mono funciona en Linux sin problema que debe ser factible ... –

+0

Se da salida a 'Medias FALLO formatos: ningún controlador para file extension mp3' por defecto. ¿Cómo debería instalarlo? –

+0

http://superuser.com/questions/421153/how-to-add-a-mp3-handler-to-sox/421168 – SquareCat

5

Puede decodificar el archivo completo para obtener la duración real:

ffmpeg -i input.mp3 -f null - 

La segunda a la última línea de la salida de la consola se mostrará algo como:

size=N/A time=00:03:49.12 bitrate=N/A 

Donde time es la duración real. En este ejemplo, todo el proceso tomó aproximadamente 0,5 segundos.

Cuestiones relacionadas