我正在编写一个将文件源连接到MPEG4s DMO的Directshow应用程序
图表如下:
文件来源 - > DMO包装过滤器 - >视频渲染器。
以下是我的问题:
1.如何在图表中添加文件源过滤器?我得到了这段代码,其中包括graphedit plus生成的代码。这段代码是否正确?我看到它使用需要“atlbase.h”的“CComPtr”。使用VS2010 Express版本时,我没有atl标题。
LPCOLESTR srcFile1 = L"C:\\Users\shyam\\Downloads\\sample.avi";
CComPtr<IBaseFilter> pBaseFilter;
hr = pBaseFilter.CoCreateInstance(CLSID_AsyncReader);
CComQIPtr<IFileSourceFilter> pFileSourceFilter = pBaseFilter;
ATLASSERT(pFileSourceFilter);
pFileSourceFilter->Load(srcFile1, NULL);
hr = pGB->AddFilter(pBaseFilter, L"File Source (Async.)");
2。我从网上手动下载了“atlbase.h”,我遇到了几个构建错误。在这种情况下可以做些什么。
请帮助我朝正确的方向前进!!
谢谢,
希亚姆
答案 0 :(得分:0)
上面生成的代码是正确的。要摆脱编译错误,请下载并安装最新的Windows sdk。它应该有正确的atl标题。
答案 1 :(得分:0)
可以为没有ATL的Directshow编写C ++代码,但除非你喜欢spagetti泄漏,否则我强烈不推荐它。这是你的代码看起来像什么
IBaseFilter* pBaseFilter;
CoCreateInstance(CLSID_AsyncReader, NULL, CLSCTX_INPROC_SERVER, IID_IBaseFilter, (void**)&pBaseFilter);
IFileSourceFilter* pFileSourceFilter = NULL;
hr = pBaseFilter->QueryInterface(IID_IFileSourceFilter, (void**)&pFileSourceFilter);
ASSERT(pFileSourceFilter != NULL);
hr = pFileSourceFilter->Load(L"C:\\Users\shyam\\Downloads\\sample.avi", NULL);
if (pFileSourceFilter)
pFileSourceFilter->Release();
hr = pFileSourceFilter->AddFilter(pBaseFilter, L"AsyncReader");
您还需要在每个步骤检查hr是否存在错误。 最新的Windows SDK可能没有所有的Directshow接口,因此我建议使用适用于Windows Vista的Microsoft Windows SDK更新(适用于qedit.h)。但严重的是,请不要在没有ATL的情况下编写Directshow或COM代码,即使是c#中的DirectshowLib对于简单的应用程序也会更容易。