程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 波形捕捉:(7)“捕捉緩沖區”特效

波形捕捉:(7)“捕捉緩沖區”特效

編輯:關於C++

在 Windows XP 中,有兩種可以作為內核級的實現方式的“捕捉緩沖區 ”特效是可行的:

·回聲消除(AEC)

·降噪

不支持其它DMOs中的特效(諸如那些被用於緩沖區渲染的效果)。

DirectSoundFullDuplexCreate8函數和 IDirectSoundCapture8::CreateCaptureBuffer 方法都以一個表明 DSCEFFECTDESC 結構體數組(該數組用於表示想要的特效)地址的 DSCBUFFERDESC結構體作為參數。但是,如果你想利用微軟的實現方式你必須通 過 DirectSoundFullDuplexCreate8 創建一個捕捉緩沖區。你也必須使用該函數 創建輔助聲音緩沖區。如果不這樣做,那特效就無法實現。

在每個 DSCEFFECTDESC 結構體的 dwFlags 成員中,你必須指定 DSCFX_LOCHARDWARE 或 DSCFX_LOCSOFTWARE。在大多數情況下,指定 DSCFX_LOCSOFTWARE。如果特效在指定的位置不可行,那麼緩沖區創建失敗。

特效由 DSCEFFECTDESC 結構體中的 guidDSCFXClass 成員來標識。在 guidDSCFXInstance 成員中指定 DSCFX_MS_AEC或 DSCFX_MS_NS 就可以得到微軟 的軟件實現方式。要想在硬件或軟件上使用其它可行的實現方式,就得從制造商 那裡獲取類和實例GUID。

當緩沖區被創建之後,你可以通過 IDirectSoundCaptureBuffer8::GetFXStatus 方法獲取特效的信息。

AEC主要利於那些用於一端到另一端進行語音交流的應用程序。由A區域麥克 風發出的信號從B區域的喇叭中輸出,同時被B區域的麥克風接收。不使用AEC的 話,這個信號就又會被發送回A區域。導致回聲也可能是囂叫。AEC通過在每個區 域監控輸入信號(以整個房間的環境作為考慮因素對輸入信號進行調整,將它從 當前正在輸出的信號中排除)克服了這個問題。它同時也除去了任何由本地電腦 播放著的聲音(比如音樂),從而通過網絡傳輸的語音將不會受干擾。

AEC在操作系統內核級別上實現並且全局使用這種效果。它有如下限制:

·同一時刻只能有一個捕捉緩沖區使用AEC。

·如果其它應用程序正在捕捉或播放音頻,那麼AEC就不能被啟動。如 果AEC已經啟動了,其它任何應用程序要捕捉聲音都會使用AEC。

·不管輸入輸出的格式如何,內核混音器都以16位 mono格式處理聲音 。這樣的結果是聲音質量可能會下降。以16位 mono格式捕捉聲音是為了減少對 處理器的使用。

·當AEC正在被使用時,所有DirectSound設備上的硬件回聲都會失效 ,這將會影響到其它共享了該設備的用戶的體驗。

·AEC參數的變化將會影響所有正在運行的應用程序。

·AEC無法在有些組合聲效卡和驅動程序的情況下使用。應用程序應該 始終提供用戶關閉AEC的功能。

·在操作系統版本上主要是Windows XP SP1,AEC無法在使用USB喇叭的 情況下工作,也無法在那些提供不同時鐘頻率的捕捉和渲染的機器上工作。

·如果音效環境改變,適配過濾器將會花費2秒或以上的時間進行調節 。

·任何出現在原始聲音信號後128毫秒以上的後期混響將不會從正在輸 出的信號中除去。

在具有這個效果的捕捉緩沖區上,使用 IDirectSoundCaptureFXAec8接口來 設置和得到AEC參數。你也可以允許噪音來填充。(一種用於防止在輸出信號中 沒有新數據時而產生完全的寂靜)

降噪特效只有在AEC被啟用的情況下才能被使用。降噪捕捉效果除去頻繁的背 景噪音,諸如風扇噪音。使用 IDirectSoundCaptureFXNoiseSuppress8接口來設 置和獲取參數。

通過使用 IDirectSoundCaptureBuffer8::GetObjectInPath 方法從捕捉緩沖 區對象中得到特效接口。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved