3

DSpackには、DirectShow互換のビデオデバイスを再生し、ビデオフレームを同時にキャプチャするためのサンプルコードがあります。TVideoWindowは、ビデオ(Firgure-1)を表示するためにFilterGraphに接続されています。TVideoWindowを削除すると、オペレーティングシステム(Windows)は自動的にActiveMovieを起動し、別のウィンドウにビデオを表示します(図-2)。

DSPackを使用して、GUIコンポーネントを使用せずに、またビデオを表示せずにビデオフレームをキャプチャする方法はありますか?

DSPackフォーラムには、NullRendererフィルターについての言及がいくつかありますが、その使用方法に関するドキュメントや例はありません。GraphEditで直接ビデオレンダラーをヌルレンダーに手動で置き換えると、それを達成できるようです(図-3)。

コード内ですべての操作を行うことにより、図3に示す結果をどのように達成できますか?DSPackは、ヌルレンダラーを作成する方法を説明していません。

Figure-1: The graph of the default example code

図1

Figure-2: Shows what happens if I remove the TVideoWindow

図-2

Figure-3: Shows what happens if I replace Video Renderer with a 
         Null Renderer and manually connect them in the GraphEdit. 

図-3

これは私がやったことです(これまでのところ)

ReassignSampleGrabberOutput直前に以下に電話してくださいfilterGraph.Play;

procedure TForm1.ReassignSampleGrabberOutput;
var
  nullRenderer : IBaseFilter;
  nullRendererPins: IEnumPins;
  nullRendererPin : IPin;
  graph:   IGraphBuilder;
begin

  nullRenderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;
  FilterGraph1.QueryInterface(IID_IGraphBuilder, graph);
  graph.AddFilter(nullRenderer, 'Null Renderer');

  nullRenderer.EnumPins(nullRendererPins);

  nullRendererPins.Reset;

  if nullRendererPins.Next(1, nullRendererPin, nil) = S_OK then
  begin
    //SampleGrabber1.OutPutPin.Disconnect;
    //SampleGrabber1.OutPutPin.Connect(nullRendererPin, nil);

    graph.Disconnect(SampleGrabber1.OutPutPin);
    graph.FindFilterByName('Video Renderer', filter);
    graph.RemoveFilter(filter);
    graph.Connect(SampleGrabber1.OutPutPin, nullRendererPin);

  end;
end;
4

1 に答える 1

6

Null Renderer Filter標準のフィルター/クラスです。コードでは、それをインスタンス化し(CoCreateInstance)、グラフに追加し、その入力ピンをサンプルグラバーの接続されていない出力ピンに接続する必要があります。

Delphi / DSCupでは、次のようになります。

Renderer := CreateComObject(CLSID_NullRenderer) as IBaseFilter;

于 2012-10-01T20:35:43.670 に答える