windows上面捕獲音效卡資料

來源:互聯網
上載者:User

標籤:

  

轉自:http://shanewfx.github.io/blog/2013/08/14/caprure-audio-on-windows/


前一段時間接到一個任務,需要採集到音效卡的輸出訊號,以便與麥克風的輸入訊號進行混音。

在考慮如何?這個需求前,我們先討論下電腦聲音的三種模式:

1) render模式該方式實際上就是播放(output)聲音,常見的API如PlaySound, WaveOutXXX, DirectSound等

2) capture模式該方式實際上就是錄入(input)聲音, 也就是我們通過麥克風輸入聲音,常見API如WaveInXXX

3)loopback模式該方式就是我們需要實現的方式,即把擴音器裡播放的聲音抓取下來。

對於上面3種方式,render和capture方式應該比較好理解, 也都是系統有API直接支援的方式, loopback方式就比較奇怪了,在XP上該方式系統實際都沒有正式支援, loopback的錄製方式實際上也涉及到CD的著作權問題。

之前一直沒有研究過音訊相關技術,這次就順便抽出一點時間去瞭解了一下Windows上採集音訊相關技術。

對於音頻處理的技術,主要有如下幾種:

採集麥克風輸入


採集音效卡輸出


將音頻資料送入音效卡進行播放


對多路音頻輸入進行混音處理


1.Windows上音頻處理的API

在Windows作業系統上,常用的音頻處理技術主要包括:

Wave系列API函數、

DirectSound、

Core Audio。

其中,Core Audio只可以在Vista以上(包括Vista)的作業系統中才能使用,主要用來取代Wave系列API函數和DirectSound。

Core Audio實現的功能也比較強大,能實現對麥克風的採集、音效卡輸出的採集、控制聲音的播放。

而Wave系列的API函數主要是用來實現對麥克風輸入的採集(使用WaveIn系列API函數)和控制聲音的播放(使用後WaveOut系列函數)。

DirectSound能夠實現的功能估計和Wave系列API差不多,可能會更強一些(由於沒有使用過DirectSound,不太肯定!)。

為了實現採集模組對作業系統的相容性更好,基本上對麥克風輸入的採集使用WaveIn系列API函數比較多;

在Windows XP系統中,沒有直接提供對音效卡輸出進行採集的API,因此,在Windows XP要實現對音效卡輸出的採集會比較麻煩。 通常可選用支援混音的音效卡,然後通過使用音效卡的混音模組來實現採集,但並不是所有的音效卡都支援混音的功能,這樣的方案不具備通用性。

要實現通用性,可以採用虛擬音效卡的方式來實現,從驅動層擷取音效卡的輸出資料,但這種方案實現難度會比較大。

而在Vista以上的系統中,如Win7,則可以使用Core Audio中的API函數來實現採集音效卡輸出的功能。

對於混音模組的實現,目前基本是使用自訂的混音演算法來完成功能,系統沒有直接的API函數可供調用。

2.使用WaveIn系列API函數實現麥克風輸入採集

涉及的API函數:

waveInOpen

開啟音頻採集裝置,成功後會返回裝置控制代碼,後續的API都需要使用該控制代碼

調用模組需要提供一個回呼函數(waveInProc),以接收採集的音頻資料

waveInClose

關閉音頻採集模組

成功後,由waveInOpen返回的裝置控制代碼將不再有效 ?

waveInPrepareHeader

準備音頻採集資料緩衝的空間

waveInUnprepareHeader

清空音頻採集的資料緩衝

waveInAddBuffer

將準備好的音頻資料緩衝提供給音頻採集裝置

在調用該API之前需要先調用waveInPrepareHeader

waveInStart

控制音頻採集裝置開始對音頻資料的採集

waveInStop

控制音頻採集裝置停止對音頻資料的採集

音頻採集裝置採集到音頻資料後,會調用在waveInOpen中設定的回呼函數。

其中參數包括一個訊息類型,根據其訊息類型就可以進行相應的操作。

如接收到WIM_DATA訊息,則說明有新的音頻資料被採集到,這樣就可以根據需要來對這些音頻資料進行處理。

(樣本以後補上)

3.使用Core Audio實現對音效卡輸出的捕捉

涉及的介面有:

IMMDeviceEnumerator

IMMDevice

IAudioClient

IAudioCaptureClient

主要過程:

建立多媒體裝置列舉程式(IMMDeviceEnumerator)

通過多媒體裝置列舉程式擷取音效卡介面(IMMDevice)

通過音效卡介面擷取音效卡用戶端介面(IAudioClient)

通過音效卡用戶端介面(IAudioClient)可擷取音效卡輸出的音頻參數、初始化音效卡、擷取音效卡輸出緩衝區的大小、開啟/停止對音效卡輸出的採集

通過音效卡採集用戶端介面(IAudioCaptureClient)可擷取採集的音效卡輸出資料,並對內部緩衝區進行控制

(樣本以後補上)

4.常用的混音演算法

混音演算法就是將多路音頻輸入訊號根據某種規則進行運算(多路音頻訊號相加後做限幅處理),得到一路混合後的音頻,並以此作為輸出的過程。

我目前還做過這一塊,搜尋了一下基本有如下幾種混音演算法:

將多路音頻輸入訊號直接相加取和作為輸出

將多路音頻輸入訊號直接相加取和後,再除以混音通道數,防止溢出

將多路音頻輸入訊號直接相加取和後,做Clip操作(將資料限定在最大值和最小值之間),如有溢出就設最大值

將多路音頻輸入訊號直接相加取和後,做飽和處理,接近最大值時進行扭曲

將多路音頻輸入訊號直接相加取和後,做歸一化處理,全部乘個係數,使幅值歸一化

將多路音頻輸入訊號直接相加取和後,使用衰減因子限制幅值

 

 

 

 

下面是XP時代的Audio架構圖, 該架構下audio的合成和壓縮都是在系統核心裡進行的:

 

 

在XP這種方式下,我們要抓去音效卡播放的聲音沒有正規的方式, 一般來說只有2中: 

 

一種是虛擬音效卡,還有一種就是Hook audio 播放相關的API (很多時候我們會發現API hook是沒有辦法時的全能辦法 ^_^)

 

但是在Vista之後,微軟修改了原來的媒體架構, 以COM的方式重新封裝了core audio API:

 

可以看到原來Auido的API (waveXXX, mixerXXX和DirectSound)都依賴下層的新封裝的Core Audio APIs,而且這些APi都工作在使用者模式, 也就是說聲音的合成是在使用者模式下通過軟體實現的。在Vista之後, 可以看到我們可以單獨控制每個應用程式的聲音了, 因為每路Audio都可以工作在不同的Audio session了。通過新的Core Audio API, 我們可以很容易的實現音效卡聲音的抓取

 

 

windows上面捕獲音效卡資料

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.