【发布时间】:2012-12-12 12:57:45
【问题描述】:
我捕获了原始音频数据流及其 WAVEFORMATEXTENSIBLE 结构。 WAVEFORMATEXTENSIBLE如下图所示:
按照 wav 文件的standard,我尝试将原始位写入 wav 文件。 我要做的是:
写“RIFF”。
写一个 DWORD。 (文件大小 - sizeof("RIFF") - sizeof(DWORD))。
=== WaveFormat 块 ===
写“WAVEfmt”
写一个 DWORD。 (WAVEFORMATEXTENSIBLE 结构的大小)
编写 WAVEFORMATEXTENSIBLE 结构。
=== 事实块 ===
写“事实”
写一个 DWORD。 (四)
写一个 DWORD。 (流中的样本数,应为 sizeof(rawdata)*8/wBitsPerSample )。
=== 数据块 ===
写“数据”
写一个 DWORD(原始数据的大小)
写入原始数据。
通过上述步骤得到wav文件后,我用媒体播放器播放了wav文件,没有声音,用大胆播放会给我一个失真的声音,我可以听到这是我想要的正确音频,但是声音因噪音而失真。
原始数据可以在here找到
我生成的wav文件是here
这让我很困惑,因为当我使用相同的方法将 IEEE-float 数据转换为 wav 文件时,它工作得很好。
【问题讨论】:
-
您确定您的原始数据是 32 位的吗?
-
应该是,因为WAVEFORMATEX结构说是,而WAVEFORMATEX是从IAudioClient获取的。
-
但它是 32 位整数还是 32 位浮点数?这可能是问题的原因。您需要检查您的子类型 GUID 是否正确(PCM 或 FLOAT)
-
我不太明白,这些数据是通过hook到IAudioRenderClient中获取的,并拦截getBuffer和releaseBuffer方法。我从对应的 IAudioClient 获得了 WAVEFORMATEX 结构,我想我应该假设 WAVEFORMATEX 是正确的并按原样使用。
-
我不确定为什么 IAudioClient 上的 initialize 方法需要一个waveformatex 参数,GetMixFormat 方法不是很容易获得它吗?示例代码总是从IAudioClient的GetMixFormat中获取waveformatex,然后传回IAudioClient的initialize方法。
标签: windows audio wav wasapi riff