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

标签 .net audio mp3

我已经构建了一个 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/

相关文章:

c# - 为什么 Microsoft 建议跳过为引用类型实现相等运算符?

c# - 自动生成 .NET 和 Java 的单元测试用例

java - 在 MP3 ID3v2 标签中设置歌词

shell - 将所有第二层 mp3 递归转换为第三层并更新 ID3

jquery - Html.BeginForm 使用 onSubmit 进行验证

c# - 锁定指定对象和锁定次要对象有什么区别?

actionscript-3 - ActionScript:来自ByteArray的声音存在滞后

android - 音频无法在Monaca上播放

html - html音频标签未自动播放音频

python - 从cherrypy 提供mp3 文件