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 如何高效的抠图,实现视频局部放大功能。
本人经过摸索,完美的解决这些问题;并对相关功能封装成了控件,易于重复利用。
标签:播放器,视频,imageInfo,capture,Emgu,播放,CV From: https://www.cnblogs.com/yuanchenhui/p/18310235/videoplayer