行业垂直门户网站

设为首页 | 加入收藏

您当前的位置:北极星电力软件网 > 技术文章 > 正文

基于S3C6410的视频监控系统的设计与实现(2)

系统的整体数据流如图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);

上述代码片段是视频采集部分的关键代码段。在实现部分还有很多的条件判断和分支选择等控制流程部分,这里不进行详细描述。

来源:现代电子技术
投稿联系:陈女士  13693626116  邮箱:chenchen#bjxmail.com(请将#换成@)
《基于S3C6410的视频监控系统的设计与实现 - 北极星电力软件网》的相关文章
    基于S3C6410的视频监控系统的设计与实现 - 北极星电力软件网的相关新闻
      最新新闻
      相关专题