可以在不使用Windows Media Player的情况下获取WMA文件的长度?

时间:2013-04-19 15:08:42

标签: .net audio naudio wma

我需要找到一种方法来获取WMA文件的长度,而无需使用任何Windows Media Player(WMP)dll。我找到了使用WMP dll的方法,你可以看到here,但由于另一个问题,我宁愿找到一种方法,我不必使用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。

2 个答案:

答案 0 :(得分: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,你得到的最后一个压缩样本将始终被“填充”到全帧长度,所以如果你想要在压缩之前给出的实际长度,你可以忘记它。

答案 1 :(得分:2)

您可以使用MediaFoundationReader并询问其TotalDuration属性。 MediaFoundationReader是NAudio 1.7的新功能,可在NuGet的预览版中找到。使用MF_PD_DURATION Media Foundation演示文稿属性计算长度。