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
Figure-2: Shows what happens if I remove the TVideoWindow
Figure-3: Shows what happens if I replace Video Renderer with a
Null Renderer and manually connect them in the GraphEdit.
これは私がやったことです(これまでのところ)
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;