如何在.NET中检索MP3的持续时间?

时间:2008-12-20 10:25:14

标签: .net audio mp3

我已经构建了一个WPF应用程序,用户可以将MP3文件拖放到列表框中。我需要一种方法来计算播放列表的总持续时间。

我应该使用哪些库?或者只使用.NET框架吗?

4 个答案:

答案 0 :(得分:15)

经过大量的理论化,我找到了一种正确无误地计算mp3文件持续时间的方法。

首先让我重新讨论为什么上面的标准方法不起作用:

ID3方法:并非所有文件都有id3标签,如果有,则可能没有设置持续时间字段。

通过读取一帧*文件大小估算:不适用于VBR文件。

Xing标题:并非所有文件都有。

通过PCM大小解码并确定它:我有3 GB以上的文件,我不会等到它解码。

我到处读,所有的东西都通向NAudio。马克,感谢您的努力和清洁!但是,NAudio主要建议的方法是使用Mp3FileReader读取文件并获取所有帧。问题:Mp3FileReader在开始时创建了一个TOC,即使对于只有一天的小文件也是如此:)

Mark建议我删除TOC创建,因为源代码可用,并且在执行此操作时,我发现了更简单的方法。这里是;是说不出话来:

    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;
    }

答案 1 :(得分:2)

我包装了mp3解码器库并使其可供.net开发人员使用。你可以在这里找到它:

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

包括将mp3文件转换为PCM并读取ID3标签的示例。

我猜它可以用来正确计算mp3文件的持续时间。

答案 2 :(得分:1)

几年前,我最终为此目的编写了自己的作品。您可以使用flash编写有效的一个客户端。我记得的关键点是:

  1. 你不能依赖MP3标题准确,所以不要只是阅读它以获得持续时间
  2. 在flash中,寻找到MP3的结尾,然后读取当前位置。这会给你持续时间。
  3. 编辑:我意识到你想用.Net这样做,但在将文件上传到服务器之前了解客户端实际上可能更有用,就好像你希望对文件长度施加限制一样,你可以做那个早期的过程。

答案 3 :(得分:1)

[我自己的解决方案]

我添加了第二个mediaelement控件,用于打开列表框中的每个mp3文件并获取它的NaturalDuration。打开并关闭列表中的每个文件,并将所有值的总和。

正如其他人所说,mp3标题不准确。媒体元素提供正确的持续时间。

这可能不是最快的方法,但在我的情况下最简单(它不依赖于其他库)。