回送錄製
在回送模式中,WASAPI 的用戶端可以擷取轉譯端點裝置正在播放的音訊數據流。 若要在回送模式開啟資料流,客戶端必須:
- 取得轉譯端點裝置的 IMMDevice 介面。
- 在轉譯端點裝置上的回送模式中初始化擷取數據流。
遵循這些步驟之後,用戶端可以呼叫 IAudioClient::GetService 方法來取得轉譯端點裝置上的 IAudioCaptureClient 介面。
WASAPI 提供回送模式,主要是支援聲場回音取消(AEC)。 不過,其他類型的音訊應用程式可能會發現回送模式很適合用來擷取音訊引擎正在播放的系統混合。
在擷取數據流的程式代碼範例中,可以輕鬆地修改 RecordAudioStream 函式來設定回送模式擷取數據流。 必要的修改如下:
- 在 IMMDeviceEnumerator::GetDefaultAudioEndpoint 方法的呼叫中,將第一個參數 (dataFlow) 從 eCapture 變更為 eRender。
- 在呼叫 IAudioClient::Initialize 方法時,將第二個參數的值從 0 變更為 AUDCLNT_STREAMFLAGS_LOOPBACK。
在 Windows 10 1703 之前的 Windows 版本中,提取模式擷取用戶端在以事件驅動緩衝初始化並啟用回送時,不會收到任何事件。 若要解決此問題,請在事件驅動模式中初始化轉譯數據流。 每次用戶端收到轉譯數據流的事件時,它都必須向擷取客戶端發出訊號,以執行從擷取端點緩衝區讀取下一組範例的擷取線程。 在 Windows 10 版本 1703 和更新版本中,支援事件驅動回送用戶端,而且不再需要涉及轉譯數據流的因應措施。
用戶端只能針對共用模式數據流啟用回送模式(AUDCLNT_SHAREMODE_SHARED)。 獨佔模式數據流無法在回送模式中運作。
WASAPI 的回送實作取決於硬體的功能。 如果硬體支持轉譯端點上的回送針腳,WASAPI 會針對回送數據流使用此針腳上提供的音訊。 當硬體不支援回送接點時,WASAPI 除了將音訊數據複製到硬體轉譯針腳之外,也會將音訊引擎的輸出數據流複製到回送應用程式的擷取緩衝區。
某些硬體廠商會在音訊適配卡中實作回送裝置(而不是在轉譯裝置上釘選實例)。 雖然硬體回送裝置的運作方式與 WASAPI 回送模式類似,但可能更難使用。
硬體回送裝置對音訊應用程式有下列缺點:
- 並非所有音訊配接器都有回送裝置。 因此,相依於它們的應用程式將無法在所有系統上運作。
- 用戶必須先識別回送裝置並啟用回送裝置,才能從回送裝置記錄。
不同的廠商將不同的名稱指派給其硬體回送裝置。 下列名稱為範例:
- 立體聲混合
- Waveout Mix
- 混合輸出
- 您聽到的內容
缺少標準化名稱可能會導致使用者在裝置名稱清單中難以識別回送裝置。
硬體回送裝置是擷取裝置。 因此,如果配接器支援回送裝置,音訊應用程式可以從裝置錄製,就像它從任何其他擷取裝置記錄一樣。
例如,如果您選取硬體回送裝置做為預設擷取裝置,則可以在擷取 Stream 中的程式碼範例中使用 RecordAudioStream 函式,從裝置擷取數據流。 (您也可以使用舊版音訊 API,例如 Windows 多媒體 waveInXxx 函式,從裝置擷取數據流。
如果您的音訊配接器包含硬體回送裝置,您可以使用 Windows 多媒體控制面板,Mmsys.cpl,將裝置指定為預設擷取裝置。 步驟如下:
若要執行Mmsys.cpl,請開啟 [命令提示字元] 視窗,然後輸入下列命令:
control mmsys.cpl
或者,您可以以滑鼠右鍵按下位於任務欄右側的通知區域中的喇叭圖示,然後選取 [錄製裝置],以執行Mmsys.cpl。
開啟 [Mmsys.cpl] 視窗之後,以滑鼠右鍵單擊錄製裝置清單中的任何位置,並確認 已核取 [顯示已停用的裝置 ] 選項。 (否則,如果回送裝置已停用,它就不會出現在清單中。
瀏覽錄製裝置清單以找出回送裝置(如果有的話)。 如果回送裝置已停用,請以滑鼠右鍵按兩下裝置並按下 [啟用],以啟用它。
最後,若要選取回送裝置做為預設擷取裝置,請以滑鼠右鍵按兩下裝置,然後按兩下 [ 設定為預設裝置]。
WASAPI 支援回送錄製,無論音訊硬體是否包含回送裝置,或使用者是否已啟用裝置。
Windows Vista 提供數位版權管理(DRM)。 內容提供者依賴DRM來保護其專屬音樂或其他內容,避免未經授權的複製和其他非法用途。 同樣地,受信任的音訊驅動程式不允許回送裝置擷取包含受保護內容的數位串流。 Windows Vista 只允許受信任的驅動程式播放受保護的內容。 如需受信任驅動程式和DRM的詳細資訊,請參閱 Windows DDK 檔。
WASAPI 回送預設包含播放的所有音訊混合,不論音訊源自的終端機服務會話為何。 例如,您可以在會話 0 中執行的服務中執行回送用戶端,並從所有用戶會話擷取音訊,以及從會話 0 播放音訊。
從 Windows 10 組建 20348 開始,您可以在呼叫 IMMDevice::Activate 中傳遞 AUDIOCLIENT_ACTIVATION_PARAMS ,以包含或排除特定進程及其子系從回送擷取。 請參閱應用程式回送音訊擷取範例。
遠端桌面允許將音訊重新導向至用戶端。 這是藉由建立只針對該會話顯示的新音訊裝置來實作。
相關主題