首頁(yè)>>>技術(shù)>>>視像通信  視像通信產(chǎn)品

DirectX技術(shù)實(shí)現視頻會(huì )議中的音頻通信

2008/03/18

  視頻會(huì )議以其方便、快捷、“面對面”交流的優(yōu)點(diǎn)逐漸得到了人們的認可,許多企事業(yè)單位、教育單位,醫療單位都希望使用視頻會(huì )議來(lái)代替傳統的會(huì )議形式。在視頻會(huì )議中,與會(huì )者之間主要傳輸的是音頻數據和視頻數據,其中的音頻數據顯得更為重要。因為會(huì )議中的大部分有用信息都包含在與會(huì )者的言語(yǔ)交流上,所以視頻會(huì )議系統必須保證音頻通信的流暢性和全雙工,才能使視頻會(huì )議更接近于真實(shí)的會(huì )議環(huán)境。



  DirectX是Microsoft開(kāi)發(fā)的專(zhuān)門(mén)用于開(kāi)發(fā)游戲和多媒體軟件的應用程序接口(API),包括了對二維和三維圖像、聲音、音樂(lè )和針對網(wǎng)絡(luò )多人游戲的網(wǎng)絡(luò )通信的強大支持。DirectX是一種標準的軟件接口,所有主要的硬件供應商都提供支持DirectX的驅動(dòng)設備,應用DirectX的軟件可以在不同的硬件環(huán)境下正常運行。另一方面,DirectX能根據所使用的不同硬件,來(lái)選擇適當的方式使用硬件加速能力,便于開(kāi)發(fā)高質(zhì)量的多媒體和游戲軟件。在DirectX所提供的眾多組件中,用于音頻處理的是Direct Sound組件。為保證視頻會(huì )議系統中語(yǔ)音的流暢性,需要采用Direct Sound中提供的Streaming Buffer(流式緩沖)機制來(lái)實(shí)現。而為了保證視頻會(huì )議系統中的全雙工音頻通信,主要利用的則是Direct Sound中的混音機制來(lái)實(shí)現。

