我已经构建了一个 WPF 应用程序,用户可以在其中将 MP3 文件拖放到列表框上。我需要一种方法来计算播放列表的总持续时间。
我应该使用任何库?或者是否可以仅使用 .NET 框架?
最佳答案
经过大量理论分析,我找到了一种正确且无可争议地计算 mp3 文件持续时间的方法。
让我首先重申为什么上面的标准方法不起作用:
ID3 方法:并非所有文件都有 id3 标签,如果有,则可能没有设置持续时间字段。
通过读取一帧 * 文件大小进行估计:不适用于 VBR 文件。
Xing header:不是所有的文件都有。
通过 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;
}
关于.net - 如何在 .NET 中检索 MP3 的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/383164/