使用Emgu.CV开发视频播放器简述

  OpenCV是大名鼎鼎的视觉处理库,其对应的c#版本为Emgu.CV。本人采用Emgu.CV开发了一款视频播放软件,可对本地视频文件和rstp在线视频流播放,还具有对视频局部区域放大功能。虽然功能比较简陋,但是已具备了视频播放的基本功能。Emgu.CV虽然对很多功能有了很好的封装,但在使用过程中还会遇到不少难点。本人对视频播放功能做了进一步封装,使用起来更加简单。

点击下载程序

程序界面

 

 开发要点

视频播放入口函数

 VideoCapture _capture = new VideoCapture(url);
 _capture.ImageGrabbed += _capture_ImageGrabbed;

private void _capture_ImageGrabbed(object sender, EventArgs e)
{
    try
    {
        while (true)
        {
            if (!CanCaptureImage())
            {
                Thread.Sleep(1);
                continue;
            }

            Mat m = new Mat();
            bool read = _capture.Retrieve(m, 0);
            if (!read)
            {
                return;
            }
            _currentFrameIndex++;

            CaptureImageInfo imageInfo = new CaptureImageInfo();
            imageInfo.RgbData = m.GetRawData();

            imageInfo.ImageWidth = m.Width;
            imageInfo.ImageHeight = m.Height;
            imageInfo.TimeSpan = TimeSpan.FromSeconds(_currentFrameIndex / _videoFps);

            EventImageCapture?.Invoke(this, imageInfo);
            return;
        }
    }
    catch (Exception ex)
    {
        Debug.Assert(false, ex.Message);
    }
}

需要在回调函数中获取图像rgb数据流,将这些数据流转换成图像显示就可以了。

看似简单其实不然,以下几点需要注意:

1 如何控制视频播放速度

2 如何高效的将rgb数据流转换成图像。

3 有些视频宽度不是4字节的倍数,转换成图像时需要做预处理。

4 如何高效的抠图,实现视频局部放大功能。

 

本人经过摸索,完美的解决这些问题;并对相关功能封装成了控件,易于重复利用。

posted @ 2024-07-18 18:51  源之缘-OFD解决方案  阅读(45)  评论(0编辑  收藏  举报
关注我