0

我正在尝试从采集卡中采集视频,并在窗口中以去隔行方式显示提要。

我正在使用 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

4

1 回答 1

0
  1. 包括 Deinterlace.h 是不够的。另外包括 Deinterlace_i.c - 另一个由 deinterlacer 的 IDL 生成的文件

  2. DScaler 不会连接到Preview输出引脚。它需要媒体样本(帧)上的时间戳,并且只有Capturepin 才能使用它们。用户捕获输出端,而不是预览。

DScaler 代码:

HRESULT CDeinterlaceFilter::Deinterlace(IMediaSample* pSource)
{
    CAutoLock l(&m_DeinterlaceLock);
    // ...
    // Get the input stream times
    if(FAILED(pSource->GetTime(&rtStart,&rtStop)))
    {
        return E_FAIL;
于 2013-08-07T05:48:28.753 回答