0

私の以前の投稿によると、ビデオ ファイルからフレームを取得し、コールバック関数を呼び出す sampleGrabber を使用しようとしました。

Type comType = Type.GetTypeFromCLSID(new Guid("e436ebb3-524f-11ce-9f53-0020af0ba770"));
IGraphBuilder graphBuilder = (IGraphBuilder)Activator.CreateInstance(comType);

comType = Type.GetTypeFromCLSID(new Guid("C1F400A0-3F08-11d3-9F0B-006008039E37"));
ISampleGrabber sampleGrabber = (ISampleGrabber)Activator.CreateInstance(comType);

graphBuilder.AddFilter((IBaseFilter)sampleGrabber, "samplegrabber");

AMMediaType mediaType = new AMMediaType();
mediaType.majorType = MediaType.Video;
mediaType.subType = MediaSubType.RGB24;
mediaType.formatType = FormatType.VideoInfo;
sampleGrabber.SetMediaType(mediaType);

int hr = graphBuilder.RenderFile(@"D:\test.wmv", null);

IMediaEventEx mediaEvent = (IMediaEventEx)graphBuilder;
IMediaControl mediaControl = (IMediaControl)graphBuilder;
IVideoWindow videoWindow = (IVideoWindow)graphBuilder;
IBasicAudio basicAudio = (IBasicAudio)graphBuilder;

videoWindow.put_AutoShow(OABool.False);
basicAudio.put_Volume(-10000);

sampleGrabber.SetOneShot(false);
sampleGrabber.SetBufferSamples(true);

//the same object has implemented the ISampleGrabberCB interface.
//0 sets the callback to the ISampleGrabberCB::SampleCB() method.
sampleGrabber.SetCallback(this, 0);

mediaControl.Run();

EventCode eventCode;
mediaEvent.WaitForCompletion(-1, out eventCode);


Marshal.ReleaseComObject(sampleGrabber);
Marshal.ReleaseComObject(graphBuilder);

コールバック機能

   public int SampleCB ( double sampleTime, IMediaSample mediaSample )
   {
    //WHAT TO DO HERE.
   }
  1. 各フレームにオーバーレイを追加すると、ビデオ全体がオーバーレイ テキストと共に保存されるようにするには、コールバック関数で何をすればよいですか?

  2. ビデオの録画中にオーバーレイ テキストを追加する方法はありますか?

4

1 に答える 1

0

記録中にテキスト オーバーレイを追加する最良の方法は、DMOまたはDirectShow Transform-Filterを実装することです。DMO の方が簡単で、後で MediaFoundation で再利用できるため、私は DMO を好みます。

DMO/フィルターの入力タイプとして RGB24 または RGB32 を設定すると、各フレームに必要なものを GDI で描画できます。

グラフでは、次のようになりますVideoSource -> DMO -> ASF Writer

于 2012-06-05T08:17:54.790 に答える