2012-05-03 15 views
18

Ho usato per calcolare la durata dei file MP3 lato server utilizzando ffmpeg - che sembrava funzionare correttamente. Oggi ho scoperto che alcuni dei calcoli erano sbagliati. In qualche modo, per qualche motivo, ffmpeg calcolerà male la durata e sembra che accada solo con file MP3 a bit rate variabile.Come ottenere la durata reale, reale di un file MP3 (VBR o CBR) lato server

Durante il test localmente, ho notato che ffmpeg ha stampato due righe in più in verde.

comando utilizzato:

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 

Dopo una bella, sessione di google caldo, ho scoperto alcuni messaggi su questo, ma è stata trovata alcuna soluzione.

Ho poi cercato di aumentare la durata massima:

ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3 

Dopo questo, ffmpeg restituito solo la seconda linea:

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

Ma in entrambi i casi, la durata calcolata era semplicemente sbagliato. Confrontandolo con VLC ho notato che la durata è corretta.

Dopo ulteriori ricerche mi sono imbattuto in mp3info - che ho installato e utilizzato.

mp3info -p "%S" song_9747c077aef8.mp3 

mp3info quindi restituito la durata CORRETTO, ma solo come un intero, che non posso usare come ho bisogno di un numero più precisa qui. La ragione di ciò è stata spiegata in un commento qui sotto, dall'utente blahdiblah - mp3info sta semplicemente estraendo informazioni ID3 dal file e non sta effettivamente effettuando alcun calcolo.

Ho anche provato a utilizzare mplayer per recuperare la durata, ma proprio come ffmpeg, mplayer restituisce il valore sbagliato.

+0

http://www.id3.org/ –

+0

Grazie, ma non posso assumere le informazioni sulla durata corretta nelle intestazioni MP3/tag ID3, anche se volessi. Devo calcolarlo per ottenere un risultato accurato al 100%. – SquareCat

+0

Ahh, allora penso che dovresti passare attraverso l'mp3 e trovare ogni frame, quindi calcolare una durata da quello. –

risposta

17

Ho finalmente trovato una soluzione adeguata a questo problema usando sox - che restituisce le informazioni corrette.

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 

Durata (secondi): 219,062857

+0

Se hai bisogno di una soluzione più veloce (sembra che sox legga tutti i campioni dal file) controlla la soluzione usando NAudio - mono lavora su linux senza problemi dovrebbe essere fattibile ... –

+0

Emette i formati 'sox FAIL: nessun gestore per estensione file mp3' di default. Come dovrei installarlo? –

+0

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

5

È possibile decodificare completamente il file per ottenere l'effettiva durata:

ffmpeg -i input.mp3 -f null - 

Il secondo per l'ultima riga l'output della console mostrerà qualcosa come:

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

Dove time è la durata effettiva. In questo esempio l'intero processo ha richiesto circa 0,5 secondi.

Problemi correlati