我有以下问题:
在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 的类型和子类型的不同组合,但都没有用。
如果您有任何想法或建议,如果您发现问题,请告诉我。谢谢!