- 相關(guān)推薦
實(shí)時(shí)混音的實(shí)現(xiàn)
摘要 本文主要討論多路聲音實(shí)時(shí)混疊的實(shí)現(xiàn)方法,以及實(shí)現(xiàn)過(guò)程中對(duì)一些特殊情況的處理。關(guān)鍵詞 Wave 混音 混音器?1.引言?
將多個(gè)Wave文件或多路Wave數(shù)據(jù)同時(shí)在Wave設(shè)備上輸出,就可同時(shí)聽到多個(gè)不同的聲音,達(dá)到混音的效果。如果是將多個(gè)不同端點(diǎn)的話音數(shù)據(jù)經(jīng)局域網(wǎng)絡(luò)傳輸?shù)竭_(dá)某一個(gè)端點(diǎn)再經(jīng)該端點(diǎn)的Wave設(shè)備輸出,就能同時(shí)聽到多個(gè)人的話音,從而實(shí)現(xiàn)局域網(wǎng)絡(luò)中多方的話音交談。?
在網(wǎng)絡(luò)上實(shí)現(xiàn)話音交談,特別強(qiáng)調(diào)實(shí)時(shí)性,要盡量保證話音的平滑、連續(xù),因此為了保證話音數(shù)據(jù)連續(xù),減少話音數(shù)據(jù)存儲(chǔ)帶來(lái)的延時(shí),在具體實(shí)現(xiàn)中,話音的錄制和播放都不采用文件的形式,錄制和播放的話音數(shù)據(jù)都存在緩沖區(qū)中。在Windows系統(tǒng)中,一般情況下,高層Wave接口函數(shù)無(wú)法直接播放緩沖區(qū)中的話音數(shù)據(jù),而必須用底層函數(shù)來(lái)實(shí)現(xiàn),常用的是Windows API中的Wave函數(shù)。將Wave數(shù)據(jù)在Wave設(shè)備上輸出使用的是WaveOutWrite函數(shù),但是該函數(shù)不支持多路Wave數(shù)據(jù)的同時(shí)播放,為了能達(dá)到多路Wave數(shù)據(jù)同時(shí)播放的效果,對(duì)緩沖區(qū)中多路Wave數(shù)據(jù)進(jìn)行必要的預(yù)處理后,再提交給Wave輸出設(shè)備播放。實(shí)現(xiàn)原理如圖1所示。?
圖1 多路Wave混音的實(shí)現(xiàn)原理
2.實(shí)現(xiàn)原理?
實(shí)時(shí)地混音,就是將多路Wave數(shù)據(jù)進(jìn)行相互疊加處理到另一個(gè)目的緩沖區(qū),最終將該目的的緩沖區(qū)提交給Wave輸出設(shè)備。?
將每一路Wave數(shù)據(jù)作為一個(gè)單獨(dú)通道,分別從每個(gè)通道取一數(shù)據(jù)片段,把取得的幾個(gè)數(shù)據(jù)片段相互疊加,然后存進(jìn)另外一個(gè)目的緩沖區(qū)中。為了便于處理,緩沖區(qū)通常采用數(shù)組的形式存放Wave數(shù)據(jù)。
如果話音數(shù)據(jù),采用采樣頻率1025Hz,8位單聲道的數(shù)據(jù)格式,那么一秒的話音數(shù)據(jù)量為11025個(gè)字節(jié)。?
為了達(dá)到實(shí)時(shí)的效果,目的緩沖區(qū)通常都設(shè)置比較小,大約可存放1/8秒的話音數(shù)據(jù)量,對(duì)于前述的話音格式,目的緩沖區(qū)的大小為11025/8=1375個(gè)字節(jié)。?
下面具體看一下Wave數(shù)據(jù)以數(shù)組形式存放時(shí)的混音過(guò)程。如圖2所示。
圖2 多路Wave數(shù)據(jù)的疊加過(guò)程
假設(shè)有4路Wave數(shù)據(jù),目的緩沖區(qū)的大小為1378,混音子函數(shù)調(diào)用為 Mixer(lpDest,rgpCDdata,4,1378)。?
下面給出混音子函數(shù)的實(shí)現(xiàn)。其中l(wèi)pDest為目的緩沖區(qū),rgWaveSrc為多路Wave數(shù)據(jù)源,iNumWaves為Wave數(shù)據(jù)源的通道數(shù),wLen為目的緩沖區(qū)長(zhǎng)度。?
Void mixit(LPSAMPLE lpDest,LPSAMPLE rgWaveSrc[],intiNumWaves,WORDwLen)?
{?int,,iSum;?
WORD ctr;
ctr=0?
While(wLen)?
{?
iSum=128;/?*靜音時(shí)數(shù)值為128?*/?
for(I=0;I<iNumWaves;I )?
iSum=iSum *(rgWaveSrc[] ctr)-128;?
PEG(int)0,iSum,(int)225);/*對(duì)轉(zhuǎn)換結(jié)果處理?*/?
*lpDest =iSum;?
ctr ;?
wLen--;?
}?
}
注意一點(diǎn)的是對(duì)于單聲道數(shù)據(jù)一個(gè)字節(jié)表示一個(gè)采樣值,采樣值在0-255之間,各個(gè)通道的對(duì)應(yīng)Wave數(shù)據(jù)相加后,就會(huì)溢出,還需要將相加結(jié)果轉(zhuǎn)換成0-255之間的數(shù)值。?
將該目的緩沖區(qū)中的Wave數(shù)據(jù)經(jīng)WaveOutWrite函數(shù)輸出,就能同時(shí)聽到四個(gè)不同的聲音,當(dāng)Wave輸出設(shè)備播放完目的緩沖區(qū)中的數(shù)據(jù)便返回,請(qǐng)求用戶提供更多的Wave輸出數(shù)據(jù),因?yàn)閃ave輸出設(shè)備只能輸出提交給它的Wave數(shù)據(jù);另外,對(duì)Wave數(shù)據(jù)進(jìn)行混音還需要一定的時(shí)間,因此當(dāng)提交一個(gè)目的緩沖區(qū)中的數(shù)據(jù)給Wave輸出設(shè)備后,就必須馬上混疊另一段Wave數(shù)據(jù)來(lái)提交給Wave輸出設(shè)備,作為下一個(gè)輸出的數(shù)據(jù)緩沖區(qū),避免聲音輸出的中斷,后一個(gè)目的緩沖區(qū)提交后被輸出設(shè)備放入輸出隊(duì)列中,當(dāng)?shù)谝粋(gè)目的緩沖區(qū)中輸出完畢后再輸出它的數(shù)據(jù),當(dāng)輸出設(shè)備在輸出第二個(gè)目的緩沖區(qū)的數(shù)據(jù)時(shí),又能將第三段數(shù)據(jù)混合進(jìn)第一個(gè)目的緩沖區(qū)中,然后重新提交,直到提交完所有的Wave數(shù)據(jù),那時(shí)就將停止輸出。在實(shí)際應(yīng)用中目的緩沖區(qū)的數(shù)要多個(gè),一般為3至4個(gè),圖3給出了混音、提交的完整過(guò)程。
3 混音、提交過(guò)程
3.特殊情況的處理?
上面討論了混音及播放的一般過(guò)程,但在實(shí)際應(yīng)用中,還需要到對(duì)一些特殊情況進(jìn)行處理。
●各通道中待混音的Wave數(shù)據(jù)長(zhǎng)度不同。?
...
圖4 各通道中的Wave數(shù)據(jù)長(zhǎng)度不同
這種情況是指當(dāng)前要混音的某一通道中的聲音片段數(shù)據(jù)比Wave混音器所定義的緩沖區(qū)長(zhǎng)度要小,這時(shí)該路被采樣的聲音沒有足夠的數(shù)據(jù)與Wave混音器中的數(shù)據(jù)相混疊。?
對(duì)于這種情況,采用以下的方法可以有效地解決,主要包括三步:?
a) Wave混音器在混音前首先判斷是否有這種情況出現(xiàn),如果出現(xiàn),Wave混音器必須確定該Wave通道中所能被采樣的數(shù)據(jù)長(zhǎng)度;?
b) 按照該通道所能被采樣的數(shù)據(jù)長(zhǎng)度,將該路的數(shù)據(jù)與其它多個(gè)通道中的數(shù)據(jù)相混疊存入Wave混音器的目的緩沖區(qū)中;?
c) 停止對(duì)該通道Wave數(shù)據(jù)的采樣混疊處理,只采樣混疊其它通道中的Wave數(shù)據(jù),存入Wave混音器目的緩沖區(qū)的余下部分。?
因?yàn)樵诮酉聛?lái)的采樣混音過(guò)程還會(huì)出現(xiàn)相同的情況,所以必須重復(fù)上述a-c的步驟,直到Wave混音器的緩沖區(qū)填充完畢或再?zèng)]有可填充的數(shù)據(jù)為止。這時(shí)將該Wave混音器的目的緩沖區(qū)提交給Wave輸出設(shè)備。?
●當(dāng)播放混音數(shù)據(jù)時(shí)又有新的一路Wave數(shù)據(jù)要求混疊并且被播放。?
當(dāng)前正在播放Wave混音器中一個(gè)已經(jīng)混疊的目的緩沖區(qū)中Wave數(shù)據(jù),這時(shí)又有一路聲音要求馬上混疊并且被播放。?
這種情況處理起來(lái)比較復(fù)雜。多路Wave數(shù)據(jù)經(jīng)過(guò)混疊,存儲(chǔ)到目的緩沖區(qū),該目的緩沖區(qū)中的W
【實(shí)時(shí)混音的實(shí)現(xiàn)】相關(guān)文章:
適應(yīng)實(shí)時(shí)多任務(wù)的微控制器高效指令支持05-29
嵌入式實(shí)時(shí)網(wǎng)絡(luò)通信技術(shù)淺析論文(精選7篇)07-26
基于J2EE的遠(yuǎn)動(dòng)系統(tǒng)Web實(shí)時(shí)曲線的研究05-11
都市頻道制作網(wǎng)的設(shè)計(jì)與實(shí)現(xiàn)05-29
飛機(jī)艙音背景聲特征實(shí)時(shí)分析系統(tǒng)開發(fā)及應(yīng)用05-05
基于minigui的網(wǎng)真機(jī)界面的實(shí)現(xiàn)08-05
城市旅游網(wǎng)站的設(shè)計(jì)與實(shí)現(xiàn)論文(精選6篇)05-07
企業(yè)知識(shí)管理的實(shí)現(xiàn)技術(shù)和工具的電商論文05-02