建立音訊擷取圖表
[與此頁面相關的功能 DirectShow是舊版功能。 它已被 MediaPlayer、 IMFMediaEngine和 Media Foundation 中的音訊/視訊擷取取代。 這些功能已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用 MediaPlayer、 IMFMediaEngine 和 音訊/視訊擷取 ,而不是 DirectShow。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
音訊擷取應用程式的第一個步驟是建置篩選圖形。 圖形的組態取決於您要建立的檔案類型。
- 僅限音訊的 AVI 檔案:音訊擷取篩選至 AVI Mux 篩選,以及 AVI Mux 至 檔案寫入器 篩選。
- WAV 檔案:音訊擷取 篩選至 WavDest 篩選範例 至檔案寫入器篩選
- Windows Media Audio (.wma) 檔案:音訊擷取篩選至 WM ASF 寫入器 篩選。
WavDest 篩選準則是以 SDK 範例的形式提供。 若要使用它,您必須建置並註冊篩選準則。
若要使用 ASF 寫入器篩選器,您必須安裝 Windows 媒體 SDK 並取得軟體金鑰以解除鎖定篩選準則。 如需詳細資訊,請參閱 在 DirectShow 中使用 Windows 媒體。
您可以使用 擷取圖形產生器 物件來建置篩選圖形,或者您可以「手動」建置圖表;也就是說,讓應用程式以程式設計方式新增並連接每個篩選。 本文說明手動方法。 如需使用擷取圖形產生器的詳細資訊,請參閱 影片擷取。 該文章中大部分的資訊都適用于僅限音訊的圖表。
新增音訊擷取裝置
由於音訊擷取篩選器會與特定硬體裝置通訊,因此您不只要呼叫 CoCreateInstance 來建立篩選。 請改用 系統裝置列舉值 來列舉「音訊擷取來源」類別中的所有裝置,此類別識別碼是由類別識別碼CLSID_AudioInputDeviceCategory所識別。
系統裝置列舉值會傳回裝置的 Monikers 清單;每個 Moniker 的易記名稱都會對應到裝置的名稱。 選擇其中一個傳回的 Moniker,並用它來建立該裝置的音訊擷取篩選實例。 將篩選新增至篩選圖形。 使用者的慣用音訊錄製裝置會先出現在 Moniker 清單中。 (使用者按一下 主控台.) 中的 [音效] 和 [多媒體] 來選取慣用的裝置
如需詳細資訊,請參閱 使用系統裝置列舉值。
若要指定要從中擷取的輸入,請從音訊擷取篩選準則取得 IAMAudioInputMixer 介面,並呼叫 put_Enable 方法來指定輸入。 不過,此方法的其中一個限制是不同的硬體裝置可能會使用不同的字串來識別其輸入。 例如,一張卡片可能會使用「麥克風」來識別麥克風輸入,另一張卡片可能會使用「麥克風」。 若要判斷指定輸入的字串識別碼,請使用 Windows 多媒體函式 waveOutOpen、mixedOpen和 mixedGetLineInfo。 如需詳細資訊,請參閱 MSDN 主題 混合器裝置查詢 。
新增多工器和檔案寫入器
音訊擷取圖表必須包含多工器和檔案寫入器。
多工器是一種篩選,可將一或多個資料流程結合成具有特定格式的單一資料流程。 例如,AVI Mux 篩選會將音訊和視訊串流結合成交錯的 AVI 資料流程。 針對音訊擷取,通常只有單一音訊資料流程,但音訊資料仍必須封裝成可儲存至磁片的格式,這需要多工器。 多工器的選擇取決於目標格式:
- AVI:AVI 多工器
- WAV:WavDest
- WMA:ASF 寫入器
檔案寫入器是將傳入資料寫入檔案的篩選。 針對 AVI 或 WAV 檔案,請使用 檔案寫入器篩選。 針對 WMA 檔案,ASF 寫入器會同時做為多工器和檔案寫入器。
建立篩選並將它們新增至圖形之後,請將音訊擷取篩選器的輸出針腳連接到多工器的輸入針腳,並將多工器的輸出針腳連接到篩選寫入器的輸入針腳, (假設這些是個別的篩選) 。 若要指定檔案名,請查詢 IFileSinkFilter 介面的檔案寫入器,並呼叫 IFileSinkFilter::SetFileName 方法。
範例程式碼
下列範例示範如何使用 WavDest 篩選來建置音訊擷取圖表。 相同的原則適用于其他檔案類型。
IBaseFilter *pSrc = NULL, *pWaveDest = NULL, *pWriter = NULL;
IFileSinkFilter *pSink= NULL;
IGraphBuilder *pGraph;
// Create the Filter Graph Manager.
hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void**)&pGraph);
// This example omits error handling.
// Not shown: Use the System Device Enumerator to create the
// audio capture filter.
// Add the audio capture filter to the filter graph.
hr = pGraph->AddFilter(pSrc, L"Capture");
// Add the WavDest and the File Writer.
hr = AddFilterByCLSID(pGraph, CLSID_WavDest, L"WavDest", &pWaveDest);
hr = AddFilterByCLSID(pGraph, CLSID_FileWriter, L"File Writer", &pWriter);
// Set the file name.
hr = pWriter->QueryInterface(IID_IFileSinkFilter, (void**)&pSink);
hr = pSink->SetFileName(L"C:\\MyWavFile.wav", NULL);
// Connect the filters.
hr = ConnectFilters(pGraph, pSrc, pWaveDest);
hr = ConnectFilters(pGraph, pWaveDest, pWriter);
// Not shown: Release interface pointers.
此範例使用 AddFilterByCLSID
依 CLSID 新增篩選中所述的函式,以及 ConnectFilters
連接兩個篩選中所述的函式。 這兩者都不是 DirectShow API。
相關主題
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應