0

基本的には、オーディオをキャプチャしてディスク上のファイルに保存したいだけです。私は、AVI形式を使用するのが最善であり、煩わしさが最も少ないという結論に達しました。DirectShow APIをくぐり抜けた後、これが私が思いついたものです。

//I find the mic in previous code
hr = pMoniker->BindToObject(0, 0, IID_IBaseFilter, (void**)&pSrc);

hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&pGraph);
//Initialize the Capture Graph Builder
hr = pBuild->SetFiltergraph(pGraph);

IBaseFilter *pMux;
//IFileSinkFilter *pSink;
hr = pBuild->SetOutputFileName(
    &MEDIASUBTYPE_Avi,  // Specifies AVI for the target file.
    L"C:\\Example.avi", // File name.
    &pMux,              // Receives a pointer to the mux.
    NULL);              // (Optional) Receives a pointer to the file sink.


hr = pBuild->RenderStream(
    &PIN_CATEGORY_CAPTURE, // Pin category.
    &MEDIATYPE_Audio,      // Media type.
    pSrc,                  // Capture filter.
    NULL,                  // Intermediate filter (optional).
    pMux);                 // Mux or file sink filter.

今、私はこれで私が望むことを行うのに十分であると考えましたが、ディスク上にファイルは作成されず、RenderStreamは私にE_INVALDARGSを与えます。関数呼び出しを次のように変更した場合:

hr = pBuild->RenderStream(
    NULL, // Pin category.
NULL,      // Media type.
    pSrc,                  // Capture filter.
    NULL,                  // Intermediate filter (optional).
    pMux);                 // Mux or file sink filter.

代わりにVFW_E_NOT_IN_GRAPHエラーが発生します。

私はここで何が間違っているのですか?よろしくお願いします。よろしくお願いします。

4

1 に答える 1

1

VFW_E_NOT_IN_GRAPHpSrcこれは、呼び出しを使用して、作成したフィルターをフィルターグラフに追加する必要があることを意味しますIGraphBuilder::AddFilter

オーディオのみのストリームをファイルに保存するには、代わりに.WAV形式を使用することをお勧めします。WindowsSDKにはWavDest、オーディオフィルターからオーディオを受け入れ、ファイルFile Writer Filterに保存するのと互換性のある.WAVファイルストリームを出力できるプロジェクト/サンプルが付属しています。

于 2012-06-21T12:59:25.753 に答える