1

我需要找到一种方法来获取 WMA 文件的长度,而不使用任何 Windows Media Player(WMP) dll。我找到了使用 WMP dll 的方法,您可以在此处看到,但由于另一个问题,我宁愿找到一种不必使用 WMP 的方法。

一种使用NAudio并适用于 MP3 的有前途的方法如下所示:

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

有谁知道将其移植到 WMA 文件的方法?

我查看了 WindowsMediaFormat 项目的源代码,但我找不到 WMAFrame 类或任何显然可以让我换掉一个类以使其适用于 WMA 的东西。

4

2 回答 2

2

您不需要 NAudio,但 Windows Media.NET ( http://windowsmedianet.sourceforge.net/ )

您将打开 MediaReader,并检索所谓的“样本”,即压缩音频包。他们每个人都应该有它的持续时间。遍历整个文件,总计每个包的持续时间,这就是你的解决方案。

如果我有时间,我会得到一些代码。

更多信息:

读者: http: //msdn.microsoft.com/en-us/library/dd757425 (v=vs.85).aspx

未压缩样本的回调:http: //msdn.microsoft.com/en-us/library/dd743503 (v=vs.85).aspx

我希望你能把它们放在一起!

但是有一个问题,那就是让我的朋友发疯的问题——不管在 WMA 文件中压缩了多少实际 PCM,你得到的最后一个压缩样本总是会被“填充”到全帧长度,所以如果你想要实际长度在压缩之前给出,你可以忘记它。

于 2013-04-19T15:39:15.390 回答
2

您可以使用MediaFoundationReader并索取它的TotalDuration财产。MediaFoundationReader是 NAudio 1.7 的新功能,可在 NuGet 的预览版中使用。长度是使用 MF_PD_DURATION Media Foundation 表示属性计算的。

于 2013-04-20T07:45:12.430 回答