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_ic.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出力ピンに接続しません。メディア サンプル (フレーム) にタイム スタンプが必要であり、Captureピンだけがそれらを利用できます。プレビューではなく、ユーザー キャプチャ出力レッグ。

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 に答える