工作中有個(gè)需求是關(guān)于抓取揚(yáng)聲器的聲音, 為什么會(huì)有這個(gè)需求?
試想我們?cè)诠蚕磉h(yuǎn)程桌面時(shí),如果能夠把本地桌面應(yīng)用程序的聲音也一起發(fā)給對(duì)方, 用戶體驗(yàn)該是多么棒。
在考慮如何實(shí)現(xiàn)這個(gè)需求前,我們先討論下電腦聲音的三種模式:
1) render模式
該方式實(shí)際上就是播放(output)聲音,常見的API如PlaySound, WaveOutXXX, DirectSound等
2) capture模式
該方式實(shí)際上就是錄入(input)聲音, 也就是我們通過麥克風(fēng)輸入聲音,常見API如WaveInXXX
3)loopback模式
該方式就是我們需要實(shí)現(xiàn)的方式,即把揚(yáng)聲器里播放的聲音抓取下來。
對(duì)于上面3種方式,render和capture方式應(yīng)該比較好理解, 也都是系統(tǒng)有API直接支持的方式, loopback方式就比較奇怪了,在XP上該方式系統(tǒng)實(shí)際都沒有正式支持, loopback的錄制方式實(shí)際上也涉及到CD的版權(quán)問題。
下面是XP時(shí)代的Audio架構(gòu)圖, 該架構(gòu)下audio的合成和壓縮都是在系統(tǒng)內(nèi)核里進(jìn)行的:
在XP這種方式下,我們要抓去聲卡播放的聲音沒有正規(guī)的方式, 一般來說只有2中:
一種是虛擬聲卡,還有一種就是Hook audio 播放相關(guān)的API (很多時(shí)候我們會(huì)發(fā)現(xiàn)API hook是沒有辦法時(shí)的全能辦法 ^_^)
但是在Vista之后,微軟修改了原來的媒體架構(gòu), 以COM的方式重新封裝了core audio API:
可以看到原來Auido的API (waveXXX, mixerXXX和DirectSound)都依賴下層的新封裝的Core Audio APIs,而且這些APi都工作在用戶模式, 也就是說聲音的合成是在用戶模式下通過軟件實(shí)現(xiàn)的。在Vista之后, 可以看到我們可以單獨(dú)控制每個(gè)應(yīng)用程序的聲音了, 因?yàn)槊柯稟udio都可以工作在不同的Audio session了。通過新的Core Audio API, 我們可以很容易的實(shí)現(xiàn)聲卡聲音的抓取, 具體可參考這里:http://msdn.microsoft.com/en-us/library/ms679146.aspx
但是很快我們又發(fā)現(xiàn)了另外一個(gè)問題, 在一個(gè)網(wǎng)絡(luò)會(huì)議里面, 如果共享自己桌面的人加入了VOIP, 另外也有其他與會(huì)者也加入了VOIP, 與會(huì)者說話的聲音會(huì)在共享桌面端播放出來,但是該聲音和共享的應(yīng)用程序的聲音又被一起被抓下來后發(fā)給了原來的與會(huì)者, 這樣就有回聲了。
這里就涉及到抓取聲卡聲音時(shí)能否排除掉某個(gè)聲音,可惜答案是系統(tǒng)WASAPI不支持這種方式。但是因?yàn)榕c會(huì)者VOIP的聲音是我們自己播放的,所以我們有該聲音樣本, 理論上我們可以通過噪聲消除從混音里過濾掉與會(huì)者的聲音,當(dāng)然這塊知識(shí)太高深,需要專門的人才能做了。
posted on 2014-08-21 23:34
Richard Wei 閱讀(15076)
評(píng)論(5) 編輯 收藏 引用 所屬分類:
windows desktop