如何使用DirectShow正确捕获音频

How to properly Capture Audio with DirectShow

本文关键字:音频 何使用 DirectShow      更新时间:2023-10-16

基本上,我只想捕获音频并将其保存到磁盘上的文件中。我得出结论,使用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错误。

我在这里做错了什么?如果有任何帮助,我将不胜感激,提前感谢!

VFW_E_NOT_IN_GRAPH意味着您需要使用IGraphBuilder::AddFilter调用将创建的pSrc过滤器添加到过滤器图中。

要将纯音频流保存到文件中,您可能更喜欢.WAV格式,Windows SDK附带WavDest项目/示例,它可以接受来自音频过滤器的音频,并输出与File Writer Filter兼容的.WAV文件流以保存到文件。