【问题标题】:Deinterlace filter in directshow applicationsdirectshow 应用程序中的去隔行过滤器
【发布时间】:2013-08-08 03:21:28
【问题描述】:

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

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

【问题讨论】:

  • 包含Deinterlace.h 是不够的。额外包含Deinterlace_i.c - 另一个由 deinterlacer 的 IDL 生成的文件。

标签: c++ windows filter linker directshow


【解决方案1】:
  1. 包含 Deinterlace.h 是不够的。另外包括 Deinterlace_i.c - 另一个由 deinterlacer 的 IDL 生成的文件

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

DScaler 代码:

HRESULT CDeinterlaceFilter::Deinterlace(IMediaSample* pSource)
{
    CAutoLock l(&m_DeinterlaceLock);
    // ...
    // Get the input stream times
    if(FAILED(pSource->GetTime(&rtStart,&rtStop)))
    {
        return E_FAIL;

【讨论】:

  • 我能够从 Graphedit 连接预览图钉,所以编码它不起作用是不同的?
  • 您应该也可以在代码中连接,但无论如何它不会在没有时间戳的情况下运行。
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多