虛擬聲卡(虛擬揚(yáng)聲器和虛擬麥克風(fēng))技術(shù)原理簡介
1. 背景
近些年云計(jì)算的發(fā)展可謂是勢不可擋,無論是辦公還是娛樂等行業(yè)都開始使用云計(jì)算來逐步替代直接使用本地物理硬件的技術(shù),例如:
- 服務(wù)器部署。相比之前,現(xiàn)在部署一個(gè)服務(wù)器都非常簡單;我們只需要在阿里云,華為云等購買相關(guān)主機(jī)(虛擬機(jī))和服務(wù)即可,根本無需在公網(wǎng)部署一個(gè)硬件設(shè)備,這樣我們非常容易就擁有了自己個(gè)人的公網(wǎng)服務(wù)器。
- VDI云桌面。該項(xiàng)技術(shù)目前主要是針對內(nèi)網(wǎng)辦公場景,企業(yè)通過桌面云集中管理員工虛擬主機(jī),達(dá)到數(shù)據(jù)安全,集中管理,快速重復(fù)利用,一鍵式部署等功能。
- 云游戲。隨著4G和5G網(wǎng)絡(luò)的飛速發(fā)展,游戲也開始逐漸云化,很多傳統(tǒng)游戲廠商和VR游戲廠商都開始支持云游戲;借助云游戲,我們?nèi)绻枰娲笮陀螒颍镜責(zé)o需高性能GPU和CPU的支持,甚至本地?zé)o需要對游戲進(jìn)行直接安裝,我們使用簡單(廉價(jià))終端就可以通過云游戲技術(shù)來體驗(yàn)大型游戲,達(dá)到與本地一致的體驗(yàn)效果。
我們以VDI云桌面辦公為例,其大致的部署架構(gòu)如下:
如上圖,一般來說:
- 客戶端:指的是我們的瘦終端,一般使用的是普通硬件,比如性能比較差但是價(jià)格比較廉價(jià)的個(gè)人終端電腦。
- 服務(wù)器:這里指的是我們的虛擬機(jī),是我們真實(shí)運(yùn)行的主機(jī)(安裝了各種辦公應(yīng)用或者游戲的虛擬機(jī)),它一般有高性能,方便管理等特性。
在云計(jì)算的背景下面,雖然我們云主機(jī)(上圖的虛擬機(jī))運(yùn)行在了遠(yuǎn)端,給使用和管理帶來了非常大的便捷,但是也帶來了很大技術(shù)上面的困難。例如聲音的播放和錄制相比本地的使用實(shí)現(xiàn)就復(fù)雜很多,下面舉幾個(gè)相關(guān)例子:
- 如果我們使用云游戲,一個(gè)非常通用的功能就是接麥;由于我們的云主機(jī)一般是虛擬機(jī),沒有接入麥克風(fēng),這個(gè)時(shí)候如果需要接麥的話就會非常麻煩(如果是物理主機(jī),麥克風(fēng)在本地,遠(yuǎn)端主機(jī)也無法連接本地麥克風(fēng))。
- 如果我們使用VDI云桌面,也有類似的場景,例如我們使用直播軟件或者教學(xué)軟件進(jìn)行聲音廣播;或者我們使用電話軟件進(jìn)行撥號的時(shí)候也是需要麥克風(fēng)支持的,此時(shí)麥克風(fēng)硬件在也是無法達(dá)到要求。
- 對于揚(yáng)聲器來說,雖然我們可以直接對揚(yáng)聲器聲音進(jìn)行捕獲,然后在客戶端(瘦終端)進(jìn)行播放,但是虛擬機(jī)并沒有揚(yáng)聲器設(shè)備,因此也無法達(dá)到需求(用戶程序無法進(jìn)行音頻播放)。
面臨這些問題,我們需要在虛擬機(jī)有揚(yáng)聲器和麥克風(fēng),并且需要能夠做到:
- 揚(yáng)聲器:最基礎(chǔ)的功能需要讓用戶軟件可以識別到揚(yáng)聲器設(shè)備,并使用該揚(yáng)聲器進(jìn)行聲音播放,當(dāng)然我們也可以在驅(qū)動(dòng)中獲取應(yīng)用程序播放音頻數(shù)據(jù)。
- 麥克風(fēng):麥克風(fēng)就比較麻煩了,麥克風(fēng)僅僅讓相關(guān)用戶軟件能夠識別到硬件設(shè)備還不足已解決問題,對于麥克風(fēng)設(shè)備還需要支持喂數(shù)據(jù)的操作,將需要錄制的音頻直接傳遞給麥克風(fēng),達(dá)到真實(shí)聲音錄制的效果。
要解決上面這些問題,就需要在虛擬機(jī)中對聲卡進(jìn)行虛擬化,實(shí)現(xiàn)虛擬聲卡驅(qū)動(dòng)程序,使得用戶程序能夠使用揚(yáng)聲器播放聲音以及可以對麥克風(fēng)喂數(shù)據(jù),將本地麥克風(fēng)的數(shù)據(jù)喂給虛擬機(jī)的虛擬麥克風(fēng)。
下面,將通過本文來分析虛擬聲卡的實(shí)現(xiàn)原理,來實(shí)現(xiàn)虛擬揚(yáng)聲器和虛擬麥克風(fēng)的功能。
2. 技術(shù)概要
2.1 用戶層聲音架構(gòu)
在XP下面,Windows對于聲音的處理架構(gòu)基本如下:
這種架構(gòu)只有在XP系統(tǒng)下才支持,在這種模式下面我們可以發(fā)現(xiàn),如果對于揚(yáng)聲器聲音采集的話會非常麻煩,要么使用HOOK,要么實(shí)現(xiàn)虛擬揚(yáng)聲器在驅(qū)動(dòng)中拷貝數(shù)據(jù)。
因此Windows在Vista版本對音頻的架構(gòu)做了很多的調(diào)整,Vista之后的版本架構(gòu)如下:
該架構(gòu)下面,所有的聲音都通過Core Audio API來進(jìn)行控制,該架構(gòu)下面聲音有三種模式進(jìn)行處理:
- render模式 :該方式實(shí)際上就是播放聲音,常見的API如PlaySound, WaveOutXXX, DirectSound,IAudioRenderClient等,具體的如何使用揚(yáng)聲器進(jìn)行音頻播放不是本文的重點(diǎn),如果想了解Windows上的音頻播放可以參考如下MSDN鏈接
https://learn.microsoft.com/en-us/windows/win32/coreaudio/rendering-a-stream
- capture模式 :該方式實(shí)際上就是錄入聲音, 也就是我們通過麥克風(fēng)輸入聲音,常見API如WaveInXXX,IAudioCaptureClient, 如果想了解更多關(guān)于如何從麥克風(fēng)采集數(shù)據(jù)請參考如下MSDN鏈接:
https://learn.microsoft.com/en-us/windows/win32/coreaudio/capturing-a-stream
- loopback模式 : 該方式就是把揚(yáng)聲器里播放的聲音抓取下來,通常我們看到的流推軟件中聲音的推送就是使用該模式采集的。
在Vista系統(tǒng)音頻架構(gòu)中,我們對音頻的開發(fā)也相對簡單:文章來源:http://www.zghlxwxcb.cn/news/detail-762237.html
- MMDevice API:表示聲音設(shè)備相關(guān)的接口,例如枚舉聲音設(shè)備等等。
- WASAPI:這個(gè)是Windows 聲音會話相關(guān)的所有API,我們看到的
IAudioClient
等接口,以及最關(guān)鍵用于播放揚(yáng)聲器的IAudioRenderClient接口以及采集麥克風(fēng)的音頻數(shù)據(jù)的IAudioCaptureClient,都是由他提供。 - DeviceTopologyAPI:這個(gè)是設(shè)備拓?fù)浣Y(jié)構(gòu)管理的API,用于遍歷音頻設(shè)備適和音頻終端的內(nèi)部拓?fù)?,并可以決定音頻設(shè)備的連接順序,通過DeviceTopology API中的接口和方法, 我們可以沿著Audio Adapter的硬件設(shè)備里的數(shù)據(jù)通道數(shù)據(jù)流程進(jìn)行之配置,比如對音頻終端設(shè)備的數(shù)據(jù)路徑上流經(jīng)音頻數(shù)據(jù)流進(jìn)行音量控制。
- EndPointVolumeAPI:這個(gè)是音量控制相關(guān)的API。
上述圖中,聲音的播放分為共享模式和獨(dú)占模式:文章來源地址http://www.zghlxwxcb.cn/news/detail-762237.html
- 共享模式:每個(gè)用戶程序都在自己的會話進(jìn)行聲音播放
到了這里,關(guān)于如何在云電腦串流中實(shí)現(xiàn)聲音輸入輸出—虛擬聲卡(虛擬揚(yáng)聲器和虛擬麥克風(fēng))開發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!