利用Streaming Buffer實(shí)現流暢的語(yǔ)音交流

  Direct Sound中提供了兩種緩沖機制,分別是Static Buffer(靜態(tài)緩沖)和Streaming Buffer(流式緩沖)。Static Buffer指一次將一段完整的聲音存入緩沖中;Streaming Buffer指的是并不將全部的數據一次讀入緩沖,而是在播放聲音時(shí)動(dòng)態(tài)地讀入,占用空間較小。一般來(lái)說(shuō),如果聲音需要反復播放而且容量有限(如游戲音效),使用Static Buffer更有助于提高程序的效率;相反,如果是容量很大、實(shí)時(shí)性要求較高的音頻數據流,則使用Streaming Buffer為佳。在視頻會(huì )議系統中,如使用Static Buffer,則在向緩沖區寫(xiě)入新的音頻數據時(shí),聲音的回放必然出現短暫停頓,使與會(huì )者的完整話(huà)語(yǔ)不能夠連續播放,影響通話(huà)的流暢性,而Streaming Buffer可克服語(yǔ)音不連續的缺點(diǎn)。

  Streaming Buffer提供了兩個(gè)指針:Play Cursor(回放游標)和Write Cursor(寫(xiě)入游標),它們的值只是相對于緩沖區開(kāi)頭的偏移量而非絕對的內存地址。其中Play Cursor總是指向下一個(gè)被輸出的數據字節,而Write Cursor指向的地址則指明從哪個(gè)地方開(kāi)始可以安全地寫(xiě)入新的音頻數據而不影響回放。按回放音頻數據的順序來(lái)看,Write Cursor總是在Play Cursor之前,并且它們間保持著(zhù)一定的間距,而這個(gè)間距會(huì )根據不同的系統狀況而有所不同,實(shí)驗表明這個(gè)間距大概是100~200字節左右。當開(kāi)始對緩沖區中的音頻數據進(jìn)行循環(huán)模式回放時(shí),總是在Play Cursor所指的地方開(kāi)始。回放后Play Cursor和Write Cursor會(huì )保持它們的間距等速度前移,并且Play Cursor總是指向下一個(gè)被輸出的數據字節。當回放到達緩沖區的結尾處時(shí),Play Cursor將重新指向緩沖區的開(kāi)頭,如此循環(huán)下去。而當程序停止對Streaming Buffer中的音頻數據進(jìn)行回放時(shí),Play Cursor則不再移動(dòng),并停留在下一個(gè)被輸出的數據字節處,直到重新回放才會(huì )繼續前移。另外,在Play Cursor和Write Cursor之間的區域被認為是即將要進(jìn)行回放的數據,所以不能夠對其做更新。在理解了Streaming Buffer的基本工作方式后,接下來(lái)詳細闡述如何用Visual C++作具體實(shí)現,其中會(huì )涉及到一些Visual C++的函數,具體可參考Microsoft MSDN。

  在程序中,設置一個(gè)大小為一幀音頻數據的大小(一般相當于0.25秒的語(yǔ)音)的2倍的Streaming Buffer。并且在Streaming Buffer的正中間和結尾處分別設置標志一個(gè)觸發(fā)事件。程序開(kāi)始時(shí),通過(guò)調用Play函數對Streaming Buffer中的數據進(jìn)行循環(huán)回放。當Play Cursor到達正中間和結尾時(shí),事件就會(huì )產(chǎn)生,就可以通過(guò)程序向緩沖區寫(xiě)入新一幀的音頻數據。在寫(xiě)入新一幀音頻數據的過(guò)程中,首先調用Lock函數鎖定緩沖區中的部分,此時(shí)的Write Cursor被鎖定不再前移,而Play Cursor將跟隨著(zhù)聲音的回放繼續前進(jìn);利用回放Play Cursor和Write Cursor間的音頻數據的一段時(shí)間內,根據鎖定時(shí)獲得的lplpvAudioPtr1(此時(shí)的lplpvAudioPtr1指向的地方就是鎖定時(shí)Write Cursor的所指的地方),lpdwAudioBytes1(可安全寫(xiě)入的音頻數據大小)等與Streaming Buffer相關(guān)的參數lplpvAudioPtr2、lpdwAudioBytes2等信息,把數據在指定的地方寫(xiě)入緩沖區,然后調用Unlock函數解除對Write Cursor的鎖定。這樣,Write Cursor重新調整回與Play Cursor保持100~200字節間距的地方,繼續對新的音頻數據進(jìn)行回放。上述這個(gè)過(guò)程在整個(gè)程序的運行過(guò)程中,不斷地循環(huán)進(jìn)行,如圖1所示,實(shí)現了在對Streaming Buffer中舊一幀音頻數據進(jìn)行回放的同時(shí)寫(xiě)入新一幀的音頻數據。

  從理論上講,這已經(jīng)保證了音頻回放的流暢性。但在實(shí)現過(guò)程中,由于操作的對象是一幀的音頻數據,其回放的時(shí)間僅是0.25秒,所以必須考慮的一個(gè)問(wèn)題是程序的反應速度問(wèn)題。如果忽略由事件觸發(fā)到真正用Lock函數鎖定緩沖區的部分以進(jìn)行新數據寫(xiě)入之間的時(shí)間,則這種實(shí)現方法沒(méi)有任何問(wèn)題。除了最開(kāi)始的兩幀數據外,新的一幀數據會(huì )緊跟在前一幀數據之后,彼此之間沒(méi)有重疊部分,也沒(méi)有空隙存在,能很好地達到音頻回放的流暢效果。但事實(shí)上,由事件觸發(fā)到真正用Lock函數鎖定緩沖區的部分以進(jìn)行新數據的寫(xiě)入之間還必須經(jīng)過(guò)線(xiàn)程監聽(tīng)到事件,分析事件對應的緩沖區,然后再觸發(fā)相應的回調函數來(lái)進(jìn)行

  上面所述的新一幀音頻數據的寫(xiě)入過(guò)程。而這一系列分析工作所占用的時(shí)間是會(huì )隨系統當時(shí)的狀況而變化的,是一個(gè)隨機的時(shí)間長(cháng)度,所以每次對緩沖區用Lock函數鎖定緩沖區的部分時(shí),Write Cursor所在的位置都會(huì )不同,這樣就造成新的一幀數據并不一定會(huì )嚴格地緊跟在前一幀數據之后,它們之間可能會(huì )出現重疊部分,也可能會(huì )有空隙出現,不利于音頻數據的連續播放。如果出現重疊部分,那么回放造成有部分的音頻數據丟失;如果有空隙的出現,會(huì )造成語(yǔ)音的不連續或混亂。但經(jīng)過(guò)調試,仔細分析了由事件觸發(fā)到真正用Lock函數鎖定緩沖區的部分以進(jìn)行新數據寫(xiě)入之間的時(shí)間后,發(fā)現它對鎖定時(shí)Write Cursor所在位置的偏差產(chǎn)生的波動(dòng)不大,一般由此產(chǎn)生的重疊部分或空隙部分都在50字節左右,也就是說(shuō)平均每幀數據中會(huì )有50字節的錯誤。在程序中,指定的一幀音頻數據為2000字節(與0.25秒相對應),所以會(huì )有大概2.5%的音頻數據會(huì )出錯。如果以所采用的音頻格式來(lái)計算,8KSPS(采樣率)*8Bit(每個(gè)采樣用8位表示)=64KBit/s=8KB/s,那么這2.5%的錯誤在每秒鐘內對應的會(huì )是0.025s的音頻數據,基本上人的聽(tīng)力是難以分辨的。所以在采用Streaming Buffer依然能很好地達到了音頻的流暢性要求。

  上面只闡述了音頻回放的實(shí)現方法,但作為整個(gè)視頻會(huì )議系統中的音頻功能來(lái)說(shuō),還必須有音頻采集部分跟它相配合。音頻采集部分的實(shí)現方法與回放模塊的基本原理是一樣,都是利用Streaming Buffer來(lái)實(shí)現,故此處不再詳述。

