如何使用直接显示和 C# 使用文本叠加进行视频录制

本文关键字:叠加 文本 视频 何使用 显示 | 更新日期: 2023-09-27 18:36:20

根据我之前的帖子,我尝试使用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. 没有办法在录制视频时添加叠加文本?

如何使用直接显示和 C# 使用文本叠加进行视频录制

在录制过程中添加文本覆盖的最佳方法是实现 DMO 或 DirectShow 转换筛选器。我更喜欢DMO,因为它更简单,你可以稍后在MediaFoundation中重用它。

将 RGB24 或 RGB32 设置为 DMO/滤镜的输入类型,然后可以使用 GDI 在每帧上绘制所需的内容。

在图形中,它看起来像这样:VideoSource -> DMO -> ASF Writer