当前位置:  开发笔记 > 后端 > 正文

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

如何解决《如何在.NET中检索MP3的持续时间?》经验,为你挑选了1个好方法。

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

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



1> Daniel Mošmo..:

经过大量的理论化,我找到了一种正确无误地计算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;
    }


我认为@JaredPhelps是正确的,将SampleCount乘以2或4是没有必要的.至少对于我测试的文件,当我删除它时,持续时间是正确的.
在我的情况下,这计算的持续时间是我正在使用的所有文件的实际持续时间的四倍(它们都是立体声文件,顺便说一句).自从这个答案以来,NAudio中的某些内容可能已经发生了变化,但我不确定*4.0是否必要,至少在我测试的文件中是这样.不过,我很欣赏答案,它让我99%的方式.
嗨@DanielMošmondor我可能知道"_sampleFrequency"的类型给我一个错误.
推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有