[RTSP]WPF用Emgu显示RTSP视频

本文介绍了一种利用WPF中的image控件显示RTSP视频流的方法。通过使用Emgu CV库及其集成的FFmpeg组件进行视频解码,实现了一个简单的实时视频播放示例。文章详细展示了如何设置WPF应用程序并处理视频帧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: ‘[RTSP]WPF用Emgu显示RTSP视频’
date: 2017-11-30 22:21:58
tags:

[RTSP]WPF用Emgu显示RTSP视频

场景

  • 拿到一个RTSP之后如何显示,有很多办法,就是拿流解码显示,这里我们是用WPF的image控件来显示,WPF没有控件句柄的概念,所以我们要用自带的方式优美的显示出来。

操作

  • 下载emgu可以到官网下载
  • 同样也可以在github下下载
  • 3.0以上的版本集成了ffpeng,所以可以用ffpeng来解码

执行

  1. 我们新建一个WPF工程。.net 4.0以上,不然可能要手动安装依赖组件
  2. 在xaml添加一个image控件和按钮
 <Grid x:Name="myGrid">
   
         <Image x:Name="myimage" Stretch="Fill"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="28,10,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
        <Button Content="Button" HorizontalAlignment="Left" Visibility="Collapsed" Margin="126,17,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/>
        <Button Content="Button" HorizontalAlignment="Left" Margin="219,17,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
    </Grid>
  1. 我们引入emgu的dll(网上的其它教程都是基于之前的版本写的也最新的版本不同,因为.net也有一个Capture控件,而且emgu有命名空间的更改。找不到emgu.cv.dll是正常。我今天也是苦苦找了好久,阅读官网文档才发现有所更改),我们用negut来安装现在最新的版本是3.3
    这里写图片描述
  2. 在对应的按钮下执行操作
 VideoCapture _capture = new VideoCapture("rtsp://184.72.239.149/vod/mp4://BigBuckBunny_175k.mov");
   _capture.ImageGrabbed += _capture_ImageGrabbed;
            
             _capture.Start();
              private object lockObj = new object();
        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;
                        myimage.Dispatcher.Invoke(new Action(() =>
                        {
                            myimage.Source = BitmapSourceConvert.ToBitmapSource(frame);
                        }));

                        //显示图片 可以使用Emgu CV 提供的 ImageBox显示视频, 也可以转成 BitmapSource显示。
                        frame.Dispose();
                        //略
          //  _capture.Dispose();停止关闭

                    }
                }
            }
            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;
            }
        }
    }
  1. 执行测试
    这里写图片描述

提示

  • 看到别人解决了说明这是一个思路,但是好用不好用一定要试一下
  • Demo一定要结合现有的项目,不能一看可以就想到一定适合项目。
  • emgu不全是opencv,有些功能在windows下有的功能和库是没有的。

尝试,是一个人学习唯一的法门。

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值