DirectShow IGraphBuilder呈现错误0x80040218(VFW_E_CANNOT_RENDER)

时间:2015-04-25 20:18:39

标签: c++ directshow

我有以下问题:

在Windows 7上,我尝试在内存中加载* .mp3文件的内容,然后使用 IGraphBuilder 播放它。如果我没有运行某些应用程序,这很有效。但是,如果我打开了带有* .avi文件或打开游戏的BSPlayer, IGraphBuilder 将不再呈现* .mp3内存。如果我有Winamp正在运行,这不会发生。

我不明白为什么会这样,我怀疑DirectShow的输入引脚都被使用了?但是当我一起运行GraphEdt或类似的应用程序时,它们都可以工作(并行播放* .avi文件或* .mp3文件),所以我的程序中必定会出现错误。你能帮帮我吗?

我有两个类: CMemStream CMemReader ,基于MS Windows 7.1 SDK的样本。

class CMemReader: public CAsyncReader

CMemReader 做得不多,它只是初始化基类 CAsyncReader

class CMemStream: public CAsyncStream

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 的类型和子类型的不同组合,但都没有用。

如果您有任何想法或建议,如果您发现问题,请告诉我。谢谢!

0 个答案:

没有答案