• <sub id="h4knl"><ol id="h4knl"></ol></sub>
    <sup id="h4knl"></sup>
      <sub id="h4knl"></sub>

      <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
      1. <strong id="h4knl"></strong>

      2. 實時混音的實現(xiàn)

        時間:2024-06-23 00:12:18 計算機畢業(yè)論文 我要投稿
        • 相關推薦

        實時混音的實現(xiàn)

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

        1.引言?

          將多個Wave文件或多路Wave數(shù)據(jù)同時在Wave設備上輸出,就可同時聽到多個不同的聲音,達到混音的效果。如果是將多個不同端點的話音數(shù)據(jù)經(jīng)局域網(wǎng)絡傳輸?shù)竭_某一個端點再經(jīng)該端點的Wave設備輸出,就能同時聽到多個人的話音,從而實現(xiàn)局域網(wǎng)絡中多方的話音交談。?

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

        圖1 多路Wave混音的實現(xiàn)原理

        2.實現(xiàn)原理?

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

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

        如果話音數(shù)據(jù),采用采樣頻率1025Hz,8位單聲道的數(shù)據(jù)格式,那么一秒的話音數(shù)據(jù)量為11025個字節(jié)。?

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

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

        圖2 多路Wave數(shù)據(jù)的疊加過程

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

        下面給出混音子函數(shù)的實現(xiàn)。其中l(wèi)pDest為目的緩沖區(qū),rgWaveSrc為多路Wave數(shù)據(jù)源,iNumWaves為Wave數(shù)據(jù)源的通道數(shù),wLen為目的緩沖區(qū)長度。?

        Void mixit(LPSAMPLE lpDest,LPSAMPLE rgWaveSrc[],intiNumWaves,WORDwLen)?

        {?int,,iSum;?

        WORD ctr;

        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);/*對轉換結果處理?*/?

        *lpDest =iSum;?

        ctr ;?

        wLen--;?

        }?

        }

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

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

        3 混音、提交過程

        3.特殊情況的處理?

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

        ●各通道中待混音的Wave數(shù)據(jù)長度不同。?

        ...

        圖4 各通道中的Wave數(shù)據(jù)長度不同

        這種情況是指當前要混音的某一通道中的聲音片段數(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)相同的情況,所以必須重復上述a-c的步驟,直到Wave混音器的緩沖區(qū)填充完畢或再沒有可填充的數(shù)據(jù)為止。這時將該Wave混音器的目的緩沖區(qū)提交給Wave輸出設備。?

        ●當播放混音數(shù)據(jù)時又有新的一路Wave數(shù)據(jù)要求混疊并且被播放。?

        當前正在播放Wave混音器中一個已經(jīng)混疊的目的緩沖區(qū)中Wave數(shù)據(jù),這時又有一路聲音要求馬上混疊并且被播放。?

        這種情況處理起來比較復雜。多路Wave數(shù)據(jù)經(jīng)過混疊,存儲到目的緩沖區(qū),該目的緩沖區(qū)中的W

        【實時混音的實現(xiàn)】相關文章:

        基于幀的實時話音變換技術與DSP實現(xiàn)03-07

        射頻功率放大器實時檢測的實現(xiàn)03-19

        基于FPGA的實時SAR成像系統(tǒng)轉置存儲的實現(xiàn)03-07

        基于USB總線的實時數(shù)據(jù)采集系統(tǒng)設計與實現(xiàn)03-19

        用Borland C 3.1實現(xiàn)外設與Windows應用程序實時通信03-21

        用EP7211實現(xiàn)傳呼信息實時語音合成和播放03-19

        基于Vxworks實時操作系統(tǒng)的串口通信程序設計與實現(xiàn)03-18

        建立實時企業(yè)的策略分析03-20

        遠程實時審計淺探03-24

        国产高潮无套免费视频_久久九九兔免费精品6_99精品热6080YY久久_国产91久久久久久无码
      3. <sub id="h4knl"><ol id="h4knl"></ol></sub>
        <sup id="h4knl"></sup>
          <sub id="h4knl"></sub>

          <sub id="h4knl"><ol id="h4knl"><em id="h4knl"></em></ol></sub><s id="h4knl"></s>
          1. <strong id="h4knl"></strong>

          2. 亚洲色精品三区二区一区 | 亚洲国产资源动态gif | 亚洲不打码视频在线看 | 热久久国产欧美一区二区精品 | 亚洲AⅤ综合在线欧美一区 亚洲另类sm视频在线观看 | 在线天堂网新版 |