How to make screen capture video using Direct Show.net Library?

拟墨画扇 提交于 2019-12-03 09:10:55

You need a filter which captures screen and sends the video down the stream. In DirectShow SDK there is a sample filter called PushSource and inside there is PushSourceDesktop. Compile it and insert into your graph as a source filter.

Prince OfThief

OK,

public void CaptureVideo()
{
  int hr = 0;
  IBaseFilter sourceFilter = null;
  IBaseFilter audiosourceFilter = null;
  IBaseFilter asfWriter = null;
  IFileSinkFilter pTmpSink = null;

  try
  {

    GetInterfaces();
    hr = this.captureGraphBuilder.SetFiltergraph(this.graphBuilder);
    DsError.ThrowExceptionForHR(hr);

    sourceFilter = FindVideoCaptureDevice(); //return Video source filter
    audiosourceFilter = FindAudioCaptureDevice(); // return audio source filter

    // Add Video source filter
    hr = this.graphBuilder.AddFilter(sourceFilter, "Video Capture");
    DsError.ThrowExceptionForHR(hr);
    // Add audio source filter
    hr = this.graphBuilder.AddFilter(audiosourceFilter,"Audio Capture");
    DsError.ThrowExceptionForHR(hr);

    //set outputname "Test.avi" .avi type
    hr = this.captureGraphBuilder.SetOutputFileName(MediaSubType.Avi, "Test.avi", out asfWriter, out pTmpSink);
    DsError.ThrowExceptionForHR(hr);

    //render preview video on window form
    hr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Video, sourceFilter, null, null);
    DsError.ThrowExceptionForHR(hr);

    //render Audio preview   
    //hr = this.captureGraphBuilder.RenderStream(PinCategory.Preview, MediaType.Audio, audiosourceFilter, null, null);
    //DsError.ThrowExceptionForHR(hr);

    // Render Video to Test.avi
    hr = this.captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Video, sourceFilter, null, asfWriter);
    Marshal.ThrowExceptionForHR(hr);
    // Render Audio into Test.avi
    hr = this.captureGraphBuilder.RenderStream(PinCategory.Capture, MediaType.Audio, audiosourceFilter, null, asfWriter);
    Marshal.ThrowExceptionForHR(hr);


    Marshal.ReleaseComObject(sourceFilter);
    Marshal.ReleaseComObject(audiosourceFilter);

    SetupVideoWindow();


    rot = new DsROTEntry(this.graphBuilder);


    hr = this.mediaControl.Run();
    DsError.ThrowExceptionForHR(hr);


    this.currentState = PlayState.Running;
  }
  catch
  {
    MessageBox.Show("An unrecoverable error has occurred.");
  }
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!