我正在尝试从采集卡中采集视频,并在窗口中以去隔行方式显示提要。
我正在使用 Dscaler 的 Deinterlace 过滤器(http://deinterlace.sourceforge.net/Filter.htm)。我通过以下方式注册了过滤器(Deinterlace.ax)
regsvr32.exe Deinterlace.ax
然后我尝试从 Microsoft 的 Directshow 示例中修改“playcap”。我获取了 Deinterlace 的源代码并复制了“Deinterlace.h”(其中包含过滤器的定义)并将其放入项目中。
在 CaptureVideo 函数中,我尝试了 QueryInterface 过滤器。
CComPtr<IBaseFilter> pDeinterlace;
hr = g_pGraph->QueryInterface(IID_IDeinterlace, (LPVOID *) &pDeinterlace);
if (FAILED(hr)) {
return hr;
}
编译时出现链接错误:
error LNK1120: 1 unresolved externals
error LNK2001: unresolved external symbol _IID_IDeinterlace
这些是我的包括:
#include <windows.h>
#include <atlbase.h>
#include <dshow.h>
#include <stdio.h>
#include <strsafe.h>
#include <streams.h>
#include <comdef.h>
#include <iostream>
#include "Deinterlace.h"
对于库和目录,我只包含了 Directshow。如果没有 Deinterlace 过滤器代码,程序编译得很好。
我不确定如何正确包含过滤器(因为我找不到关于此的教程)。我不确定我应该将 Deinterlace.ax 文件放在哪里(或将其重命名为 Deinterlace.dll?)。
提前致谢!
编辑
以上已由 Roman R 解决,将 Deinterlace_i.c 添加到项目中。
我有另一个问题。我是 Directshow 的新手,我了解基本原理,但我无法成功查询界面,并将去隔行过滤器附加到图形的其余部分。
理想情况下,我想:
Source Capture (preview) -> Deinterlace Filter -> Video Render
我试图从图中查询接口,但我没有运气,它会失败:
hr = g_pGraph->QueryInterface(IID_IDeinterlace, (LPVOID*) &g_pDeinterlace);
if(FAILED(hr)) { // Fails here
Msg(TEXT("Failed"));
return hr;
}
hr = g_pGraph->AddFilter((IBaseFilter*)g_pDeinterlace, L"Deinterlace");
if(FAILED(hr)) {
Msg(TEXT("Failed in adding filter"));
return hr;
}
g_pDeinterlace->put_IsOddFieldFirst(VARIANT_FALSE);
不知何故,我需要它来连接来自源的引脚
// somehow pSrcFilter connects to pDeinterlace
hr = g_pCapture->RenderStream (&PIN_CATEGORY_PREVIEW, &MEDIATYPE_Video,
g_pDeinterlace, NULL, NULL);
我可以让整个事情在 GraphEdit 中工作,但编写代码是 c