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

opencv 视频实时处理_opencv 控制摄像头最近研究了通过OpenCV采集摄像头数据,并同时将视频流数据推送到RTSP和RTMP。RTSP服务采用开源的LIVE555(需要自己修改和实现部分代码)。RTMP服务采用开源CRtmpServer。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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

最近研究了通过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非常耗时间:

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 控制摄像头

也就是说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.net/179402.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • WinExec、ShellExecute和CreateProcess

    WinExec、ShellExecute和CreateProcess有三个API函数可以运行可执行文件WinExec、ShellExecute和CreateProcess。CreateProcess因为使用复杂,比较少用。    WinExec主要运行EXE文件。  ⑴ 函数原型: UINT Win Exec(LPCSTR lpCmdLine, UINT uCmdShow);   ⑵ 参数:   lpCmdLine:指向一个空结束的字符串,串中包含将要执行的应用程…

    2022年7月11日
    19
  • oracle ORA-00918 未明确定义列「建议收藏」

    oracle ORA-00918 未明确定义列「建议收藏」 出现这种错误,一般是列名重复导致的,如下: createtabletestchar(v_datevarchar2(20),d_datedate)insertintotestcharselect’2018-07-20′,date’2018-07-20’fromdual;#这时候有两个字段都是vv,那么查询时,就会区分不出来这两列,oracl…

    2022年10月4日
    3
  • matlab导入文件夹里所有图片_如何创建快捷方式到指定文件夹

    matlab导入文件夹里所有图片_如何创建快捷方式到指定文件夹在matlab中,直接imwrite()保存图片,会保存到当前工作目录文件夹或其子文件夹。%直接保存imwrite(picture,’test1.png’)%在当前工作目录下新建文件夹并保存mkdirimage%如果文件夹已存在,会有警告,但不影响运行imwrite(picture,’image/test1.png’)如果要把图片保存到其他指定的文件夹,…

    2025年11月7日
    1
  • softmax函数导数「建议收藏」

    大家好,又见面了,我是你们的朋友全栈君。

    2022年4月14日
    44
  • 【SpringBoot】1、创建第一个SpringBoot项目

    【SpringBoot】1、创建第一个SpringBoot项目创建SpringBoot项目可以通过两种方式,1、通过访问:https://start.spring.io/,SpringBoot的官方网站进行创建SpringBoot项目;2、通过工具(例如:Idea)创建SpringBoot项目。本次使用开发工具:Idea创建我的第一个SpringBoot项目。首先,打开我们的Idea开发工具选择CreateNewPoject(创建一个新的项目)…

    2022年10月13日
    2
  • Apache负载均衡配置(反向代理模式)

    Apache负载均衡配置(反向代理模式)参考地址:https://blog.csdn.net/wgw335363240/article/details/8221444Apache负载均衡配置(反向代理模式)本文只适合EKP产品,至于应用

    2022年7月3日
    21

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号