C# 通過Emgu CV播放流媒體(RTSP)


      Emgu CV is a cross platform .Net wrapper to the OpenCV image processing library. Allowing OpenCV functions to be called from .NET compatible languages such as C#, VB, VC++, IronPython etc. The wrapper can be compiled by Visual Studio, Xamarin Studio and Unity, it can run on Windows, Linux, Mac OS X, iOS, Android and Windows Phone.

  Emgu CV 下載地址:http://www.emgu.com/wiki/index.php/Main_Page,需要下載3.0版本以后的,Emgu CV 3.0集成了ffmpeg

  

Capture _capture = new Capture(fileName); //rtsp://user:password@192.168.1.66:554/  
_capture.ImageGrabbed += capture_ImageGrabbed;
_capture.Start();

private void capture_ImageGrabbed(object sender, EventArgs e)
{
  try
  {
    Mat frame = new Mat();

    lock (lockObj)
    {
      if (capture != null)
      {
        if (!capture.Retrieve(frame))
        {
          frame.Dispose();
          return;
        }
        if (frame.IsEmpty)
          return;

        //顯示圖片 可以使用Emgu CV 提供的 ImageBox顯示視頻, 也可以轉成 BitmapSource顯示。

        //略

      }
    }
  }
  catch (Exception ex)
  {
  }
}

 

 

public static class BitmapSourceConvert
    {
        /// <summary>
        /// Delete a GDI object
        /// </summary>
        /// <param name="o">The poniter to the GDI object to be deleted</param>
        /// <returns></returns>
        [DllImport("gdi32")]
        private static extern int DeleteObject(IntPtr o);

        /// <summary>
        /// Convert an IImage to a WPF BitmapSource. The result can be used in the Set Property of Image.Source
        /// </summary>
        /// <param name="image">The Emgu CV Image</param>
        /// <returns>The equivalent BitmapSource</returns>
        public static BitmapSource ToBitmapSource(IImage image)
        {
            using (System.Drawing.Bitmap source = image.Bitmap)
            {
                IntPtr ptr = source.GetHbitmap(); //obtain the Hbitmap

                BitmapSource bs = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    ptr,
                    IntPtr.Zero,
                    Int32Rect.Empty,
                    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());

                DeleteObject(ptr); //release the HBitmap
                return bs;
            }
        }
    }

 

 注意事項:由於ffmpeg 默認使用TCP阻塞方式建立連接,連接超時時間很長。如果連接不成功,會導致阻塞。需要設置ffmpeg連接方式或者設置超時時間。

設置方式:
public bool SetCaptureProperty(CapProp property, double value); //Capture方法。具體怎么設置不知道、或者Emgu CV沒有提供這個接口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM