Skip to main content.

Monday, May 21, 2007

DirectShowオーディオキャプチャでのWavファイル出力(その2)

前回の続きでDirectShowでのオーディオキャプチャプログラミングのサンプルです。前回のGraphEditで確認した機能を実際にプログラミングします。DirectShowのキャプチャー関連のプログラムでは、ICaptureGraphBuilder2インターフェイスを使用するのが簡単というか一般的のようですが、今回は単純に前回のGraphEditのグラフをそのままのグラフでプログラミングしました。参考サイトのいろいろなサンプルプログラムを利用、あるいは参考にして作成しました。インターフェースの使用方法等の詳細は参考リンク(MSDN)を参照して下さい。以下のグラフとメインプログラムを見ていただくと、グラフがそのままのプログラムになっているのがイメージ出来るかと思います。

プログラムとしては単純なコンソールアプリケーションです。マイク(オーディオ入力)からの音声を録音してwavファイルに出力します。開始でメッセージボックスで中断しますのでそこで音声を入力します。メッセージボックスの中断解除で終了します。

GraphEditでのグラフ


メインプログラム
//
// メイン関数
//
int _tmain(int argc, _TCHAR* argv[])
{
    HRESULT hr;

    // COMを初期化
    CoInitialize(NULL);

    // FilterGraphを生成
    IGraphBuilder *pGraphBuilder = NULL;
    CoCreateInstance(CLSID_FilterGraph,NULL,CLSCTX_INPROC,IID_IGraphBuilder,(LPVOID *)&pGraphBuilder);

    // グラフ構築の一連の処理
    // 入力デバイス(ここではマイクが接続されていることを想定)をグラフに追加
    IBaseFilter *pDeviceFilter = NULL;
    hr = AddAudioInputDevice(pGraphBuilder,&pDeviceFilter);
    if(FAILED(hr)){
        return hr;
    }

    // WavDestをグラフに追加
    GUID CLSID_WavDest;
    UuidFromString((RPC_CSTR)"3C78B8E2-6C4D-11D1-ADE2-0000F8754B99", &CLSID_WavDest);

    IBaseFilter *pWavDest = NULL;
    hr = AddFilter(pGraphBuilder, CLSID_WavDest , L"Wav Dest", &pWavDest);
    if(FAILED(hr)){
        printf("WavDestフィルターが追加出来ません。\n");
        return hr;
    }

    // FileWriterをグラフに追加
    IBaseFilter *pFileWriter = NULL;
    hr = AddFilter(pGraphBuilder, CLSID_FileWriter, L"Writer", &pFileWriter);

    // 各フィルターを接続する
    // オーディオ入力 → WavDest
    hr = ConnectFilters(pGraphBuilder, pDeviceFilter,pWavDest);
    // WavDest → FileWriter
    hr = ConnectFilters(pGraphBuilder, pWavDest,pFileWriter);
    // ここまででグラフ構築完了


    // ファイル名を設定する
    IFileSinkFilter *pSink;
    pFileWriter->QueryInterface(IID_IFileSinkFilter2,(VOID**)&pSink);
    pSink->SetFileName(WAVFILE_NAME_L, NULL);
    pSink->Release();

    // 出力ファイルを一応削除する
    DeleteFile(WAVFILE_NAME);

    // MediaControlインターフェース取得
    IMediaControl *pMediaControl = NULL;
    pGraphBuilder->QueryInterface(IID_IMediaControl,(LPVOID *)&pMediaControl);
 
    // 録音開始
    pMediaControl->Run();

    // 録音終了待ち
    MessageBox(NULL,"終了待ち","録音",MB_OK);

    // 録音終了
    pMediaControl->Stop();

    // 終了処理
    pMediaControl->Release();
    pDeviceFilter->Release();
    pWavDest->Release();
    pFileWriter->Release();
    pGraphBuilder->Release();

    CoUninitialize();

    return 0;
}

プログラム全体の表示

ソースファイル一式
プロジェクトファイル一式(Visual C++ 2005 Express Editionで作成)

参考リンク
オーディオ キャプチャ(Microsoft DirectX 9.0)
キャプチャ アプリケーションの書き方(※Microsoft DirectX 8.0のドキュメントです)

Windowsプログラミング関連記事