前言:本站為你精心整理了實時混音網(wǎng)絡(luò)通信探析范文,希望能為你的創(chuàng)作提供參考價值,我們的客服老師可以幫助你提供個性化的參考范文,歡迎咨詢。
摘要本文主要討論多路聲音實時混疊的實現(xiàn)方法,以及實現(xiàn)過程中對一些特殊情況的處理。關(guān)鍵詞Wave混音混音器
1.引言
將多個Wave文件或多路Wave數(shù)據(jù)同時在Wave設(shè)備上輸出,就可同時聽到多個不同的聲音,達(dá)到混音的效果。如果是將多個不同端點的話音數(shù)據(jù)經(jīng)局域網(wǎng)絡(luò)傳輸?shù)竭_(dá)某一個端點再經(jīng)該端點的Wave設(shè)備輸出,就能同時聽到多個人的話音,從而實現(xiàn)局域網(wǎng)絡(luò)中多方的話音交談。
在網(wǎng)絡(luò)上實現(xiàn)話音交談,特別強(qiáng)調(diào)實時性,要盡量保證話音的平滑、連續(xù),因此為了保證話音數(shù)據(jù)連續(xù),減少話音數(shù)據(jù)存儲帶來的延時,在具體實現(xiàn)中,話音的錄制和播放都不采用文件的形式,錄制和播放的話音數(shù)據(jù)都存在緩沖區(qū)中。在Windows系統(tǒng)中,一般情況下,高層Wave接口函數(shù)無法直接播放緩沖區(qū)中的話音數(shù)據(jù),而必須用底層函數(shù)來實現(xiàn),常用的是WindowsAPI中的Wave函數(shù)。將Wave數(shù)據(jù)在Wave設(shè)備上輸出使用的是WaveOutWrite函數(shù),但是該函數(shù)不支持多路Wave數(shù)據(jù)的同時播放,為了能達(dá)到多路Wave數(shù)據(jù)同時播放的效果,對緩沖區(qū)中多路Wave數(shù)據(jù)進(jìn)行必要的預(yù)處理后,再提交給Wave輸出設(shè)備播放。實現(xiàn)原理如圖1所示。
圖1多路Wave混音的實現(xiàn)原理
2.實現(xiàn)原理
實時地混音,就是將多路Wave數(shù)據(jù)進(jìn)行相互疊加處理到另一個目的緩沖區(qū),最終將該目的的緩沖區(qū)提交給Wave輸出設(shè)備。
將每一路Wave數(shù)據(jù)作為一個單獨通道,分別從每個通道取一數(shù)據(jù)片段,把取得的幾個數(shù)據(jù)片段相互疊加,然后存進(jìn)另外一個目的緩沖區(qū)中。為了便于處理,緩沖區(qū)通常采用數(shù)組的形式存放Wave數(shù)據(jù)。
如果話音數(shù)據(jù),采用采樣頻率1025Hz,8位單聲道的數(shù)據(jù)格式,那么一秒的話音數(shù)據(jù)量為11025個字節(jié)。
為了達(dá)到實時的效果,目的緩沖區(qū)通常都設(shè)置比較小,大約可存放1/8秒的話音數(shù)據(jù)量,對于前述的話音格式,目的緩沖區(qū)的大小為11025/8=1375個字節(jié)。
下面具體看一下Wave數(shù)據(jù)以數(shù)組形式存放時的混音過程。如圖2所示。
圖2多路Wave數(shù)據(jù)的疊加過程
假設(shè)有4路Wave數(shù)據(jù),目的緩沖區(qū)的大小為1378,混音子函數(shù)調(diào)用為Mixer(lpDest,rgpCDdata,4,1378)。
下面給出混音子函數(shù)的實現(xiàn)。其中l(wèi)pDest為目的緩沖區(qū),rgWaveSrc為多路Wave數(shù)據(jù)源,iNumWaves為Wave數(shù)據(jù)源的通道數(shù),wLen為目的緩沖區(qū)長度。
Voidmixit(LPSAMPLElpDest,LPSAMPLErgWaveSrc[],intiNumWaves,WORDwLen)
{int,,iSum;
WORDctr;
ctr=0
While(wLen)
{
iSum=128;/*靜音時數(shù)值為128*/
for(I=0;I<iNumWaves;I++)
iSum=iSum+*(rgWaveSrc[]+ctr)-128;
PEG(int)0,iSum,(int)225);/*對轉(zhuǎn)換結(jié)果處理*/
*lpDest++=iSum;
ctr++;
wLen--;
}
}
注意一點的是對于單聲道數(shù)據(jù)一個字節(jié)表示一個采樣值,采樣值在0-255之間,各個通道的對應(yīng)Wave數(shù)據(jù)相加后,就會溢出,還需要將相加結(jié)果轉(zhuǎn)換成0-255之間的數(shù)值。
將該目的緩沖區(qū)中的Wave數(shù)據(jù)經(jīng)WaveOutWrite函數(shù)輸出,就能同時聽到四個不同的聲音,當(dāng)Wave輸出設(shè)備播放完目的緩沖區(qū)中的數(shù)據(jù)便返回,請求用戶提供更多的Wave輸出數(shù)據(jù),因為Wave輸出設(shè)備只能輸出提交給它的Wave數(shù)據(jù);另外,對Wave數(shù)據(jù)進(jìn)行混音還需要一定的時間,因此當(dāng)提交一個目的緩沖區(qū)中的數(shù)據(jù)給Wave輸出設(shè)備后,就必須馬上混疊另一段Wave數(shù)據(jù)來提交給Wave輸出設(shè)備,作為下一個輸出的數(shù)據(jù)緩沖區(qū),避免聲音輸出的中斷,后一個目的緩沖區(qū)提交后被輸出設(shè)備放入輸出隊列中,當(dāng)?shù)谝粋€目的緩沖區(qū)中輸出完畢后再輸出它的數(shù)據(jù),當(dāng)輸出設(shè)備在輸出第二個目的緩沖區(qū)的數(shù)據(jù)時,又能將第三段數(shù)據(jù)混合進(jìn)第一個目的緩沖區(qū)中,然后重新提交,直到提交完所有的Wave數(shù)據(jù),那時就將停止輸出。在實際應(yīng)用中目的緩沖區(qū)的數(shù)要多個,一般為3至4個,圖3給出了混音、提交的完整過程。
3混音、提交過程
3.特殊情況的處理
上面討論了混音及播放的一般過程,但在實際應(yīng)用中,還需要到對一些特殊情況進(jìn)行處理。
各通道中待混音的Wave數(shù)據(jù)長度不同。
...
圖4各通道中的Wave數(shù)據(jù)長度不同
這種情況是指當(dāng)前要混音的某一通道中的聲音片段數(shù)據(jù)比Wave混音器所定義的緩沖區(qū)長度要小,這時該路被采樣的聲音沒有足夠的數(shù)據(jù)與Wave混音器中的數(shù)據(jù)相混疊。
對于這種情況,采用以下的方法可以有效地解決,主要包括三步:
a)Wave混音器在混音前首先判斷是否有這種情況出現(xiàn),如果出現(xiàn),Wave混音器必須確定該Wave通道中所能被采樣的數(shù)據(jù)長度;
b)按照該通道所能被采樣的數(shù)據(jù)長度,將該路的數(shù)據(jù)與其它多個通道中的數(shù)據(jù)相混疊存入Wave混音器的目的緩沖區(qū)中;
c)停止對該通道Wave數(shù)據(jù)的采樣混疊處理,只采樣混疊其它通道中的Wave數(shù)據(jù),存入Wave混音器目的緩沖區(qū)的余下部分。
因為在接下來的采樣混音過程還會出現(xiàn)相同的情況,所以必須重復(fù)上述a-c的步驟,直到Wave混音器的緩沖區(qū)填充完畢或再沒有可填充的數(shù)據(jù)為止。這時將該Wave混音器的目的緩沖區(qū)提交給Wave輸出設(shè)備。
當(dāng)播放混音數(shù)據(jù)時又有新的一路Wave數(shù)據(jù)要求混疊并且被播放。
當(dāng)前正在播放Wave混音器中一個已經(jīng)混疊的目的緩沖區(qū)中Wave數(shù)據(jù),這時又有一路聲音要求馬上混疊并且被播放。
這種情況處理起來比較復(fù)雜。多路Wave數(shù)據(jù)經(jīng)過混疊,存儲到目的緩沖區(qū),該目的緩沖區(qū)中的Wave數(shù)據(jù)在提交給輸出設(shè)備前,是確定時長的。當(dāng)有新的一路Wave數(shù)據(jù)要求加入時,Wave混音器必須要能確定目的緩沖區(qū)中的Wave數(shù)據(jù)已經(jīng)播放到什么位置了,同時通知Wave播放設(shè)備當(dāng)前所播放的Wave數(shù)據(jù)以及Wave設(shè)備播放隊列中的所有Wave數(shù)據(jù)不再有效,然后從該時間點起,重新采樣混疊各通道中余下未播放的Wave數(shù)據(jù),采樣混疊過程中加入新的一路要求混疊的Wave數(shù)據(jù),將重新混疊的Wave數(shù)據(jù)提交給Wave輸出設(shè)備,所有這一切必須在很短的時間完成,要不然用戶可能聽到聲音有中斷現(xiàn)象出現(xiàn)。而且這種方法中該重新采樣的時間點比較難定。
因此,對于這種情況還可以采用圖2所示的方法來處理,也能達(dá)到同樣的效果。這樣Wave混音器不用中斷Wave輸出當(dāng)前所在播放的數(shù)據(jù),只要重新處理一下Wave設(shè)備播放隊列中的Wave數(shù)據(jù)便可以了。
在混疊下一個目的緩沖區(qū)中數(shù)據(jù)時,包含進(jìn)新的Wave數(shù)據(jù)。這種方法有一定的延時,延時的時間長度為,從重新混疊的數(shù)據(jù)提交到Wave設(shè)備的播放隊列中算起,直到該緩沖區(qū)的Wave數(shù)據(jù)被播放開始為止。如果定義輸出隊列的長度3個緩沖區(qū),那么延時的長度最長也就2個緩沖區(qū)中的Wave數(shù)據(jù)播放長度,要是緩沖區(qū)的長度設(shè)置的非常短的話,這種延時一般是不容易聽出來的。
播放過程中中止其中某一路Wave數(shù)據(jù)的播放。
當(dāng)正在播放多路Wave數(shù)據(jù)時,在某一通道中的Wave數(shù)據(jù)還未播放完成前,要求中止該通道中Wave數(shù)據(jù)的播放。對于這種情況的處理,與前面提到的情況(2)相似。Wave混音器首先確定當(dāng)前緩沖區(qū)中Wave數(shù)據(jù)已經(jīng)播放到什么位置,同時通知Wave播放設(shè)備當(dāng)前所播放的Wave數(shù)據(jù)以及Wave設(shè)備播放隊列中的所有Wave數(shù)據(jù)不再有效,然后從該時間點起,重新混疊余下的未播放的Wave數(shù)據(jù),但在采樣混疊過程不包括要求去除的Wave數(shù)據(jù)。
同樣當(dāng)前播放位置的確定比較困難,所以實際中解決的方法基本同第二種情況中方法2相同,不過在進(jìn)行后續(xù)的采樣混疊過程不是加入新的Wave數(shù)據(jù),而是去除某一指定通道中的Wave數(shù)據(jù)。
4.結(jié)束語
該方法已經(jīng)在實際中使用,因考慮到網(wǎng)絡(luò)中數(shù)據(jù)流量和系統(tǒng)的性能要求,話音數(shù)據(jù)的錄制與播放都采用了8位單聲道的格式,對于立體聲16位Wave數(shù)據(jù)的混音處理較復(fù)雜,有待作進(jìn)一步的研究。
參考文獻(xiàn)
《MicrosoftCorporation.MicrosoftWindowsMultimediaProgrammer''''sReferce》MicrosoftPress1995
《AdvanceMultimediaProgramming》電子工業(yè)版社1995
《MicrosoftCorporation.MicrosoftWindowsAPIReferce》MicrosoftPress1999