祝朝政,张毅伟,程禹嘉,严锡君
基于Mjpg-streamer的跨平台无线视频传输系统
祝朝政,张毅伟,程禹嘉,严锡君
摘 要:为了解决基于Mjpg-streamer的远程视频系统只能通过特定浏览器查看与,可移植性差的问题,开发了采用QT框架的视频解码客户端,实现了跨平台的实时观测,改变了原系统对于浏览器的依赖性,提高了Mjpg-streamer远程视频系统的可移植性,使得系统的适用范围及使用方式更加宽泛及大众化。
关键词:视频解码;QT;跨平台;Mjpg-streamer
近年来,基于Mjpg-streamer的远程视频系统随着嵌入式技术,多媒体技术,计算机网络安全技术的快速发展也在不断的更新与发展。但在某些特定的需求下,这个工程并不能达到我们的要求,随着技术的不断进步,人们对简单、快捷、方便的追求日益提高,这就对项目的可移植性要求越来越高。
本文提出了一种基于ARM11+linux嵌入式的跨平台的远程视频系统,鉴于QT框架强大的移植性,研究人员决定为基于Mjpeg-streamer的远程视频系统开发视频解码客户端并采用QT开发框架,实现跨平台的实时观测,改变了对原系统依赖于浏览器的狭隘性,以便于在各个系统下更简便的使用视频监控系统。
整个无线视频传输系统包括客户端和服务器端两个部分。服务器端(嵌入式Linux系统平台上基于Mjpg-streamer设计的服务器软件)实现视频数据的采集、处理以及发送;客户端(基于Qt开发框架的视频解码程序)负责数据的接受以及显示。首先服务器端通过摄像头采集视频数据,进行压缩处理后通过无线wifi将数据发送到客户端,客户端对数据进行实时解码并显示视频画面。
该系统以S3C6410处理器为核心,外围器件有Flash 、SDRAM、以太网卡DM9000以及USB接口的S608摄像头,在Linux环境下对摄像头采集到的原始图像帧进行处理以及压缩,通过网络协议传输到上位机进行显示,硬件平台结构如图1所示:
图1 系统硬件平台结构图
系统采用C/S架构,服务器端采用嵌入式Linux系统作为软件平台,在该平台上基于Mjpg-streamer设计服务器软件。客户端软件是基于Qt开发框架的视频解码程序。总体工作流程是由USB摄像头采集视频数据,服务器端通过无线wifi将数据发送到其他平台的客户端上进行显示,同时服务器端采用了多线程机制,实现了多个客户端可同时显示视频画面。
2.1构建ARM+Linux嵌入式平台
在系统硬件平台上构建嵌入式Linux系统,需要引导程序BootLoader和Linux源码,本系统一直BootLoader源码,然后用MiniUSB接口将其烧写到Flash中,从Flash中启动,引导在PC机上交叉编译后的Linux镜像及根文件系统,之后启动Linux系统[1]。
1)编译NAND启动方式的uboot.bin
本系统的BootLoader采用开源的uboot软件,首先解压源码到虚拟机,然后进入源码目录执行编译nand flash的启动镜像文件的命令,生成uboot.bin即为启动文件。
2)编译Linux2.6.28内核镜像文件
Kernel文件采用linux-2.6.28,首先解压内核源码到虚拟机,然后,进入源码目录执行make menuconfig命令,按系统需求配置裁剪内核,最后,执行make命令生成zImage即为Linux内核文件。
3)使用BusyBox生成基本根文件系统
本系统使用BusyBox-1.13.4生成根文件系统,首先,解压内核源码到虚拟机,然后进入源码目录执行make menuconfig命令,按系统需求配置BusyBox,执行make;make install会得到相应的bin,linuxrc,sbin目录文件,基于以上文件建立自己的根文件系统,最后通过mkyaffs2image工具生成根文件系统的镜像文件[2]。
4)驱动的配置,将所有USB摄像头驱动编译进内核。
# make menuconfig
Device Drivers
Multimedia support
[*]Video capture adapters --->
[*] V4L USB devices --->
将上面两个配置选项下的子选项全部选上,这样本系统基本上可以支持市面上大多数的摄像头,而不仅仅局限于采用OV511,ZC03控制器的摄像头了。
2.2视频服务器软件的设计
Mjpg-streamer是一款免费的视频流服务器软件,采用的是V4L2视频设备开发框架,它能从摄像头采集图像以JPEG格式通过TCP/IP网络协议传输到上位机进行显示。
Mjpg-streamer移植
由于开发板采用的是ARM11架构的S3C6410处理器,所以在进行交叉编译的候需要将Mjpg-streamer源码目录中,所有Makefile文件的CC=gcc改成CC=arm-linux-gcc,然后进行编译,生成input_uvc.so、input_control.so、output_http.so、output_file.so组件。
服务器软件工作流程
首先是初始化,包括输入初始化和输出初始化。输入初始化,主要是调用V4L2对摄像头初始化,包括捕获视频尺寸等设置。输出初始化,主要是根据启动参数配置输出,比如主页文件的目录,使用的端口号等。接下来运行输入和输出函数,二者都会创建线程,并且会将线程从进程中独立出来。输入线程会创建抓图线程cam_thread。这个线程就是输入线程的主体,它是一个循环,只要用户没有按下Ctrl+C循环就会永远继续下去。抓图函数uvcGrab以阻塞方式等待图像数据,当有一帧数据到达后先处理为JPEG文件,对于YUYV格式的图像数据先要转换成RGB格式,再调用libjpeg库压缩为JPEG文件,对于MJPEG格式的输入需要插入Huffman数据表。捕获并处理了一帧视频之后再通知所有等待数据的客户端线程。输出线程分为两大部分:并发服务器线程和客户端处理线程。并发服务器线程server_thread负责监听客户端请求,一旦有请求就创建一个新的客户端线程专门负责来自此客户端的HTTP请求。这样服务器线程就可以一直监听客户端请求,本系统设置的最大可以处理的客户端数为10。一个客户端线程client_thread只负责处理一个客户端响应,也就是只响应一个IP地址的请求。进入client_thread之后,将会发送HTTP响应头。通过设置了一些响应头,使得服务器可以不断地发送JPEG数据给客户端。pthread_cond_wait以阻塞方式等待一帧数据的到来,一旦有JPEG数据就马上把数据从全局缓冲区中取出,发送给客户端。整个工作流程如图2所示:
图2 服务器端的工作流程图
2.3视频客户端软件的设计
为了能够实现跨平台的实时查看视频,鉴于Qt开发框架强大的移植性,我们开发了Qt版的视频解码程序,并编译了各个主流平台的版本,实现了真正意义上的跨平台。客户端的总体框架结构如图3所示[3]:
图3 客户端总体框架结构
从Mjpg-Streamer源码中的send_stream()函数可以看出,当客户端向服务器端发送请求之后,服务器端会返回以http作为响应头的视频数据流。另外为了避免不断的发送请求,响应,采用了服务器推送技术。即将content-type指定为:content-type:multipart/x-mixed-replace;bound
ary=BOUNDARY。由于jpeg图片有固定的帧格式,我们只需将接收到的数据流按位分析,找到0xff 0xd8开头,0xff 0xd9结尾的这个数据段,将其保存在字符数组中,并转换成jpeg图片,在label控件上显示,就是一帧图像的显示了,依次循环,就完成了视频流的解码。具体的是解码算法流程图如图4所示[4]:
图4 视频解码算法
为了测试跨平台的视频显示效果,我们分别在ARM-Linux开发板、Fedora9系统和Android4.4系统下进行测试。
定制化手持式控制终端,采用ARM-Linux架构,通过无线网卡与服务器端进行ad-hoc连接,将视频接收并显示在TFT液晶屏上,如图5所示:
图5 在ARM-Linux开发板上测试客户端的程序
在VMware虚拟机中安装Fedora9,通过无线路由器做中介,使服务器端与Fedora9系统的客户端进行连接,并将视频显示在客户端中,如图6所示:
图6 在Fedora9系统上测试客户端程序
小米4手机自建热点网络,服务器端通过无线网卡连接到热点,与Android4.4系统的客户端进行通信,点击图7中的红点即可开始接收显示视频,如图7所示[5]:
图7 在Android4.4系统上测试客户端程序
该系统突破了以往只能通过特定浏览器查看的限定,实现了用户在各个版本中观看视频的功能,使得操作简单,携带设备更方便,解决了以往运行时必须使用某几类浏览器的问题,让该系统更加整体化。同时客户端的图像可以实时显示,没有延时,图像清晰。该系统的用户界面窗口简洁大方,设计美观,操作人员容易学习操作,任何人都可以轻易实现功能,解决了只有专业人员才能使用的限制。
参考文献
[1] 肖儿良,毛海军,鞠军平,等.基于开源软件MJPG_Streamer的智能视频监控系统设计[J].微电子学与计算机,2013,6(6):84-87.
[2] 李亚东.基于ARM的履带式目标检测机器人研究与实现 [M].南京:河海大学,2013.
[3] 陈恒鑫,林 威,张钦宇.基于Mjpg-streamer的移动视频监控系统设计[J].计算机测量与控制2014.22(11):3597-3599.
[4] 陈金辉.基于Mjpg-streamer的远程视频监控系统 [M].衡阳:湖南工学院,2012.
[5] 郭加贝.基于Android智能手机视频监控的应用软件开发[M].杭州:杭州电子科技大学,2011.
Cross-platform Wireless Video Transmition System Based on Mjpeg-streamer
Zhu Chaozheng, Zhang Yiwei, Cheng Yujia, Yan Xijun
(College of Computer and Information, Hohai University, Nanjing 210098, China)
Abstract:In order to solve the problems that remote video system based on Mjpg-streamer only can be viewed through a particular browser and has poor portability, video decoding using QT framework is developed in the client side to realize the real-time observation of cross-platform. It changes the dependence on browsers of original system, and enhances the portability of Mjpg-streamer remote video system, which makes the usage scope and mode of the system wider and more popular.
Key words:Video Decoding; QT ;Cross-platform;Mjpg-streamer
收稿日期:(2015.04.28)
作者简介:祝朝政(1995-),男,信阳,河海大学计算机与信息学院,研究方向:计算机科学与技术,嵌入式系统,南京,210098;张毅伟(1993-),男,南通,河海大学计算机与信息学院,研究方向:计算机科学与技术,南京,210098;程禹嘉(1996-),女,吉林,河海大学计算机与信息学院,研究方向:计算机科学与技术,南京,210098;严锡君(1963-),男,南通,河海大学计算机与信息学院,副教授,研究方向:无线传感器网络、嵌入式系统,南京,210098;
文章编号:1007-757X(2016)01-0057-03
中图分类号:TP393
文献标志码:A