C++ DirectShow IGraphBuilder呈现错误0x80040218(VFW_E_无法呈现)

C++ DirectShow IGraphBuilder呈现错误0x80040218(VFW_E_无法呈现),c++,directshow,C++,Directshow,我有以下问题: 在Windows7上,我尝试将*.mp3文件的内容加载到内存中,然后使用IGraphBuilder播放。如果我没有运行特定的应用程序,这将非常有效。但是,如果我打开了BSPlayer并打开了*.avi文件或游戏,IGraphBuilder将不再渲染*.mp3内存。但是,如果我运行Winamp,则不会发生这种情况 我不明白为什么会发生这种情况,我怀疑DirectShow的输入引脚都被使用了?但当我一起运行GraphEdt或类似的应用程序时,它们都并行地工作,播放*.avi文件或*.

我有以下问题:

在Windows7上,我尝试将*.mp3文件的内容加载到内存中,然后使用IGraphBuilder播放。如果我没有运行特定的应用程序,这将非常有效。但是,如果我打开了BSPlayer并打开了*.avi文件或游戏,IGraphBuilder将不再渲染*.mp3内存。但是,如果我运行Winamp,则不会发生这种情况

我不明白为什么会发生这种情况,我怀疑DirectShow的输入引脚都被使用了?但当我一起运行GraphEdt或类似的应用程序时,它们都并行地工作,播放*.avi文件或*.mp3文件,所以我的程序中肯定有什么地方做错了。你能帮我一下吗

我有两个类:CMemStream和CMemReader,基于MSWindows7.1SDK的示例

class CMemReader: public CAsyncReader
CMemReader没有做很多工作,它只是初始化基类CAsyncReader

CMemStream实现SetPointer、Read、Size、Alignment、Lock和Unlock方法

以下是简化的代码:

IGraphBuilder *m_pGraphBuilder;
CMemStream *m_pMemStream;
CMemReader *m_pMemReader;

BYTE *m_pMemData = new BYTE[lSize];
// ... Fill in m_pMemData with the contents of an *.mp3 file
// lSize is the size of the file

m_pMemStream = new CMemStream(m_pMemData, lSize);

CMediaType mediaType;
mediaType.majortype = MEDIATYPE_Stream;
mediaType.subtype = MEDIASUBTYPE_MPEG1Audio;

HRESULT hResult;
m_pMemReader = new CMemReader(m_pMemStream, &mediaType, &hResult);

CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&m_pGraphBuilder);

m_pGraphBuilder->AddFilter(m_pMemReader, NULL);
m_pMemReader->AddRef();
m_pGraphBuilder->Render(m_pMemReader->GetPin(0)); // THIS IS WHERE IT FAILS!
// The error is 0x80040218 (VFW_E_CANNOT_RENDER): No combination of filters could be found to render the stream.
我也尝试过将针脚连接在一起,如下所示:

IBaseFilter *pFilter;
CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pFilter);

m_pGraphBuilder->AddFilter(pFilter, NULL);

IEnumPins *pEnumPins;
IPin *pPin;
pFilter->EnumPins(&pEnumPins);
pEnumPins->Next(1, &pPin, 0);

m_pGraphBuilder->Connect(m_pMemReader->GetPin(0), pPin); // THIS IS WHERE IT ALSO FAILS!
// The error is 0x80040217 (VFW_E_CANNOT_CONNECT): No combination of intermediate filters could be found to make the connection.
我还尝试了CMediaType的类型和子类型的不同组合,但都不起作用


如果你有任何想法或建议,如果你能发现问题,请让我知道。谢谢大家!

与其渲染,不如尝试添加一个MPEG-I流拆分器的实例并自己连接管脚。无论如何,渲染最终都会这样做,但您可以得到一个更有意义的错误代码。或者,它可能很好,您排除了自己的过滤器。原因是这个BSPlayer临时注册了一些东西,或者是音频输出硬件的独家使用等等。感谢Roman的想法。排除我自己的过滤器是什么意思?正如您所说,我尝试创建一个CLSID_MPEG1Splitter实例,然后枚举它的管脚。我得到了PINDIR_输入引脚,但没有任何输出引脚。即使我显式使用findpinludio和&pMPEGStreamSplitterPinOut也不行。现在可能是什么问题?我发现一个线程说要重新注册quartz.dll。现在,当我尝试在BSPlayer运行时渲染mp3时,我得到0x8004025C VFW_E_UNSUPPORTED_音频:无法播放音频流:音频格式不受支持错误。我仍然无法获取CLSID_MPEG1拆分器的输出引脚。注意:如果我渲染mp3 BSPlayer未运行,那么,如果我枚举CLSID_MPEG1拆分器管脚,我将获得输出管脚。但是,如果渲染不成功,我将无法获得管脚。另外,在成功调用Render之前,我没有得到它们……我不确定BSPlayer正在做什么,但如果它以上述方式影响你的应用程序,那么最好的办法可能是卸载它。我不明白手动添加MPEG1拆分器的部分:可以连接输入吗?你们能看到输出引脚吗?这很重要,你不需要在到达那里之前渲染。哇,再次感谢你,罗曼!在将源连接到MPEG流拆分器插脚后,我可以获得MPEG流拆分器输出插脚。但是,我无法将此输出引脚连接到CLSID_CMpegAudioCodec的输入。我想我使用的编解码器不对吧?我得到的错误是VFW\u E\u无法连接。
IBaseFilter *pFilter;
CoCreateInstance(CLSID_DSoundRender, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pFilter);

m_pGraphBuilder->AddFilter(pFilter, NULL);

IEnumPins *pEnumPins;
IPin *pPin;
pFilter->EnumPins(&pEnumPins);
pEnumPins->Next(1, &pPin, 0);

m_pGraphBuilder->Connect(m_pMemReader->GetPin(0), pPin); // THIS IS WHERE IT ALSO FAILS!
// The error is 0x80040217 (VFW_E_CANNOT_CONNECT): No combination of intermediate filters could be found to make the connection.