2016-12-14 4 views
0

ビデオにテキストをオーバーレイする必要があります。DirectShow接続フィルタ

私の変更:ソース - > SampleGrabber - >コンプレッサー - >マルチプレクサ(out_fileパラ)

SetOutputFileNameとソースを追加します。

public void Start(object compr) 
     { 
      ICaptureGraphBuilder2 gb = new CaptureGraphBuilder2() as ICaptureGraphBuilder2; 
      IBaseFilter mux; 
      IFileSinkFilter sink; 
      Guid MEDIASUBTYPE_Avi = new Guid(0xe436eb88, 0x524f, 0x11ce, 0x9f, 0x53, 0x00, 0x20, 0xaf, 0x0b, 0xa7, 0x70); 
      gb.SetOutputFileName(MEDIASUBTYPE_Avi, 
        out_file, out mux, out sink); 

      IGraphBuilder gbi; 
      gb.GetFiltergraph(out gbi).Check(); 
      f_fg = gbi as IFilterGraph2; 
      IBaseFilter src; 
      f_fg.AddSourceFilter(path_file, "Source", out src).Check(); 

フィルタSampleGrabberを追加して、ソースとの接続:

 Type comType = Type.GetTypeFromCLSID(new Guid("C1F400A0-3F08-11d3-9F0B-006008039E37")); 
     ISampleGrabber sampleGrabber = (ISampleGrabber)Activator.CreateInstance(comType); 
     f_fg.AddFilter((IBaseFilter)sampleGrabber, "samplegrabber").Check(); 
     AMMediaType mediaType = new AMMediaType(); 
     mediaType.majorType = MediaType.Video; 
     mediaType.subType = MediaSubType.RGB24; 
     mediaType.formatType = FormatType.VideoInfo; 
     sampleGrabber.SetMediaType(mediaType); 
     sampleGrabber.SetCallback(this, 1); 

     // connect filters src-->SampleGrabber 
     gbi.ConnectFilters(src, (IBaseFilter)sampleGrabber); 

フィルタを追加コンプレッサーと開始RenderStream:

IBaseFilter compressor = ((DShowFilterInfo)compr).CreateFilter(); 
    f_fg.AddFilter(compressor, "Compressor").Check(); 
gb.RenderStream(null, null, (IBaseFilter)sampleGrabber, compressor, mux).Check(); 

(f_fg as IMediaFilter).SetSyncSource(IntPtr.Zero).Check(); 
(f_fg as IMediaControl).Run(); 
} 

public int BufferCB(double sampleTime, IntPtr buffer, int bufferLen) 
{ 
    return 0; 
} 

ビデオout_fileは開いていません(1秒間の再生と黒いウィンドウのみ)。どうして?

+0

が.RUN(IMediaControlとしてf_fg)()の結果は何ですか?ミキサーの代わりにビデオレンダラーを使用してグラフを作成して、それが機能するかどうか確認することもできますか? – VuVirt

答えて

0

上記のコードは、私はちょうどレンダリング呼び出しの後に忘れてしまった...正しく動作:

(f_fg as IMediaControl).Stop(); 
関連する問題