1000部丰满熟女富婆视频,托着奶头喂男人吃奶,厨房挺进朋友人妻,成 人 免费 黄 色 网站无毒下载

首頁 > 文章中心 > 正文

實時混音網絡通信探析

前言:本站為你精心整理了實時混音網絡通信探析范文,希望能為你的創作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。

實時混音網絡通信探析

摘要本文主要討論多路聲音實時混疊的實現方法,以及實現過程中對一些特殊情況的處理。關鍵詞Wave混音混音器

1.引言

將多個Wave文件或多路Wave數據同時在Wave設備上輸出,就可同時聽到多個不同的聲音,達到混音的效果。如果是將多個不同端點的話音數據經局域網絡傳輸到達某一個端點再經該端點的Wave設備輸出,就能同時聽到多個人的話音,從而實現局域網絡中多方的話音交談。

在網絡上實現話音交談,特別強調實時性,要盡量保證話音的平滑、連續,因此為了保證話音數據連續,減少話音數據存儲帶來的延時,在具體實現中,話音的錄制和播放都不采用文件的形式,錄制和播放的話音數據都存在緩沖區中。在Windows系統中,一般情況下,高層Wave接口函數無法直接播放緩沖區中的話音數據,而必須用底層函數來實現,常用的是WindowsAPI中的Wave函數。將Wave數據在Wave設備上輸出使用的是WaveOutWrite函數,但是該函數不支持多路Wave數據的同時播放,為了能達到多路Wave數據同時播放的效果,對緩沖區中多路Wave數據進行必要的預處理后,再提交給Wave輸出設備播放。實現原理如圖1所示。

圖1多路Wave混音的實現原理

2.實現原理

實時地混音,就是將多路Wave數據進行相互疊加處理到另一個目的緩沖區,最終將該目的的緩沖區提交給Wave輸出設備。

將每一路Wave數據作為一個單獨通道,分別從每個通道取一數據片段,把取得的幾個數據片段相互疊加,然后存進另外一個目的緩沖區中。為了便于處理,緩沖區通常采用數組的形式存放Wave數據。

如果話音數據,采用采樣頻率1025Hz,8位單聲道的數據格式,那么一秒的話音數據量為11025個字節。

為了達到實時的效果,目的緩沖區通常都設置比較小,大約可存放1/8秒的話音數據量,對于前述的話音格式,目的緩沖區的大小為11025/8=1375個字節。

下面具體看一下Wave數據以數組形式存放時的混音過程。如圖2所示。

圖2多路Wave數據的疊加過程

假設有4路Wave數據,目的緩沖區的大小為1378,混音子函數調用為Mixer(lpDest,rgpCDdata,4,1378)。

下面給出混音子函數的實現。其中lpDest為目的緩沖區,rgWaveSrc為多路Wave數據源,iNumWaves為Wave數據源的通道數,wLen為目的緩沖區長度。

Voidmixit(LPSAMPLElpDest,LPSAMPLErgWaveSrc[],intiNumWaves,WORDwLen)

{int,,iSum;

WORDctr;

ctr=0

While(wLen)

{

iSum=128;/*靜音時數值為128*/

for(I=0;I<iNumWaves;I++)

iSum=iSum+*(rgWaveSrc[]+ctr)-128;

PEG(int)0,iSum,(int)225);/*對轉換結果處理*/

*lpDest++=iSum;

ctr++;

wLen--;

}

}

注意一點的是對于單聲道數據一個字節表示一個采樣值,采樣值在0-255之間,各個通道的對應Wave數據相加后,就會溢出,還需要將相加結果轉換成0-255之間的數值。

將該目的緩沖區中的Wave數據經WaveOutWrite函數輸出,就能同時聽到四個不同的聲音,當Wave輸出設備播放完目的緩沖區中的數據便返回,請求用戶提供更多的Wave輸出數據,因為Wave輸出設備只能輸出提交給它的Wave數據;另外,對Wave數據進行混音還需要一定的時間,因此當提交一個目的緩沖區中的數據給Wave輸出設備后,就必須馬上混疊另一段Wave數據來提交給Wave輸出設備,作為下一個輸出的數據緩沖區,避免聲音輸出的中斷,后一個目的緩沖區提交后被輸出設備放入輸出隊列中,當第一個目的緩沖區中輸出完畢后再輸出它的數據,當輸出設備在輸出第二個目的緩沖區的數據時,又能將第三段數據混合進第一個目的緩沖區中,然后重新提交,直到提交完所有的Wave數據,那時就將停止輸出。在實際應用中目的緩沖區的數要多個,一般為3至4個,圖3給出了混音、提交的完整過程。

3混音、提交過程

3.特殊情況的處理

上面討論了混音及播放的一般過程,但在實際應用中,還需要到對一些特殊情況進行處理。

各通道中待混音的Wave數據長度不同。

...

