How to retrieve duration of MP3 in .NET?

I have build a WPF application where users can drag and drop MP3 files onto a listbox. I need a way to calculate the total duration of the playlist.

Any libraries I should use? Or is it possible using only the .NET framework?


After lots of theorizing, I found a way to correctly and indisputably calculate a duration of an mp3 file.

Let me first re-iterate why standard methods above won't work:

ID3 method: not all files have id3 tags, and if they have it, they might not have duration field set in it.

Estimating by reading one frame * file size: not gonna work for VBR files.

Xing header: not all files have it.

Decoding and determining it via PCM size: I have 3+ GB file, I'm not going to wait until it decodes.

I read everywhere and all things lead to NAudio. Mark, THANKS for the good effort and clean source! However, a method that is mostly suggested with NAudio is to read a file using Mp3FileReader and get all frames. Problem: Mp3FileReader creates a TOC at the start and that takes forever, even for small files of only ONE day :)

Mark suggested that I remove TOC creation, since source is available, and while doing it, I found much simpler method. Here it is; is speaks for itself:

    double GetMediaDuration(string MediaFilename)
    {
        double duration = 0.0;
        using (FileStream fs = File.OpenRead(MediaFilename))
        {
            Mp3Frame frame = Mp3Frame.LoadFromStream(fs);
            if (frame != null)
            {
                _sampleFrequency = (uint)frame.SampleRate;
            }
            while (frame != null)
            {
                if (frame.ChannelMode == ChannelMode.Mono)
                {
                    duration += (double)frame.SampleCount * 2.0 / (double)frame.SampleRate;
                }
                else
                {
                    duration += (double)frame.SampleCount * 4.0 / (double)frame.SampleRate;
                }
                frame = Mp3Frame.LoadFromStream(fs);
            }
        }
        return duration;
    }

I wrapped mp3 decoder library and made it available for .net developers. You can find it here:

http://sourceforge.net/projects/mpg123net/

Included are the samples to convert mp3 file to PCM, and read ID3 tags.

I guess that it can be used to properly calculate mp3 file duration.


I ended up writing my own for this purpose a few years back. You can write an effective one client-side using flash. The key points that I remember are:

  1. that you can't rely on the MP3 header to be accurate, so don't just read that to get the duration
  2. in flash, seek to the end of the MP3, and then read the current position. That will give you the duration.

Edit: I realize you wanted to do this with .Net, but it may actually be more useful to know client side before you upload the file to the server, as if you wish to impose limits on file length, you can do that much earlier in the process.


[my own solution]

I've added a second mediaelement control which I use to open each mp3 file in the listbox and get it's NaturalDuration. Open and close each file in the list and make a sum of all the values.

As stated by others, the mp3 headers aren't accurate. The mediaelement provides the correct duration.

It's probably not the fastest method but in my case the simplest (it does not rely on other libraries).