孙彦景, 马常伟, 王艳芬, 陈 岩, 李 松, 张晓光
(中国矿业大学 信息与控制工程学院, 江苏 徐州 221116)
以培养学生创新与解决复杂工程问题能力、具备一定的软硬件协同能力为目标,通过结合嵌入式系统、无线通信、计算机网络和软件设计等学科领域的技术,设计了一种基于无线多跳网络的视频传输实验系统[1-3]。基于QCA9558芯片、嵌入式系统、无线组网技术、QT技术,设计完成了无线视频传输系统。本系统由视频采集节点、Wi-Fi无线多跳网络、上位机客户端软件组成实现实时视频数据流生成、传输、编解码、显示存储等一系列功能。
设计时对硬件和软件进行了综合考虑,硬件平台具有开放性、扩展性,从而为软件提供支撑;软件平台也充分考虑了硬件平台的性能变化,保持灵活性。在针对具体实验内容进行设计时,不仅锻炼学生掌握实验设计方法、设计思路的能力,而且让学生将当前的新技术、新方法能够灵活地应用于实验之中[4]。
本文基于无线多跳网络技术所设计的无线视频传输实验系统包括嵌入式多跳节点视频采集终端和PC客户端两部分,如图1所示。多跳节点视频采集终端实现视频数据的采集、处理以及发送,PC客户端负责数据的接收及显示。多跳节点通过摄像头采集视频数据,进行编解码压缩处理后通过无线多跳网络将数据发送到网关。网关节点是系统的重要组成部分,主要连接由Wi-Fi构建的无线多跳网络和Internet网络,实现异构网络之间数据的转发和控制协议的解析。无线多跳网络传输部分是由各个多跳节点自寻路由实现自组网,完成多路视频流向网关节点的传输。PC客户端软件通过IP地址和端口访问获取所需的数据进行实时解码并显示视频画面,同时将视频进行存储。
图1 无线传输系统示意图
系统硬件主要有主控模块、电源模块、射频模块、以太网模块、存储模块和USB模块等,其结构框图见图2。图3为基于无线多跳网络所设计的实际硬件实验平台。
图2 硬件结构框图
图3 节点硬件平台
(1) 主控模块由QCA9558主控芯片、晶振电路、复位电路、电源转换电路、滤波电路和调试电路组成。
(2) 电源模块通过电压转换芯片RT8293B将外部输入12 V电源进行转换,得到平台其他模块所需要的供电电压。
(3) 存储模块由Flash存储模块和SDRAM存储模块组成。Flash存储模块选取NOR-FLASH类型的芯片MX25L12835F,用于完成设备的初始化和操作系统的加载工作;SDRAM存储模块选取符合DDR2标准的EM68B16CWQH芯片,以并联方式连接QCA9558内部集成的DDR控制器,实现扩大存储空间的需求。
(4) USB模块连接外设与主控模块进行交互,芯片集成了USB2.0控制器,将相关信号线与USB引脚相连,即可完成USB模块设计。
(5) 以太网模块选取PHY芯片AR8327,主控芯片QCA9558内部集成了千兆以太网媒体访问控制器,通过MII总线媒体独立接口总线完成与PHY芯片的通信,实现千兆以太网LAN口和WAN口功能。
(6) QCA9558内部集成了射频收发模块。射频收发模块的输入输出信号经过功率放大电路和低噪声放大电路将信号发送至天线模块,完成射频模块与外部设备的通信工作。
系统中多跳节点视频采集终端采用OpenWrt嵌入式操作系统[5]。无线网络传输部分以无线多跳网络技术为基础,采用OLSR(Optimized Link State Routing)路由协议[6]。PC客户端软件是基于Qt开发框架的视频解码应用程序。系统软件总体框架见图4。总体流程是由USB摄像头采集视频数据,多跳节点通过无线Wi-Fi将数据发送到其他平台的客户端应用程序上进行显示。
图4 系统软件总体框架
3.1.1 OpenWrt编译环境搭建
本设计选择在虚拟机中安装Ubuntu16.04 版本的linux系统,然后执行命令,完成交叉编译所需要的软件包的安装,主要有编译器、解压工具和特定库等。通过如下命令搭建编辑环境:
#sudo apt-get update
#sudo apt-get install git-core build-essential libssl-dev libncurses5-dev unzip gawk subversion wine1.6-dev unzip wget zlib-devel autoconf binutils bison bzip2 flex gcc gcc-c++
3.1.2 OpenWrt系统定制
安装完成OpenWrt系统后,进入源码目录,执行make menuconfig命令进入文本配置界面,如图5所示,按照系统需求裁剪内核。
图5 OpenWrt文本配置界面
根据视频传输系统所需主要配置如下:
(1) CPU型号选择:Atheros AR7xxx/AR9xxx;
(2) 建立交叉编译环境:Build the OpenWrt SDK等;
(3) 内核驱动模块:
USBSupport ---> <*>kmod-usb-core
VideoSupport ---> <*> kmod-video-core
(4) 网络传输协议及多媒体视频服务器软件等,
Application→<*>luci-app-olsrMultimedia→等
(5) 其他设置包含web管理界面:Collections→ <*>luci,各种所需插件:Translations→<*>luci-i18n-chinese等。
3.1.3 OpenWrt系统移植
在系统硬件平台上构建嵌入式Linux系统,需要引导程序Bootloader和系统固件。本系统的Bootloader采用开源的uboot软件[7],将其烧写到Flash中;然后连接硬件平台串口与PC机,使用软件TFTP进行固件的烧写;最后从Flash中引导在PC机上交叉编译后生成的固件,之后启动Linux系统。
在无线多跳网络[8]中,源节点到目的节点之间的典型路径是由多跳组成的,该路径中的中间节点可以充当端节点产生或接受数据分组,也可以充当路由器对来自其他节点的数据分组并进行转发。无线多跳网络技术能有效地避免有线和传统无线方式的弊端,可以在不增加线缆和设备的基础上有效地扩展通信范围,提高网络部署的灵活性,并降低成本。
路由协议是无线多跳网络的核心部分[9]。本系统采用Ad-hoc工作模式传输数据,实现系统的无线传输功能。系统所研究的OLSR是一种基于表驱动先验式路由协议。通过固件编译添加OLSR路由协议,进入系统设置服务,启用插件olsrd_jsoninfo.so.0.0完成OLSR协议的配置工作。
本系统中PC客户端软件图形化界面采用Qt完成。Qt是一款基于C++语言的跨平台图形用户界面应用程序框架[10-11],其面向对象的多线程应用可以解决并发和实时问题,因此能够较好支持多流传输解码需要。根据功能需求可以分为两部分:
(1) 前端:用户操作界面,提供多路视频参数设定和实时显示的功能;
(2) 后台:利用QT信号与槽和多线程的方法,开辟主线程和多个子线程,主线程负责接收视频帧和窗口部件的绘制工作,多个子线程负责多个视频流解码、编码保存,以及利用信号函数将视频帧发送至主线程的显示窗口进行显示。
客户端采用FFmpeg采集视频并生成数据流及推流,同时也可以对现有的测试视频进行推流。FFmpeg是一款自由软件,能够对市面上大部分多媒体文件等数据信息进行一定的记录和转化,同时还可以将音视频文件进行压缩编码和解码,实现音频和视频数据的传输[12-13]。视频编解码流程如图6所示。摄像头采集数据之后,对视频数据进行FFmpeg编码,然后经由网络传输至客户端进行解码接收。
图6 视频编解码流程图
编码之前进行初始化的处理,对所有使用到的编解码器完成注册,同时对帧速率、图像的格式及其分辨率等进行设定,保障编码的顺利完成和编码参数设定。系统通过操作设备文件“/dev/video0”,即可完成对摄像头的操作,主要流程为开启设备、确定可用功能及视频输入、申请缓存、采集数据、停止采集、关闭设备。
如图7所示,本系统实现5类功能,分别是Login(用户登录类)Setting(参数设定类)、VideoPlayer(视频解码类)、ShowVideo(视频显示类)和H264Encoder(视频编码保存类)。当用户登录成功后,系统开始进行初始化操作,在接收到视频流之后,配置相关参数开启编解码器;然后不断接收视频流信息,并将视频流送至解码器解码;最后将解码后的视频送至视频显示模块进行显示,并同时送至视频编码存储模块,进行重新编码与保存。登录见图8。
图7 客户端工作流程图
图8 无线传输实验系统登录界面
对搭建完成的无线多跳网络的各项性能指标进行测试,结果见表1。
表1 网络性能测试结果
实验结果表明,系统硬件工作正常,无线多跳网络构造成功。经过多跳传输之后,系统性能良好,能够满足视频传输的要求。
对系统软硬件测试表明,该系统能满足设计目标,具有一定的通用性和可扩展性,客户端上位机接收到的视频图像失真低,清晰稳定且实时性好,可以用于无线视频传输、视频编解码、无线网络等方面科研及教学。