使用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 如何高效的抠图,实现视频局部放大功能。
本人经过摸索,完美的解决这些问题;并对相关功能封装成了控件,易于重复利用。
专注C#、C++。擅长WPF、WinForm、QT等技术。
研究ofd多年,开发了一些列产品。
技术交流QQ群:565438497。