2010-11-06 14 views
1

Comment faire une capture d'écran vidéo en utilisant Direct Show.net Library? J'ai lu msdn Afficher le document et trouver le moyen de changer le périphérique source vidéo dans le code suivant. Ce code a obtenu webcamera comme appareil vidéo.Comment faire une capture d'écran vidéo en utilisant Direct Show.net Library?

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

Répondre

2

Vous avez besoin d'un filtre qui capture l'écran et envoie la vidéo sur le flux. Dans DirectShow SDK, il existe un exemple de filtre appelé PushSource et à l'intérieur PushSourceDesktop. Compilez-le et insérez-le dans votre graphique en tant que filtre source.

+0

Je trouve PushSourceDestop et compile que j'obtiendrai PushSourceDestop.obj. Comment l'insérer dans mon projet et dans le graphique? Je suis novice avec ça. Je vous remercie –

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