2010-11-06 39 views
1

如何使用Direct Show.net库制作屏幕截图视频? 我读取msdn直接显示文件,并找到在以下代码中更改视频源设备的方式。 此代码将webcamera作为视频设备。如何使用Direct Show.net库制作截屏视频?

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; 
} 

回答

2

你需要一个过滤器捕获屏幕,并发送视频往下流。在DirectShow SDK中有一个称为PushSource的示例过滤器,里面有PushSourceDesktop。编译它并作为源过滤器插入到图形中。

+0

我发现PushSourceDestop并编译,我会得到PushSourceDestop.obj。如何将它插入我的项目和图表?我是这个新手。谢谢 – 2010-11-08 09:14:36

0

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."); 
    } 
}