使用IFileSourceFilter添加文件源

时间:2013-07-21 10:48:46

标签: c++ filter directshow atl

我正在编写一个将文件源连接到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”,我遇到了几个构建错误。在这种情况下可以做些什么。

请帮助我朝正确的方向前进!!

谢谢,
希亚姆

2 个答案:

答案 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对于简单的应用程序也会更容易。