Basiclly我只想捕获音频并将其保存到磁盘上的文件中。我使用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错误。
我在这里做错了什么?我非常感谢任何帮助,提前谢谢!
答案 0 :(得分:1)
VFW_E_NOT_IN_GRAPH
表示您需要使用pSrc
调用将您创建的IGraphBuilder::AddFilter
过滤器添加到过滤器图表中。
要将纯音频流保存到文件中,您可能希望更喜欢.WAV格式,Windows SDK附带WavDest
项目/示例,它可以接受来自音频过滤器的音频并输出兼容的.WAV文件流File Writer Filter
保存到文件中。