ARM-Linux平台下的触发式视频监控系统
2013-01-31南春辉
武 颖,李 博,南春辉
(中北大学 电子测试技术国家重点实验室仪器科学与动态测试教育部重点实验室,山西 太原030051)
随着嵌入式技术、信息通信技术的高速发展,基于嵌入式的多媒体视频监控系统已经得到了广泛应用。但是,由于市面上的嵌入式视频监控系统大多采用24 h实时监控,使得一些不需要实时监控的使用者比如家庭用户等浪费了很多系统资源,功耗小、能耗低的产品才是现今倡导的低碳社会的主流。为了满足这些新条件的需求,本文提出了一种以ARM11为核心芯片,基于Linux的触发式视频监控系统,实现无人时待机,有陌生人入侵时开机监控,并将监控视频信息传至服务器进行处理。
1 系统设计
触发式视频监控系统分为嵌入式监控终端和客户服务器两个部分。嵌入式监控终端基于三星公司S3C6410嵌入式微处理器,采用开源的Linux操作系统。红外传感器负责判断监控现场是否有陌生人入侵,摄像头负责采集图像。客户服务器为PC机,通过局域网与嵌入式监控终端相连。工作流程如下:
1)陌生人入侵时触发红外传感器,嵌入式监控终端将报警信息发送至服务器。
2)系统根据服务器命令驱动摄像头采集视频,并将数据传递至服务器。
系统设计与流程如图1所示。
图1 系统设计与流程示意图
2 硬件平台设计
嵌入式监控终端的硬件平台选用TE6410开发板。TE6410开发板基于三星公司ARM11(ARM1176J ZF-S)处理器S3C6410,是一款低功耗、高性价比的RSIC处理器,主频可稳定运行在667 MHz以上,内置强大的硬件加速器(运动视频音频处理、2D/3D加速、显示处理和缩放等);集成了一个MFC支持MPEG-4/H.263/H.264编解码;带有128 Mbyte的DDR内存,1 Gbyte的MLC NAND Flash;板上集成了多种高端接口如USB、SD、LCD、以太网、外部存储器接口以及工业CAN总线、RS-485总线,支持Linux操作系统[1]。
摄像头采用台电USB摄像头慧眼MK02。红外传感器采用幕帘红外探测器SP-9923。
客户服务器采用联想PC机:酷睿2双核,CPU主频2.93 GHz,内存3 Gbyte,操作系统为Microsoft Windows XP Professional SP3。
硬件平台设计如图2所示。
图2 硬件平台结构图
3 软件平台设计
嵌入式系统的软件采用主机-目标机模式进行开发。主机的操作系统为Ubuntu-11.10,在主机中安装交叉编译工具arm-linux-gcc 4.3.2。然后,依次完成Uboot和Linux-2.6.36内核的编译及移植,烧写cramfs文件系统。
3.1 红外监控模块
红外监控模块由红外信号采集模块和报警模块组成。
红外模块根据继电器特性判断是否有陌生人入侵,如果有,调用报警模块。本模块无特殊算法,采用无限循环方式采集红外信息并进行处理,流程图见图3,实现代码如下:
ret=read(key,&keyval,sizeof(keyval));
if(keyval==128)
{printf(”Invalid coming! ”);
keyval=0;
if(devsta==ON)
alarming();}
报警模块采用顺序结构,流程图见图4。
3.2 视频采集模块
3.2.1 加载摄像头驱动
本系统使用的摄像头采用2.6.36内核支持的zc301芯片(中星微公司生产)。直接在内核配置中启用zc301驱动即可。
源码目录/arch/arm/boot/中将生成新的zImage文件,用DNW将新内核下载至开发板。开发板重启后,便可实现zc301驱动的正确加载,正确接入后会自动显示[2]。
3.2.2 视频采集程序设计
视频采集的程序设计基于Video4Linux模块提供的API函数。Video4Linux是Linux系统中关于视频设备的内核驱动,为Linux系统所支持的USB芯片摄像头提供统一的编程接口。具体信息保存在include/linux/videodev.h和drivers/media/video/videodev.c文件中。流程图如图5所示。
1)设备的初始化
首先打开摄像头设备。摄像头在系统中对应的设备文件为/dev/video0,采用系统调用函数打开。打开摄像头使用open函数:vd→fd=open(dev,O_RDWR)。接着利用I/O控制函数ioctl读取摄像头的相关信息,摄像头的结构体为stuct video_capability。
图5 视频采集流程图
该函数得到正确的返回值后,从内核空间将信息复制到用户空间c_cap各个分量中,通过调用printf函数得到各个分量的信息。之后分别调用ioctl函数对c_pic、c_window函数进行操作,完成对视频窗口和采集图像属性的设置[3]。
2)视频的截取
设备成功初始化后,进行视频图像的截取。使用的方法有通过read()函数直接读取和通过mmap()内存映射两种。
内存映射的方法绕过了内核缓冲区,进程之间通过映射同一个文件实现共享内存,访问文件时可以像访问普通内存一样,不必再调用read()、write()等函数,各个进程之间可以及时看到彼此共享内存中数据的更新,提高了访问的速度和实时性。所以在这里,采用内存映射的方法来实现。
该函数的原型为:buf=void*mmap(void*addr,size_t len,int flags,int fd,off_t offset)。
mmap()调用后,设备文件映射到内存区,不同进程可以共享以及进行读写操作。函数成功调用后将返回指向该映像内存区的指针。
3)视频数据的采集
Video4Linux一次可以进行最多32帧的采集,因此,需要设置采集的帧数和数据缓冲区的大小,然后调用ioctl函数连续采集数据,当缓冲区的剩余空间不足,不能保存一个完整的数据帧时,停止操作。实现连续采集的程序如下:
for(f=0;f<bufframes;f++)
{
mapbuf.f=f;
if(ioctl(cam,VIDEOCMCAPTURE,
&c_mbuf)<0)
{
perror(“VIDEOCMCAPTURE”);
exit(-1);
}
}
3.2.3 视频编码程序设计
本系统使用编码软件FFmpeg,一种开源的MPEG-4视频编码器,对视频图像进行压缩编码。实现MPEG-4编码的步骤如下:
1)初始化avcodec_init(),在使用avcodec库之前调用,初始化静态数据。
2)注册编码器:
register_avcodec(&mpeg4_encoder)
3)编码过程:
(1)获取设置的编码器:
codec=avcodec_find_encoder(CODEC_ID_MPEG4);
cod=avcodec_alloc_context();
picture=avcodec_alloc_frame();
(2)初始化编码参数:
cod->bit_rate=400000;
cod->width=352;
cod->height=288;
cod->frame_rate=30;
avcodec_open(cod,codec);
(3)开始分配空间:
outbuf_size=100000;
outbuf=malloc(outbuf_size);
size=cod->width*cod->height;
picture_buf=malloc((size*3)/2);
(4)获取待压缩图像:
picture->data[0]=yuv_buffer;
picture->data[1]=yuv_buffer+size;
picture->data[2]=yuv_buffer+size+size/4;
(5)调用MPV_encode_picture[4]:
out_size=avcodec_encode_video(cod,outbuf,outbuf_size,picture)。
3.3 视频数据网络传输模块
网络传输程序的设计过程实际上是嵌入式流媒体服务器的搭建过程,是触发式视频监控系统的数据传输部分。它以TCP/IP协议为基础构建,需要实现RTP、HTTP、TCP和UDP等协议,拥有IP地址,将设备接入Internet,通过RTP或者HTTP协议,客户服务器与嵌入式监控终端建立连接,用流媒体播放软件播放实时图像数据。视频数据网络传输原理图如图6所示。
图6 视频数据网络传输原理图
通过两个线程实现视频数据传输:首先是不断循环的主线程,申请服务器套接字后监听指定端口,创建第二个线程;另一个线程专门处理用户连接,接收用户请求并返回适当的MPEG图像数据[5]。流程图如图7所示。
图7 主线程和用户处理子线程流程图
相关的核心函数主要有:
1)初始化RTP包和RTCP包,填充包信息:
static void init_rtp_packet(struct rtp_packet*ep)
static void init_rtp_packet(struct rtcp_packet*ep)
2)删除已发送的RTP包:
void del_rtp_endpoint(struct rtp_stream*ep)
3)更新时间戳:
void update_rtp_timestamp(struct rtp_stream*rtp,int time_increment)
4)读取接收反馈的数据包:
static void udp_rtcp_read(void*d)
4 结论
本文设计了一种以ARM11为核心芯片的触发式视频监控系统,在中北大学图像处理与智能控制实验室中进行了实地测试。结果显示,从红外触发到视频采集的延迟不超过1 s,视频的网络传输延时在5 h内不超过1.5 s,达到了设计预期。
[1]汪庆年,孙丽兵,李桂勇.一种基于ARM的视频监控系统的设计[J].微计算机信息,2009(4):158-160.
[2]李峰,秦嘉凯.基于嵌入式Linux的实时网络视频监控系统[J].电视技术,2011,35(23):145-148.
[3]杨水清,张剑,施云飞.ARM嵌入式Linux系统开发技术详解[M].北京:电子工业出版社,2008.
[4]许志飞,姚正林.基于ARM的远程视频监控系统的设计[J].微计算机信息,2010(9):105-106.
[5]赵宇峰.基于嵌入式Linux的实时视频通信的实现[J].电视技术,2012,36(19):189-192.