次の方法で共有


オーディオキャプチャグラフの作成

[このページに関連付けられている機能である DirectShow はレガシ機能です。 これは、MediaPlayerIMFMediaEngineメディア ファンデーションの Audio/Video Capture に置き換えられました。 これらの機能は、Windows 10 および Windows 11 用に最適化されています。 新しいコードでは、可能な場合は、DirectShow ではなく、MediaPlayerIMFMediaEngineメディア ファンデーションの Audio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存コードを、新しい API を使用するように可能であれば書き直すことを提案しています。]

オーディオ キャプチャ アプリケーションの最初のステップは、フィルター グラフを構築することです。 グラフの構成は、作成するファイルの種類によって異なります。

  • オーディオのみの AVI ファイル: オーディオ キャプチャ フィルターを AVI Mux フィルターに、AVI Mux を File Writer フィルターに。
  • WAV ファイル: オーディオ キャプチャ フィルターから WavDest フィルター サンプル へ、ファイル ライター フィルターへ
  • Windows Media Audio (.wma) ファイル: オーディオ キャプチャ フィルターから WM ASF ライター フィルターへ。

WavDest フィルターは SDK サンプルとして提供されます。 使用するには、フィルターを構築して登録する必要があります。

ASF ライター フィルターを使用するには、Windows Media SDK をインストールし、フィルターのロックを解除するためのソフトウェア キーを取得する必要があります。 詳細については、「DirectShow での Windows Media の使用」を参照してください。

フィルター グラフは、 Capture Graph Builder オブジェクトを使用して構築することも、グラフを「手動で」構築することもできます。つまり、アプリケーションで各フィルターをプログラム的に追加して接続します。 この記事では手動アプローチについて説明します。 キャプチャ グラフ ビルダーの使用に関する詳細については、「ビデオ キャプチャ」を参照してください。 この記事の情報の多くは、音声のみのグラフに適用されます。

オーディオキャプチャデバイスの追加

オーディオ キャプチャ フィルターは特定のハードウェア デバイスと通信するため、単に CoCreateInstance を呼び出してフィルターを作成することはできません。 代わりに、 システム デバイス列挙子 を使用して、クラス識別子 CLSID_AudioInputDeviceCategory によって識別される「オーディオ キャプチャ ソース」カテゴリ内のすべてのデバイスを列挙します。

システム デバイス列挙子は、デバイスのモニカのリストを返します。各モニカのフレンドリ名は、デバイスの名前に対応しています。 返されたモニカの 1 つを選択し、それを使用してそのデバイスのオーディオ キャプチャ フィルターのインスタンスを作成します。 フィルター グラフにフィルターを追加します。 ユーザーが好むオーディオ録音デバイスがモニカ リストの最初に表示されます。 (ユーザーは、コントロール パネルの [サウンドとマルチメディア] をクリックして、優先デバイスを選択します。)

詳細については、「システム デバイス列挙子の使用」を参照してください。

どの入力をキャプチャするかを指定するには、オーディオ キャプチャ フィルタから IAMAudioInputMixer インターフェイスを取得し、put_Enable メソッドを呼び出して入力を指定します。 ただし、この方法の 1 つの制限は、異なるハードウェア デバイスが入力を識別するために異なる文字列を使用する可能性があることです。 たとえば、あるカードではマイク入力を識別するために「Microphone」を使用し、別のカードでは「Mic」を使用する場合があります。 特定の入力の文字列識別子を決定するには、Windows マルチメディア関数 waveOutOpenmixerOpen、および mixerGetLineInfoを使用します。 詳細については、 ミキサーデバイスクエリ を参照してください。

マルチプレクサとファイルライターの追加

オーディオ キャプチャ グラフには、マルチプレクサとファイル ライターが含まれている必要があります。

マルチプレクサ は、1 つ以上のストリームを特定の形式の単一のストリームに結合するフィルタです。 たとえば、AVI Mux フィルターは、オーディオ ストリームとビデオ ストリームをインターリーブされた AVI ストリームに結合します。 オーディオ キャプチャの場合、通常はオーディオ ストリームは 1 つだけですが、オーディオ データはディスクに保存できる形式にパッケージ化する必要があり、そのためにはマルチプレクサが必要です。 マルチプレクサの選択はターゲット形式によって異なります。

  • 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.

この例では、「CLSID によるフィルターの追加」で説明されている AddFilterByCLSID 機能と、「2 つのフィルターの接続」で説明されている ConnectFilters 機能を使用します。 どちらも DirectShow API ではありません。

オーディオキャプチャー