1

我捕获了原始音频数据流及其WAVEFORMATEXTENSIBLE结构。 WAVEFORMATEXTENSIBLE如下图所示:

WAVEFORMATEXTENSIBLE 结构

按照 wav 文件的标准,我尝试将原始位写入 wav 文件。我要做的是:

  1. 写“RIFF”。

  2. 写一个 DWORD。(文件大小 - sizeof("RIFF") - sizeof(DWORD))。

=== WaveFormat 块 ===

  1. 写“WAVEfmt”

  2. 写一个 DWORD。(WAVEFORMATEXTENSIBLE 结构的大小)

  3. 编写 WAVEFORMATEXTENSIBLE 结构。

===事实块===

  1. 写“事实”

  2. 写一个 DWORD。( 4 )

  3. 写一个 DWORD。(流中的样本数,应该是 sizeof(rawdata)*8/wBitsPerSample )。

=== 数据块 ===

  1. 写“数据”

  2. 写一个 DWORD(原始数据的大小)

  3. 写入原始数据。

从以上步骤得到wav文件后,我用媒体播放器播放了wav文件,没有声音,用大胆播放会给我一个失真的声音,我可以听到这是我想要的正确音频,但声音是被噪音扭曲。

原始数据可以在这里找到

我生成的wav文件在这里

这让我很困惑,因为当我使用相同的方法将 IEEE-float 数据转换为 wav 文件时,它工作得很好。

4

2 回答 2

0

我想通了,似乎 IAudioRenderClient 中的 getbuffer releasebuffer 循环将原始数据的格式与传递给 IAudioClient 的初始化方法的格式相同。

在我的情况下,IAudioClient 中的 GetMixFormat 与传递给初始化方法的格式不同。我认为 GetMixFormat 获得了设备支持的格式。

IAudioClient 应该已经完成​​了从初始化格式到 mixformat 的格式转换。我拦截了初始化方法,获取了格式,它就像一个魅力。

于 2012-12-13T13:20:49.117 回答
0

我正在拦截 WASAPI 以访问音频数据并面临完全相同的问题,即从数据生成的音频文件听起来像是正确的内容,但在某种程度上非常嘈杂,尽管帧速率、样本宽度、通道数等设置正确.

WAVEFORMATEXTENSIBLE 的 SubFormat 字段显示数据实际上是 KSDATAFORMAT_SUBTYPE_IEEE_FLOAT,而我最初将其视为整数。根据这个页面,KSDATAFORMAT_SUBTYPE_IEEE_FLOAT 相当于 WAVEFORMATEX 中的 WAVE_FORMAT_IEEE_FLOAT。因此,将 wav 文件的 fmt 块中的“音频格式”(通常从第 20 位开始)设置为 WAVE_FORMAT_IEEE_FLOAT(即 3)解决了这个问题。记得把它放在小端。

  • 音频格式的原始值 在此处输入图像描述
  • 修改后 在此处输入图像描述
于 2021-07-22T18:57:11.803 回答