2014-02-11 120 views
1

我正在開發一個應用程序,以使用攝像頭和IpCamera顯示視頻。 對於IpCamera,它顯示了一段時間的視頻流,但在此之後它停止流和應用程序掛起。C#應用程序與IP攝像機連接後掛起

我使用Emgu.CV Library來抓取幀並將其顯示在圖片控件中。

我已經嘗試使用函數QueryFrame()顯示視頻的代碼如下。

用於連接IP攝像機 Capture capture = new Capture(URL);

用於抓取幀 Image<Bgr, Byte> ImageFrame = capture.QueryFrame();

一段時間之後,QueryFrame()提供null值和應用程序掛起。

任何人都可以告訴我爲什麼發生這種情況,我該如何處理它?

預先感謝您。

+0

那是什麼報的應用程序掛起時的錯誤?如果它是你的代碼,你有沒有可以提供更多細節的堆棧跟蹤? – txtechhelp

+0

我編輯了這個問題。但直到現在,還沒有出現任何錯誤。 –

+0

如果if(ImageFrame!= null)語句,你是否想要使用ImageFrame處理任何內容?否則嘗試{} catch(nullExc eption ex){}可能會解決該問題,但如果可能的話我會提出反對意見。歡呼 – Chris

回答

2

對不起,延遲,但我提供了一個例子,適用於幾個公共IP攝像機。它需要將EMGU參考替換爲當前版本,目標生成目錄應設置爲「EMGU Version \ bin」或者將其提取到示例文件夾。

http://sourceforge.net/projects/emguexample/files/Capture/CameraCapture%20Public%20IP.zip/download

而不是使用舊QueryFrame()方法,它使用的RetrieveBgrFrame()方法。它工作得相當好,我沒有空例外。但是,如果你做這樣的事情更換ProcessFrame()方法

private void ProcessFrame(object sender, EventArgs arg) 
{ 
    //If you want to access the image data the use the following method call 
    //Image<Bgr, Byte> frame = new Image<Bgr,byte>(_capture.RetrieveBgrFrame().ToBitmap()); 

    if (RetrieveBgrFrame.Checked) 
    { 
     Image<Bgr, Byte> frame = _capture.RetrieveBgrFrame(); 
     //because we are using an autosize picturebox we need to do a thread safe update 
     if(frame!=null) DisplayImage(frame.ToBitmap()); 
    } 
    else if (RetrieveGrayFrame.Checked) 
    { 
     Image<Gray, Byte> frame = _capture.RetrieveGrayFrame(); 
     //because we are using an autosize picturebox we need to do a thread safe update 
     if (frame != null) DisplayImage(frame.ToBitmap()); 
    } 
} 

乾杯

克里斯

+0

感謝您的回答,但在'_capture =新的捕獲(URL)'它引發錯誤'System.TypeInitializationException未處理Emgu.CV.Dll' –

+0

嗨對不起,這些庫是爲x64系統請用x86庫替換它們,如果這是您正在使用的EMGU版本,並確保相應地設置項目的平臺目標 – Chris