前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >opencv 视频实时处理_opencv 控制摄像头

opencv 视频实时处理_opencv 控制摄像头

作者头像
全栈程序员站长
发布2022-11-01 10:57:47
1.4K0
发布2022-11-01 10:57:47
举报
文章被收录于专栏:全栈程序员必看

最近研究了通过OpenCV采集摄像头数据,并同时将视频流数据推送到RTSP和RTMP。

RTSP服务采用开源的LIVE555(需要自己修改和实现部分代码)。

RTMP服务采用开源CRtmpServer。

具体的实现细节就不细说了,大概的步骤如下:

1. OpenCV采集摄像头的一帧数据(cvQueryFrame函数)

2. FFmpeg编码该帧为H264和FLV流数据

3. 推送H264到LIVE555(自己实现),同时通过推送FLV流到CRtmpServer(通过FFmpeg)

因为CRtmpServer和LIVE555都是开源的,网上有很多资料;并且FFmpeg的H264和FLV编码、H264和FLV流推送这两个功能之前已经在其他项目总已经实现过,而且OpenCV在网上也有很多关于摄像头数据采集的资料,因此实现过程并不复杂。

但是在接收RTSP和RTMP流,并播放时总感觉比较卡,特别是RTMP感觉非常明显。视频老是在缓冲。最后发现是OpenCV的cvQueryFrame非常耗时间:

代码语言:javascript
复制
while (pEncoder->m_bRunFlag)
		{
			LARGE_INTEGER freq;
			LARGE_INTEGER start;
			LARGE_INTEGER end;

			QueryPerformanceFrequency(&freq);
			QueryPerformanceCounter(&start);

			//获取一帧数据
			pFrame = cvQueryFrame(pCapture);

			QueryPerformanceCounter(&end);

			//发送数据给H264编码器
			if (pFrame)
			{
				frame.nFrameHeight = pFrame->height;
				frame.nFrameWidth = pFrame->width;
				frame.nFrameSize = pFrame->imageSize;
				frame.nFrameType = AEC_VIDEO_DATA_RGB24;
				frame.pszFrameData = pFrame->imageData;
				g_pH264SendFrame(frame);
			}

			double fElapsedTime = double(end.QuadPart - start.QuadPart) / double(freq.QuadPart);
			TRACE("Elapsed time = %f ms\n", fElapsedTime * 1000);
		}

Jetbrains全家桶1年46,售后保障稳定

opencv 视频实时处理_opencv 控制摄像头
opencv 视频实时处理_opencv 控制摄像头
opencv 视频实时处理_opencv 控制摄像头
opencv 视频实时处理_opencv 控制摄像头

也就是说fps平均12左右,RTSP还比较流畅,但是RTMP播放一秒后就又开始缓冲。将H264和FLV编码器的帧率从25降低到8,效果也一样。

看来后续需要研究其他摄像头视频数据采集方案,特此笔记。

后记:

经过查找资料发现,OpenCV底层采用的是微软的VFW(Video for Window)。VFW(Video for Windows)是Microsoft推出的关于数字视频的一个软件开发包,VFW的核心是AVI文件标准。AVI(Audio Video Interleave)文件中的音、视频数据帧交错存放。

VFW的主要函数如下:

(1)capCreateCaptureWindow()::创建视频窗体 (2)capDriverConnect(): 连接驱动 (3)capGetStatus():获得视频状态 (4)capPreviewRate():设置预览速率 (5)capFileSaveAs():将视频转换成AVI文件 (6)capFileSaveDIB():将视频转换成BMP文件 (7)capGetUserData():获取用户定义的数据 (8)capGetVideoFormat(): 获取视频格式 (9)capGrabFrame():获取当前帧 (10)capDlgVideoDisplay():设置显示的对话框 (11)capCaptureSetSetup():设置视频捕获 (12)capSetCallbackOnFrame():设置每帧的回调函数 (13)capSetCallbackOnVideoStream():设置视频流的回调函数 (14)capSetCallbackOnWaveStream():设置声音流的回调函数

后续将尝试DirectShow方式驱动摄像头,实现RTSP和RTMP直播

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179402.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年10月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云直播
云直播(Cloud Streaming Services,CSS)为您提供极速、稳定、专业的云端直播处理服务,根据业务的不同直播场景需求,云直播提供了标准直播、快直播、云导播台三种服务,分别针对大规模实时观看、超低延时直播、便捷云端导播的场景,配合腾讯云视立方·直播 SDK,为您提供一站式的音视频直播解决方案。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档