系统的整体数据流如图2所示。图中①表示原始数据从外部摄像头到摄像头驱动模块。②表示数据由驱动模块经过处理传输到内存。此时数据可以有不同的格式。③表示数据从内存中传送给视频编码模块的输入缓冲区。④表示MFC编码模块从输入缓冲区读取数据进行MPEG-4编码。⑤表示编码结束后将数据传送到视频编码模块的输出缓冲区。⑥表示从视频编码的输出缓冲区读取编码后的数据传送给网络传输模块进行传输。
在此需要注意的是,图示中的视频输入缓冲区对于解码模块是输入缓冲区,但是对于编码模块却是输出缓冲区。对于图示中的输出缓冲区也同样如此。
3.1 视频数据采集程序
视频采集程序使用内存映射的方式进行读取。通过内存映射直接把设备文件映射到内存中,绕过内核缓冲区,进程访问设备文件时和访问普通内存一样,极大的提高了视频数据的读取速度。
视频采集部分的流程图如图3所示。
下面列出视频采集部分的关键代码。
首先打开设备,其中CODEC_NODE为预定义宏,表示摄像头结点文件路径。
dev_fp=open(CODEC_NODE,O_RDWR);
在设置参数部分,首先要得到设备能力参数,检查是否具有所需的功能,然后再进行参数的设置。使用下面的代码来实现。
ioctl(dev_fp,VIDIOC_QUERYCAP,&cap);
上一行代码得到设备的功能信息,存储到参数caF中。在检查设备具有所需功能后,下一行代码进行参数设置。
ioctl(dev_fp,VIE)IOC_S_FMT,&codec_fmt);
其中,codec_fmt为一个格式信息的结构体类型参数。
在Linux平台,采集图像数据部分的实现方式与文件读取类似,采用下面的代码实现。
read(dev_fp,g_yuv,YUV_FR_BUF_SIZE);
而将数据传送给MFC模块这部分,可以采取直接共享缓冲区的方式,这样减少了一次数据在内存中的传输,增加了效率。
最后是关闭设备文件。先停止图像的采集,然后关闭文件。
ioctl(dev_fp,VIDIOC_STREAMOFF,&start);
close(dev_fp);
上述代码片段是视频采集部分的关键代码段。在实现部分还有很多的条件判断和分支选择等控制流程部分,这里不进行详细描述。
关于我们 | 广告服务 | 会员服务 | 媒体报道 | 营销方案 | 成功案例 | 招聘服务 | 加入我们 | 网站地图 | 在线帮助 | 联系我们 |
京ICP证080169号京ICP备09003304号-2京公网安备11010502034458号电子公告服务专项备案
网络文化经营许可证 [2019] 5229-579号广播电视节目制作经营许可证 (京) 字第13229号出版物经营许可证新出发京批字第直200384号人力资源服务许可证1101052014340号
Copyright © 2022 Bjx.com.cn All Rights Reserved. 北京火山动力网络技术有限公司 版权所有