C# 从MemoryStream打开音频(wav)文件以确定持续时间

C# 从MemoryStream打开音频(wav)文件以确定持续时间,c#,audio,stream,wav,memorystream,C#,Audio,Stream,Wav,Memorystream,是否有一种方法可以在框架内或通过使用p/Invoke来确定内存流中保存的wav文件的持续时间 我已经看了一眼和另一眼,但一切似乎都与路径有关,而不是提供任何在流中通过的方式。我提到的问题中的一个链接(..)非常清楚地表明,我可以解析MemoryStream来确定wav文件的持续时间。理想情况下,我不想再发明轮子。试试下面的计算 streamSize==headerSizeIfAny+播放时间*采样*单采样大小-> 播放时间=(streamSize[以字节为单位]-headerSizeIfAny)

是否有一种方法可以在框架内或通过使用p/Invoke来确定内存流中保存的wav文件的持续时间


我已经看了一眼和另一眼,但一切似乎都与路径有关,而不是提供任何在流中通过的方式。我提到的问题中的一个链接(..)非常清楚地表明,我可以解析
MemoryStream
来确定wav文件的持续时间。理想情况下,我不想再发明轮子。

试试下面的计算

streamSize==headerSizeIfAny+播放时间*采样*单采样大小->

播放时间=(streamSize[以字节为单位]-headerSizeIfAny)/(采样[每秒采样数]*singleSampleSize[字节数])

检查以下内容:

还有这个

typedef struct {
  WORD wFormatTag; 
  WORD nChannels; 
  DWORD nSamplesPerSec; 
  DWORD nAvgBytesPerSec; 
  WORD nBlockAlign; 
  WORD wBitsPerSample; 
  WORD cbSize;} WAVEFORMATEX; 
所以你有你的记忆流。。。搜索到0x10(跳过Riff头)+0x08(格式头)=24

你在上面的结构中

使用
stream.ReadInt16()
stream.ReadInt32()
读取所需的结构成员

然后,搜索54,读取一个DWORD,那么许多字节就是示例数据

然后根据这些变量计算出你的持续时间

注意:这只适用于存储在memorystream中的最简单的PCM波形文件。对于其他人,你必须尊重标题并正确解析它们,找到数据块并根据其大小计算持续时间。

我同意Alex的观点。 我花时间编写了一个小程序,其中包含三行代码,用于打印wav文件的持续时间

        var stream=new MemoryStream(File.ReadAllBytes("test.wav"));
        var wave = new WaveFileReader(stream);
        Console.WriteLine(wave.TotalTime); // wave.TotalTime -> TimeSpan
下载库:您将在包中找到NAudio.dll

只需在项目中引用NAudio.dll

在撰写本文时,它是1.3版

正如作者在他的博客上所说,WaveileReader也接受流;不仅仅是一个文件路径

请记住,1.3版是为x86构建的。如果希望它在x64上工作,则需要将项目强制为x86。 如果您想为x64(像我一样)使用NAudio.dll,则需要使用“任意cpu”重新编译。
对我来说,这两种解决方案都很有魅力。

除非我对文件进行解析,否则计算对我来说毫无用处。不过,正如我已经相当清楚地表明的那样,我宁愿
不要重新发明轮子。
。事实上,就我而言,编写代码来解析wav文件不是一件容易的事。@Rob:这个计算应该可以在没有任何解析的情况下进行,文件的比特率必须可以在不读取wav本身的情况下进行访问,我很确定windows资源管理器可以告诉我比特率。我认为您可能能够通过p/invoke文件属性来挖掘这一点,甚至可能没有p/invoke。。。500k文件,没有头,有100k比特率,这是每秒5秒的速率。@Jimmy,对不起,真的不是我想要的。我不想做任何简单的计算。我在寻找一些我可以给它一个记忆流的东西,它会告诉我里面wav的持续时间。计算音频文件的持续时间与我的代码无关,因此我不打算开始=)目前,Explorer(无论如何,Win7)告诉我持续时间和比特率,使比特率对我来说更加无用;-)