圖4各通道中的Wave數據長度不同

這種情況是指當前要混音的某一通道中的聲音片段數據比Wave混音器所定義的緩沖區長度要小,這時該路被采樣的聲音沒有足夠的數據與Wave混音器中的數據相混疊。

對于這種情況,采用以下的方法可以有效地解決,主要包括三步:

a)Wave混音器在混音前首先判斷是否有這種情況出現,如果出現,Wave混音器必須確定該Wave通道中所能被采樣的數據長度;

b)按照該通道所能被采樣的數據長度,將該路的數據與其它多個通道中的數據相混疊存入Wave混音器的目的緩沖區中;

c)停止對該通道Wave數據的采樣混疊處理,只采樣混疊其它通道中的Wave數據,存入Wave混音器目的緩沖區的余下部分。

因為在接下來的采樣混音過程還會出現相同的情況,所以必須重復上述a-c的步驟,直到Wave混音器的緩沖區填充完畢或再沒有可填充的數據為止。這時將該Wave混音器的目的緩沖區提交給Wave輸出設備。

當播放混音數據時又有新的一路Wave數據要求混疊并且被播放。

當前正在播放Wave混音器中一個已經混疊的目的緩沖區中Wave數據,這時又有一路聲音要求馬上混疊并且被播放。

這種情況處理起來比較復雜。多路Wave數據經過混疊,存儲到目的緩沖區,該目的緩沖區中的Wave數據在提交給輸出設備前,是確定時長的。當有新的一路Wave數據要求加入時,Wave混音器必須要能確定目的緩沖區中的Wave數據已經播放到什么位置了,同時通知Wave播放設備當前所播放的Wave數據以及Wave設備播放隊列中的所有Wave數據不再有效,然后從該時間點起,重新采樣混疊各通道中余下未播放的Wave數據,采樣混疊過程中加入新的一路要求混疊的Wave數據,將重新混疊的Wave數據提交給Wave輸出設備,所有這一切必須在很短的時間完成,要不然用戶可能聽到聲音有中斷現象出現。而且這種方法中該重新采樣的時間點比較難定。

因此,對于這種情況還可以采用圖2所示的方法來處理,也能達到同樣的效果。這樣Wave混音器不用中斷Wave輸出當前所在播放的數據,只要重新處理一下Wave設備播放隊列中的Wave數據便可以了。

在混疊下一個目的緩沖區中數據時,包含進新的Wave數據。這種方法有一定的延時,延時的時間長度為,從重新混疊的數據提交到Wave設備的播放隊列中算起,直到該緩沖區的Wave數據被播放開始為止。如果定義輸出隊列的長度3個緩沖區,那么延時的長度最長也就2個緩沖區中的Wave數據播放長度,要是緩沖區的長度設置的非常短的話,這種延時一般是不容易聽出來的。

播放過程中中止其中某一路Wave數據的播放。

當正在播放多路Wave數據時,在某一通道中的Wave數據還未播放完成前,要求中止該通道中Wave數據的播放。對于這種情況的處理,與前面提到的情況(2)相似。Wave混音器首先確定當前緩沖區中Wave數據已經播放到什么位置,同時通知Wave播放設備當前所播放的Wave數據以及Wave設備播放隊列中的所有Wave數據不再有效,然后從該時間點起,重新混疊余下的未播放的Wave數據,但在采樣混疊過程不包括要求去除的Wave數據。

同樣當前播放位置的確定比較困難,所以實際中解決的方法基本同第二種情況中方法2相同,不過在進行后續的采樣混疊過程不是加入新的Wave數據,而是去除某一指定通道中的Wave數據。

4.結束語

該方法已經在實際中使用,因考慮到網絡中數據流量和系統的性能要求,話音數據的錄制與播放都采用了8位單聲道的格式,對于立體聲16位Wave數據的混音處理較復雜,有待作進一步的研究。

參考文獻

《MicrosoftCorporation.MicrosoftWindowsMultimediaProgrammer''''sReferce》MicrosoftPress1995

《AdvanceMultimediaProgramming》電子工業版社1995

《MicrosoftCorporation.MicrosoftWindowsAPIReferce》MicrosoftPress1999

主站蜘蛛池模板: 舒兰市| 凭祥市| 宿松县| 云安县| 霍林郭勒市| 关岭| 白城市| 邢台县| 伊金霍洛旗| 扬中市| 宣城市| 鹤山市| 长葛市| 胶南市| 上虞市| 阿拉善左旗| 义乌市| 甘孜| 会宁县| 大竹县| 临桂县| 寿阳县| 黄骅市| 察哈| 龙里县| 旺苍县| 莲花县| 偏关县| 阿瓦提县| 麻城市| 大宁县| 韶关市| 黑龙江省| 城市| 札达县| 大关县| 邵阳县| 土默特右旗| 敦化市| 宁明县| 洛浦县|