2015-01-09 109 views
0

我挂在IAudioClient和IAudioRenderClient中以检索原始音频缓冲区。为了确定我之前在客户端上调用GetMixFormat的格式。这适用于大多数应用程序,如Firefox中的游戏或Flash Player。IAudioRenderClient :: ReleaseBuffer挂钩有时会扭曲音频(尝试查找原始音频的类型)

但是,从Google Chrome(Flash)捕获的音频失真。我附上了从Firefox和Google Chrome中捕获的相同音频流的简短示例。 GetMixFormat()报告IEEE_FLOAT,两个48k的通道。但是,在Audacity中导入它们并使用这些参数时,只有Firefox播放器可以正常播放。事实上,为了使图形在Chrome浏览器上正确显示,我必须将其导入为已签名的PCM(尽管如此仍然存在扭曲)。

任何想法为什么GetMixFormat错误或Google Chrome代码片段使用的是什么格式?作为一个说明,我发现Chrome示例包含1个完整帧(0xF00字节),然后只有一个帧(0x780字节),其余填充0,即使函数报告写入0xF00字节。但即使删除零数据,我也无法获得任何地方。 Chrome以某种方式改变缓冲区?

文件:

任何帮助,非常感谢!提前致谢。

回答

1

好吧我通过直接从音频客户端实例读取WAVEFORMATEX来解决GetMixFormat问题。这取决于版本,但...这就是它的工作原理为Win 8:

 mov  eax, pAudioClient 
     mov  eax, [eax + 0x7C] 
     mov  eax, [eax + 0x3C] 
     mov  edi, eax 
     mov  eax, [edi - 50h] 
     add  eax, 0xA0 
     mov  waveFormatEx, eax 

这也让我正确的帧大小,抓住缓冲区时,这是我的核心问题。在16bit PCM模式下播放它现在工作正常。

我试图将它适应于Win 7,但Audioses.dll差别很大,所以这可能需要一些时间。