我需要找到一种方法来获取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。
答案 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演示文稿属性计算长度。