Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get the real, actual duration of an MP3 file (VBR or CBR) server-side

I used to calculate the duration of MP3 files server-side using ffmpeg - which seemed to work fine. Today i discovered that some of the calculations were wrong. Somehow, for some reason, ffmpeg will miscalculate the duration and it seems to happen with variable bit rate mp3 files only.

When testing this locally, i noticed that ffmpeg printed two extra lines in green.

Command used:

ffmpeg -i song_9747c077aef8.mp3 

ffmpeg says:

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

After a nice, warm google session, i discovered some posts on this, but no solution was found.

I then tried to increase the maximum duration:

ffmpeg -analyzeduration 999999999 -i song_9747c077aef8.mp3 

After this, ffmpeg returned only the second line:

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

But in either case, the calculated duration was just plain wrong. Comparing it to VLC i noticed that there the duration is correct.

After more research i stumbled over mp3info - which i installed and used.

mp3info -p "%S" song_9747c077aef8.mp3 

mp3info then returned the CORRECT duration, but only as an integer, which i cannot use as i need a more accurate number here. The reason for this was explained in a comment below, by user blahdiblah - mp3info is simply pulling ID3 info from the file and not actually performing any calculations.

I also tried using mplayer to retrieve the duration, but just as ffmpeg, mplayer is returning the wrong value.

like image 994
SquareCat Avatar asked May 03 '12 19:05

SquareCat


People also ask

Is it possible to do CBR in C++ for MP3?

There was another post on here to do CBR in C++, but the code makes a ton of assumptions and wont work for VBR of course. Show activity on this post. Most MP3 files have an ID3 header. It is not hard to decode that and get the duration.

How to get the actual duration of a MP3 file?

You can decode the file completely to get the actual duration: ffmpeg -i input.mp3 -f null - The second to the last line of the console output will show something like: size=N/A time=00:03:49.12 bitrate=N/A

Why does mp3info return the wrong duration?

mp3info then returned the CORRECT duration, but only as an integer, which i cannot use as i need a more accurate number here. The reason for this was explained in a comment below, by user blahdiblah - mp3info is simply pulling ID3 info from the file and not actually performing any calculations.

Does FFmpeg calculate the duration of MP3 files server-side?

Show activity on this post. I used to calculate the duration of MP3 files server-side using ffmpeg - which seemed to work fine. Today i discovered that some of the calculations were wrong. Somehow, for some reason, ffmpeg will miscalculate the duration and it seems to happen with variable bit rate mp3 files only.


2 Answers

I finally found a proper solution to this problem using sox - which returns the correct information.

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 

Length (seconds): 219.062857

like image 138
SquareCat Avatar answered Sep 21 '22 23:09

SquareCat


You can decode the file completely to get the actual duration:

ffmpeg -i input.mp3 -f null - 

The second to the last line of the console output will show something like:

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

Where time is the actual duration. In this example the whole process took about 0.5 seconds.

like image 32
llogan Avatar answered Sep 17 '22 23:09

llogan