2015-01-09 108 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差別很大,所以這可能需要一些時間。