キャプチャ カードからビデオをキャプチャし、インターレースを解除してウィンドウにフィードを表示しようとしています。
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 です。