利用混音機制實(shí)現全雙工音頻通信

  Direct Sound中有Primary Buffer(主緩沖區)和Secondary Buffer(輔助緩沖區)兩個(gè)緩沖區。前面所述的Streaming Buffer屬于Secondary Buffer。在初始化DirectSound時(shí),它會(huì )自動(dòng)創(chuàng )建一個(gè)Primary Buffer,這個(gè)主緩沖的作用就是進(jìn)行混音并把混音結果送到輸出設備。除了Primary Buffer外,程序至少還應該創(chuàng )建一個(gè)Secondary Buffer,輔助緩沖的作用是儲存將要使用的聲音,在不使用的時(shí)候可以釋放掉,但Primary Buffer是不可釋放的。用DirectSound實(shí)現同時(shí)播放多個(gè)聲音,前提是硬件允許。其工作過(guò)程如下,當程序同時(shí)對多個(gè)Secondary Buffer中的音頻數據進(jìn)行回放時(shí),Direct Sound會(huì )把這些來(lái)自于不同Secondary Buffer的聲音在主緩沖區進(jìn)行自動(dòng)混音,然后通過(guò)輸出設備輸出,如圖2所示。所以通常情況下,用戶(hù)并不需要和主緩沖打交道,DirectSound會(huì )自行管理。視頻會(huì )議系統的全雙工音頻通信功能,就是利用DirectSound的這一混音機制達到的。

  視頻會(huì )議中要實(shí)現的全雙工音頻通信功能并不僅限于兩個(gè)與會(huì )者之間的全雙工通信,而應該擴展為會(huì )議的每個(gè)者都能根據需要,同時(shí)聽(tīng)到其他與會(huì )者的講話(huà),以達到很好的討論交流效果。為此,在程序中為每個(gè)與會(huì )者分配一個(gè)緩沖數組,數組的大小與一幀音頻數據大小相同。系統開(kāi)始運行后,程序一方面把各個(gè)與會(huì )成員的音頻數據幀接收下來(lái),然后根據用戶(hù)標識把它們分別保存在相應的緩沖數組中,并按照時(shí)間順序排列好,而且會(huì )為每個(gè)用戶(hù)創(chuàng )建一個(gè)Streaming Buffer用于音頻回放。另一方面,開(kāi)始對各個(gè)用戶(hù)對應的Streaming Buffer里的內容進(jìn)行循環(huán)播放回放和更新,而更新的音頻數據由各個(gè)用戶(hù)的緩沖數組順序提供。這樣,不同用戶(hù)的音頻信息會(huì )自動(dòng)被Direct Sound進(jìn)行混音,并把混音的結果放到Primary Buffer中,再從輸出設備輸出,從而達到所需的效果。

結束語(yǔ)

  DirectX技術(shù)大大方便了各種多媒體軟件的開(kāi)發(fā),已經(jīng)獲得廣泛采用。通過(guò)聯(lián)合使用DirectX中提供的Streaming Buffer機制和混音機制,在視頻會(huì )議系統中實(shí)現了流暢的全雙工音頻通信,使用效果令人滿(mǎn)意。

www.cps.com.cn



相關(guān)鏈接:
CDN瞄準高清視頻市場(chǎng) 2008-03-17
高端視頻會(huì )議市場(chǎng)狼煙四起 2008-03-17
有關(guān)高清晰視頻通信的廖論與事實(shí) 2008-03-17
技術(shù)發(fā)展 視頻會(huì )議通信步入協(xié)作時(shí)代 2008-03-14
視頻會(huì )議應用左右逢源 2008-03-13

分類(lèi)信息:        
亚洲精品网站在线观看不卡无广告,国产a不卡片精品免费观看,欧美亚洲一区二区三区在线,国产一区二区三区日韩 景东| 玛纳斯县| 永平县| 晋州市| 西宁市| 南投市| 弥渡县| 梁山县| 海兴县| 会同县| 孟津县| 获嘉县| 连山| 宣威市| 义马市| 贺兰县| 麻江县| 平定县| 武隆县| 即墨市| 廊坊市| 岑巩县| 富裕县| 黄龙县| 金坛市| 华宁县| 镶黄旗| 晋宁县| 三原县| 河东区| 娄底市| 湛江市| 托克逊县| 武山县| 广东省| 桐柏县| 三门峡市| 安化县| 龙江县| 江城| 神木县| http://444 http://444 http://444 http://444 http://444 http://444