Bonjour
Après avoir longuement étudié les possibilités de faire la capture vidéo a partir d'une Webcam j'ai décide d'ulisé la dll DsShow.Net faite sur Code project.
Je lance mon appli , mon flux video s'initialise, j'ai un preview qui s'affiche dans un Panel et ensuite je peux Capturer et arreter la capture. Mon fichier s'enregistre bien ou je le souaite.
Mon souci: Si je souhaite relancer une capture ping ca plante : " impossible d'initialiser la flux vidéo " si je fais femer l'appli et que je la reouvre ca marche donc je pense que c un probleme du à l'allocation de mémoire . Quelqu'un parmi vous à deja eu ce genre de probleme.
Pourtant à la fin de ma capture je fais un clean up mais ca fait que dalle :
Voici quelque partie du code :
private bool StartCam()
{if( ! DsDev.GetDevicesOfCat( FilterCategory.VideoInputDevice, out capDevices ) )
{MessageBox.Show( this, @"Aucun périphérique de capture n'a été trouvé", "MinoCam", MessageBoxButtons.OK, MessageBoxIcon.Stop );
this.Close();
return false;}
Devi = null;if( capDevices.Count == 1 )Devi = capDevices[0] as DsDevice;else{this.ChoixDevice();}if( Devi == null){MessageBox.Show( this, @"Aucun périphérique de capture n'a été trouvé", "MinoCam", MessageBoxButtons.OK, MessageBoxIcon.Stop );this.Close(); return false;}if( ! StartupVideo( Devi.Mon ) )return false;return true;} bool StartupVideo( UCOMIMoniker mon ){int hr;try {if( ! CreateCaptureDevice( mon ) )return false;if( ! GetInterfaces() )return false;if( ! SetupGraph() )return false;if( ! SetupVideoWindow() )return false;#if DEBUGDsROT.AddGraphToRot( graphBuilder, out rotCookie );#endifhr = mediaCtrl.Run();if( hr < 0 )Marshal.ThrowExceptionForHR( hr );return true;}catch{MessageBox.Show( this, @"Impossible d'initialiser le flux vidéo", "MinoCam", MessageBoxButtons.OK, MessageBoxIcon.Stop );return false;}} Jusqu'a StepupGraph ca marche : IBaseFilter mux = null;IFileSinkFilter sink = null;bool SetupGraph(){int hr;try {hr = capGraph.SetFiltergraph( graphBuilder );if( hr < 0 )Marshal.ThrowExceptionForHR( hr );hr = graphBuilder.AddFilter( capFilter, "Ds.NET Video Capture Device" );if( hr < 0 )Marshal.ThrowExceptionForHR( hr );//DsUtils.ShowCapPinDialog( capGraph, capFilter, this.Handle );Guid cat = PinCategory.Preview;Guid med = MediaType.Video;hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, null ); // preview window// if( hr < 0 )// {// Marshal.ThrowExceptionForHR( hr );//// }return true;}catch(Exception e){MessageBox.Show( this, e.Message, "MinoCam", MessageBoxButtons.OK, MessageBoxIcon.Stop );return false;}finally{if( mux != null )Marshal.ReleaseComObject( mux ); mux = null;if( sink != null )Marshal.ReleaseComObject( sink ); sink = null;}} Et ca plante au niveau du RenderStream qui renvoie un entier < à 0.Pour libérer les ressources après ma capture j'utilise : void CloseInterfaces(){int hr;try {#if DEBUGif( rotCookie != 0 )DsROT.RemoveGraphFromRot( ref rotCookie );#endifif( mediaCtrl != null ){hr = mediaCtrl.Stop();mediaCtrl = null;}if( mediaEvt != null ){hr = mediaEvt.SetNotifyWindow( IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero );mediaEvt = null;}if( videoWin != null ){hr = videoWin.put_Visible( DsHlp.OAFALSE );hr = videoWin.put_Owner( IntPtr.Zero );videoWin = null;}if( capGraph != null )Marshal.ReleaseComObject( capGraph ); capGraph = null;if( graphBuilder != null )Marshal.ReleaseComObject(graphBuilder); graphBuilder = null;if( capFilter != null )Marshal.ReleaseComObject( capFilter ); capFilter = null;if( capDevices != null ){foreach( DsDevice d in capDevices )d.Dispose();capDevices = null;Devi.Mon = null;}}catch( Exception ){}} et : private void CleanUp(){if (mediaCtrl != null)mediaCtrl.Stop();//m_CurrentStatus = MediaStatus.Stopped;if (mediaEvt != null)mediaEvt.SetNotifyWindow(IntPtr.Zero, 0, IntPtr.Zero); if (capFilter != null) capFilter = null;if (mediaCtrl != null) mediaCtrl = null;if (mediaEvt != null) mediaEvt = null;//if (drainWin != null) drainWin = null;if (videoWin != null) videoWin = null;if (capGraph != null) capGraph = null;if (graphBuilder != null) graphBuilder = null;}
Alors quelqu'un aurait t-il la solution a mon probleme Merci
Partager