刘 豪
(广州海格通信集团股份有限公司,广东,广州510006)
当前视频监控领域多采用嵌入式系统来实现。嵌入式系统涵盖了嵌入式硬件平台和嵌入式软件平台,本文将从系统实现的角度来阐述基于嵌入式Linux的MJPG-Streamer视频监控系统。嵌入式Linux的视频监控技术已广泛应用于多个领域,因此该系统设计实现方案具有一定的实用性和参考价值。
本系统设计方案中,硬件采用友善之臂的Mini2440开发平台,摄像头采用中星微的USB2.0摄像头,这是一款高性价比的图像数据采集处理器,支持VGA和SXGA视频模式,其像素最高达130万。
如图1所示为视频监控系统设计方案原理框图。USB摄像头通过USB接口与Mini2440的USB Host接口相连。软件方面,需要在S3C2440上实现USB摄像头驱动软件,同时在S3C2440处理器上运行MJPG-Streamer软件,利用MJPG-Streamer实现的web服务器功能提供网络访问支持,远程PC机通过浏览器访问该视频监控系统的web服务器,MJPG-Streamer程序将USB摄像头采集到的视频数据放到后台进行处理,然后通过web的http协议将视频数据传输到远端的PC机,然后通过浏览器显示出来,从而达到远程视频监控的目的。
中星微USB摄像头的VC0345模块是一个标准的UVC设备。本文将在Linux2.6.32内核版本中移植和开发UVC驱动代码,该驱动代码路径为drivers/media/video/uvc/,通过查看该目录下的Makefile文件可知每个*.c文件生成对应的一个*.o文件。最后链接成一
uvcvideo.o文件。Makefile代码如下所示。
uvcvideo-objs:=uvc_driver.o uvc_queue.o uvc_v4l2.o uvc_video.o
uvc_ctrl.o uvc_status.o uvc_isight.o
obj-$(CONFIG_USB_VIDEO_CLASS)+=uvcvideo.o
在Linux内核配置中,选择Device?Drivers->Multimedia support->Video capture adapters->V4L USB devices->USB Video Class(UVC)配置,那么Makefile将生成的uvcvideo.o编译进Linux内核。
在uvc_driver.c源码文件中包含了典型的UVC模块加载uvc_init和卸载uvc_cleanup的函数。
UVC设备驱动初始化模块函数uvc_init调用了usb_register注册函数,将UVC设备视为一个标准的USB设备。其中uvc_driver结构体中的name将注册进USB?Core的驱动名字,它会显示在/sys/bus/usb/drivers/下,但它并不是应用程序将要读写的设备文件。当UVC设备插入的时候,会调用uvc_probe函数来探测视频设备,包括视频的格式和设备控制参数等,内核需要id_table用来判断插入的设备是否适配,然后将初始化USB的URB中断,接收USB接口采集到的视频数据。当UVC设备拔出的时候,会调用uvc_disconnect函数。综上所述,UVC驱动模块处理流程如图2所示。
UVC驱动程序虽然是一个模块文件,但是它里面并没有提供fops的文件操作函数,而是把该操作的open、read、write、ioctl和mmap等用户接口函数放在V4L2驱动程序去实现。V4L2的fops名字叫做uvc_fops,定义在uvc_v4l2.c中。该结构体代码实现如下:
const struct v4l2_file_operations uvc_fops={
.owner=THIS_MODULE,
.open =uvc_v4l2_open,
.release=uvc_v4l2_release,
.ioctl =uvc_v4l2_ioctl,
.read =uvc_v4l2_read,
.mmap=uvc_v4l2_mmap,
.poll =uvc_v4l2_poll,
};
V4L2的子系统是围绕video_device这个结构体建立的,它代表的是一个V4L2设备。video_device的file_operations[2]结构体包含常规的函数指针。视频设备通常都包括open、read、write、release函数,这取决于设备的功能是输入还是输出。对于视频流设备而言,传输数据一般使用poll和mmap方法。同时,视频设备还定义了一系列的控制参数,所有这些视频参数一般都由ioctl函数实现。uvc_fops结构体实现之后是通过uvc_driver.c中的uvc_register_video函数将UVC驱动和V4L2驱动关联起来实现一个视频驱动的整体框架程序,因此用户就可以通过V4L2接口函数操作UVC视频设备了。
本系统视频采集流程如图3所示,V4L2采用流水线的方式,操作更简单直观,基本遵循打开视频设备、设置视频设备属性和采集模式、处理采集数据、关闭视频设备。
MJPG-streamer是一个轻量级的视频服务器开源软件,该软件基于IP协议网络,从USB摄像头中获取视频数据并传输JPEG格式的图像到浏览器,例如IE等浏览器,甚至是一个运行了TCPMP播放器的Windows移动设备。
本系统MJPG-streamer使用input_uvc输入组件,其主要功能是获取摄像头拍摄的图像并将其压缩编码,同时MJPG-Streamer使用了output_http作为输出组件,该输出组件采用httpd作为web服务器,其作用是可通过浏览器访问该服务器并监控和显示视频流。
MJPG-Streamer运行过程流程如图5所示。
本系统基于友善之臂的Mini2440开发平台,通过开发Linux的UVC-V4L2驱动软件和MJPG-Streamer应用软件成功实现了基于嵌入式Linux的视频采集与web远程监控系统。图6是Windows7下通过IE浏览器远程访问该视频监控系统看到的实时视频流监控图像和控制视频终端界面,在实际的项目和产品开发中具有一定的参考和使用价值。
图5 实时视频监控图像
[1][美]科波特(Corbet,J.)等.魏永明,耿岳,钟书毅译.Linux设备驱动程序(第三版)[M].北京:中国电力出版社,2005.11.
[2]李俊编著.嵌入式Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.3.