• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            工作中有個需求是關(guān)于抓取揚聲器的聲音, 為什么會有這個需求? 
            試想我們在共享遠程桌面時,如果能夠把本地桌面應(yīng)用程序的聲音也一起發(fā)給對方, 用戶體驗該是多么棒。

            在考慮如何實現(xiàn)這個需求前,我們先討論下電腦聲音的三種模式:

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

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

            3)loopback模式
            該方式就是我們需要實現(xiàn)的方式,即把揚聲器里播放的聲音抓取下來。

            對于上面3種方式,render和capture方式應(yīng)該比較好理解, 也都是系統(tǒng)有API直接支持的方式, loopback方式就比較奇怪了,在XP上該方式系統(tǒng)實際都沒有正式支持, loopback的錄制方式實際上也涉及到CD的版權(quán)問題。

            下面是XP時代的Audio架構(gòu)圖, 該架構(gòu)下audio的合成和壓縮都是在系統(tǒng)內(nèi)核里進行的:
            在XP這種方式下,我們要抓去聲卡播放的聲音沒有正規(guī)的方式, 一般來說只有2中: 
            一種是虛擬聲卡,還有一種就是Hook audio 播放相關(guān)的API (很多時候我們會發(fā)現(xiàn)API hook是沒有辦法時的全能辦法 ^_^)

            但是在Vista之后,微軟修改了原來的媒體架構(gòu), 以COM的方式重新封裝了core audio API:
            可以看到原來Auido的API (waveXXX, mixerXXX和DirectSound)都依賴下層的新封裝的Core Audio APIs,而且這些APi都工作在用戶模式, 也就是說聲音的合成是在用戶模式下通過軟件實現(xiàn)的。在Vista之后, 可以看到我們可以單獨控制每個應(yīng)用程序的聲音了, 因為每路Audio都可以工作在不同的Audio session了。通過新的Core Audio API, 我們可以很容易的實現(xiàn)聲卡聲音的抓取, 具體可參考這里:http://msdn.microsoft.com/en-us/library/ms679146.aspx

            但是很快我們又發(fā)現(xiàn)了另外一個問題, 在一個網(wǎng)絡(luò)會議里面, 如果共享自己桌面的人加入了VOIP, 另外也有其他與會者也加入了VOIP, 與會者說話的聲音會在共享桌面端播放出來,但是該聲音和共享的應(yīng)用程序的聲音又被一起被抓下來后發(fā)給了原來的與會者, 這樣就有回聲了。

            這里就涉及到抓取聲卡聲音時能否排除掉某個聲音,可惜答案是系統(tǒng)WASAPI不支持這種方式。但是因為與會者VOIP的聲音是我們自己播放的,所以我們有該聲音樣本, 理論上我們可以通過噪聲消除從混音里過濾掉與會者的聲音,當(dāng)然這塊知識太高深,需要專門的人才能做了。
             一些Audio相關(guān)的例子:http://msdn.microsoft.com/zh-cn/subscriptions/downloads/dd316764.aspx

             個人寫的一個小Demo: AudioRecord

            posted on 2014-08-21 23:34 Richard Wei 閱讀(14966) 評論(5)  編輯 收藏 引用 所屬分類: windows desktop

            FeedBack:
            # re: 如何抓取揚聲器的聲音
            2015-03-23 19:35 | 王小亮
            恩,這里代碼不錯的。正在學(xué)習(xí)中。  回復(fù)  更多評論
              
            # re: 如何抓取揚聲器的聲音[未登錄]
            2015-06-15 16:22 |
            8錯。關(guān)于聲卡的LOOPBACK模式,這里也有介紹http://v.youku.com/v_show/id_XMTI2Mjc1MTg2OA==.html?from=y1.7-1.2  回復(fù)  更多評論
              
            # re: 如何抓取揚聲器的聲音
            2016-01-05 13:43 | josanna
            博主,你好!
            首先感謝你的代碼分享,我從中受益不少。但有個問題想向你反饋,不知道你有沒有解決方法。
            在點擊startCapture以后,程序開始采集播放聲卡上的聲音。但在這個過程中,我打開Audition軟件,并有頻繁切換桌面上文件夾。然后,點擊stopCapture停止錄音。并打開StartPlay以后,聽錄下的音源,發(fā)現(xiàn)聲音存在數(shù)據(jù)不連續(xù),丟失的現(xiàn)象。于是,也具體到代碼和日志里面分析,發(fā)現(xiàn)在錄音過程中,博主所用的定時器并非完全按照5ms去探測AudioEndpointBuffer上的數(shù)據(jù),在桌面上操作或打開一些軟件的時候,計時器會受到影響,異常時會出現(xiàn)幾次一兩百毫秒周期,出現(xiàn)了音頻數(shù)據(jù)的丟失。針對這種情況,博主,你有相關(guān)的解決方法嗎?  回復(fù)  更多評論
              
            # re: 如何抓取揚聲器的聲音
            2016-01-05 19:36 | Richard Wei
            @josanna
            不行就開線程吧,還不行可以嘗試提高線程的優(yōu)先級  回復(fù)  更多評論
              
            # re: 如何抓取揚聲器的聲音
            2016-01-06 08:45 | josanna
            @Richard Wei
            好的 我去試試,多謝!  回復(fù)  更多評論
              
            免费精品久久久久久中文字幕 | 久久亚洲精品成人AV| 韩国免费A级毛片久久| 亚洲综合婷婷久久| 久久天天躁狠狠躁夜夜avapp| 亚洲中文字幕无码久久2017| 久久精品国产2020| 久久天天躁狠狠躁夜夜躁2014| 色综合久久久久久久久五月| 天天综合久久久网| 久久99国产精一区二区三区| 亚洲欧美精品一区久久中文字幕| 99久久精品日本一区二区免费| 久久99精品免费一区二区| 国产精品久久久久影视不卡| 亚洲精品国产综合久久一线| 思思久久99热只有频精品66| 大美女久久久久久j久久| 久久精品无码一区二区三区| 99久久国产免费福利| 欧美亚洲国产精品久久| 国内精品久久久久久不卡影院| 久久精品国产色蜜蜜麻豆| 91精品观看91久久久久久| 久久九九兔免费精品6| 久久免费国产精品| 久久亚洲2019中文字幕| 久久99精品久久久久久噜噜 | 国产一区二区三区久久精品| 久久久久亚洲av成人无码电影| 99国产欧美久久久精品蜜芽| 青草久久久国产线免观| 东方aⅴ免费观看久久av | 国产成人久久精品区一区二区| 狠狠色狠狠色综合久久| 亚洲精品午夜国产va久久| 欧美伊人久久大香线蕉综合69 | 久久99精品久久只有精品| 伊人久久综合无码成人网| 影音先锋女人AV鲁色资源网久久| 久久精品日日躁夜夜躁欧美|