none
請問為何C#中使用DirectShow,資源釋放後,再次連接Capture Filter會有問題? RRS feed

  • 問題

  • 真的很怪,試了好久,還是不知道該怎麼辦...有人可以給我一些方法嗎

    其中資源釋放的Code如下


      public void CloseInterfaces()
      {
       int hr;
       try
       {
        if( rotCookie != 0 )
             DsROT.RemoveGraphFromRot( ref rotCookie );

        if( mediaCtrl != null )
        {
         hr = mediaCtrl.Stop();
         if (hr<0) MessageBox.Show("無法關閉 MediaControl");
         mediaCtrl = null;
        }

        if( mediaEvt != null )
        {
         hr = mediaEvt.SetNotifyWindow( IntPtr.Zero, WM_GRAPHNOTIFY, IntPtr.Zero );
         if (hr<0) MessageBox.Show("無法關閉 MediaEvent");
         mediaEvt = null;
        }

        if( videoWin != null )
        {
         hr = videoWin.put_Visible( DsHlp.OAFALSE );
         if (hr<0) MessageBox.Show("無法設定 Video Window 為不可見");
         hr = videoWin.put_Owner( IntPtr.Zero );
         if (hr<0) MessageBox.Show("無法重設 Video Window 的 Owner");
         videoWin = null;
        }

        baseGrabFlt = null;
        if( sampGrabber != null )
        {
         hr = Marshal.ReleaseComObject( sampGrabber ); sampGrabber = null;
         if (hr<0) MessageBox.Show("Release Sample Grabber Fail.");
        }
        if( capGraph != null )
        {
         hr=Marshal.ReleaseComObject( capGraph ); capGraph = null;
         if (hr<0) MessageBox.Show("Release CaptureGraphBuilder Fail.");
        }
        if( graphBuilder != null )
        {
         hr = Marshal.ReleaseComObject( graphBuilder ); graphBuilder = null;
         if (hr<0) MessageBox.Show("Release Graph Builder Fail.");
        }
        if( capFilter != null )
        {
         hr = Marshal.ReleaseComObject( capFilter ); capFilter = null;
         if (hr<0) MessageBox.Show("Release Capture Filter Fail.");
        }
        if( capDevices != null )
        {
         foreach( DsDevice d in capDevices )
          d.Dispose();
         capDevices = null;
        }
       }
       catch( Exception )
       {}
      }


    釋放時,所有的hr傳回值皆為正常。但再次使用RenderStream連接Capture Filter時,會無法連接...(程式按Shift+F5中斷後,再次執行程式也會出現同樣的狀況,要把我的Cam拔出來再重新插上就會解決了)。連接的Code如下:


        Guid cat = PinCategory.Capture;
        Guid med = MediaType.Video;
        hr = capGraph.RenderStream( ref cat, ref med, capFilter, null, null); 
        if( hr < 0 ) Marshal.ThrowExceptionForHR( hr );


    有想過是不是釋放資源的機制要等待一段時間呢?還是有什麼東西是我忽略了?

    或許在C#中有沒有辦法去偵測所取得的Capture Filter的連接狀況

    若有連接的話,中止現有的Filter Chain,重新把Capture Filter連接到我想要的Filter呢?在C#中DirectShow有沒有提供這樣子的功能呢?

    請求高手協助討論,謝謝 :)

    2006年7月17日 下午 04:24

解答