我已经构建了一个WPF应用程序,用户可以将MP3文件拖放到列表框中。我需要一种方法来计算播放列表的总持续时间。
我应该使用哪些库?或者只使用.NET框架吗?
答案 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)
编辑:我意识到你想用.Net这样做,但在将文件上传到服务器之前了解客户端实际上可能更有用,就好像你希望对文件长度施加限制一样,你可以做那个早期的过程。
答案 3 :(得分:1)
[我自己的解决方案]
我添加了第二个mediaelement控件,用于打开列表框中的每个mp3文件并获取它的NaturalDuration。打开并关闭列表中的每个文件,并将所有值的总和。
正如其他人所说,mp3标题不准确。媒体元素提供正确的持续时间。
这可能不是最快的方法,但在我的情况下最简单(它不依赖于其他库)。