如何使用Direct Show.net库制作屏幕捕获视频?
如何使用Direct Show.net库制作屏幕捕获视频? 我阅读了msdn Direct show文档,并在下面的代码中找到了更改视频源设备的方法。 此代码将网络摄像机作为视频设备如何使用Direct Show.net库制作屏幕捕获视频?,.net,directshow,video-capture,.net,Directshow,Video Capture,如何使用Direct Show.net库制作屏幕捕获视频? 我阅读了msdn Direct show文档,并在下面的代码中找到了更改视频源设备的方法。 此代码将网络摄像机作为视频设备 public IBaseFilter FindCaptureDevice() { int hr = 0; IEnumMoniker classEnum = null; IMoniker[] moniker = new IMoniker[1]; object source = null; /
public IBaseFilter FindCaptureDevice()
{
int hr = 0;
IEnumMoniker classEnum = null;
IMoniker[] moniker = new IMoniker[1];
object source = null;
// Create the system device enumerator
ICreateDevEnum devEnum = (ICreateDevEnum) new CreateDevEnum();
// Create an enumerator for the video capture devices
hr = devEnum.CreateClassEnumerator(FilterCategory.VideoInputDevice, out classEnum,0);
DsError.ThrowExceptionForHR(hr);
// The device enumerator is no more needed
Marshal.ReleaseComObject(devEnum);
// If there are no enumerators for the requested type, then
// CreateClassEnumerator will succeed, but classEnum will be NULL.
if (classEnum == null)
{
throw new ApplicationException("No video capture device was detected.\r\n\r\n" +
"This sample requires a video capture device, such as a USB WebCam,\r\n" +
"to be installed and working properly. The sample will now close.");
}
if (classEnum.Next (moniker.Length, moniker, IntPtr.Zero) == 0)
{
Guid iid = typeof(IBaseFilter).GUID;
moniker[0].BindToObject(null, null, ref iid, out source);
}
else
{
throw new ApplicationException("Unable to access video capture device!");
}
Marshal.ReleaseComObject(moniker[0]);
Marshal.ReleaseComObject(classEnum);
return (IBaseFilter) source;
}
嗯
您需要一个过滤器来捕获屏幕并沿流发送视频。在DirectShowSDK中有一个名为PushSource的示例过滤器,其中有PushSourceDesktop。编译它并将其作为源过滤器插入到图形中。我找到PushSourceDestop并编译,得到PushSourceDestop.obj。如何将其插入到我的项目和图表中?我是新手。非常感谢。
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.");
}
}