邓博轩,李学丰,闫尉深
(1.长安大学 信息工程学院,西安 710000; 2.华录易云科技有限公司,南京 211800;3.河北省高速公路延崇管理中心,河北 张家口 075000)
0 引言
在高速移动的列车车厢内,用户终端能稳定地获取视频资源是重点研究内容。目前主流的接入网络方式包括4G/5G蜂窝移动通信网络和WiFi无线接入。5G源于移动通信领域,运用超密集组网和大规模天线阵列等关键技术[1],可大幅提高数据传输速率,但是由于载波频率过高,毫米波波段的绕射能力下降,只有密集部署基站才能在室内等障碍物多的场合取得良好覆盖效果,但这在用户较少的地方难以取得良好的经济效益。另外,在高速移动的火车上,由于5G的波长较短,高速移动列车和基站之间的相对运动产生的多普勒频移也要大于4G;而且,沿途变化的地形地貌也会加剧传输信道的时变性,为信道估计提出了更大的挑战。因此,目前将5G应用于列车上还存在一些困难,尚没有较好的解决方案。
WiFi源于计算机网络,属于成熟的移动端无线接入技术,由于覆盖范围和工作载频的限制,基本属于静态的非移动场景下的通信模式。WiFi通常由连接有线光纤网络的路由器提供,不支持终端的快速移动。此外,当前热门的无线CPE,采用大规模天线阵列、正交频分复用等关键技术,在较好的高速条件下,具有允许接入移动网络的能力,但获取的网络带宽不太稳定。
无线局域网下的嵌入式视频点播系统旨在解决网络带宽不稳定所导致的视频播放卡顿的问题,文献[2]提出的网络视频点播系统支持视频媒体编解码,客户端通过以太网接口与视频服务器建立网络连接从而进行数字媒体传输,但该设计采用的通信方式不支持高速移动的车载设备终端且文献中没有对视频传输过程中的网络带宽稳定性进行测试。文献[3]提出的流媒体视频点播系统,重点对原始视频的预处理进行了改进。采用多编码技术协作的无损压缩方案,使得视频数据传输延迟减小从而保证视频播放的流畅性。但文中仅限于对视频点播器的功能效果进行测试,并未对视频传输速率、网络的稳定性等系统性能进行有效分析。文献[4]提出的视频点播技术采用HTTP流媒体传输协议与FFmpeg开源库相结合的方式实现视频信息在终端平台的展示,但对于文中提出的通过减小播放切片个数和切片时长来降低视频播放延迟的理论方案还缺乏系统性的验证与分析。
针对列车旅客在4/5G网络下使用手机浏览视频时网络稳定性差的问题,本文采用一种次优的解决思路,即在通信网络良好的时候,尽可能缓存一些流媒体数据到本地存储器中,以便在网络不稳定时通过释放缓存来延缓卡顿现象,同时可根据用户选择的热度,确定视频资料的保存时效。
本文提出了一种高速移动场景下的平稳宽带车载视频点播系统,用户无须下载客户端,采用通用的HTTP协议,增加了移动终端与服务器设备连接的灵活性,缩短了临时旅客的接入时间。在技术开发方面,使用开源的Linux+Apache+Mysql+Php (LAMP)架构进行软件开发,在高速移动和多用户的环境下充分利用LAMP具有的Web资源丰富、高性能、高并发等优势,支持多个用户同时点播视频。系统提供稳定的网络环境,可实现高清视频的流畅播放,使乘客拥有良好的观影体验。
1 系统设计与硬件平台
视频点播系统由客户端和服务器端组成,客户端为手机或笔记本电脑等移动终端;车载服务器安装在列车车厢内,其搭载无线WiFi模块和以太网MAC控制器,用于构建车载无线通信网络,外接存储单元存储视频资源,本设计的物理拓扑结构如图1所示。
图1 物理拓扑结构图
本系统分别从移动客户端和车载服务器两方面进行设计,如图2所示为系统设计框图。客户端程序是基于浏览器而设计,由于用户终端安装的浏览器不同,故需要对浏览器的类型进行自适应识别。利用HTML5/Flash自适应播放应用[5],播放器可以自动侦测到浏览器类型。
图2 系统设计框图
车载服务器的硬件平台采用模块化的设计方法,由核心板和外围模块接口构成,核心板选用基于s3c6410处理器的ARM最小系统,外围模块接口主要包括RS232接口,固态硬盘接口,JTAG接口和无线路由模块接口[6]。s3c6410是一款高性能的32位处理器,工作主频高达667 MHz,内部集成USB、UART、SDRAM和FLASH控制器,支持丰富的外部设备[7],且在交互式操作较为频繁的状态下具有较快的响应速度。无线路由模块使客服端和服务器处于同一个无线局域网下,在服务器程序启动之后,由无线路由模块提供WiFi信号,客户端连接WiFi并通过浏览器向服务器发出点播请求。无线路由模块选用USR-WiFi232-D2模组,其发射的WiFi信号传输速率高达150 Mbps,为近距离传输提供了较高的数据吞吐量,减少了信道的占用时间,同时可容纳32个WiFi客户端接入,空旷无遮挡物的环境下,WiFi信号可覆盖100 m直径的圆形区域[8],符合本系统的要求。
本设计运行在嵌入式硬件平台上的Linux+Apache+Mysql+Php(LAMP)环境中,客户端与服务器之间采用B/S模式[9]。系统的工作原理如下:移动客户端在良好的无线网络环境下与车载服务器端建立连接,采用HTTP协议通过无线WiFi进行数据交互,移动终端向服务器发送视频点播请求,Apache服务器响应后,交给Php引擎解析文件,处理请求,并将视频点播结果返回给客户端。考虑到服务器端视频资源的实时更新性,将视频资源存放在固态硬盘中的特定文件下,方便用户更新资源。
2 软件系统设计
2.1 操作系统软件的制作
Linux系统除了有开源、稳定和良好的移植性等优点,还支持所有的TCP/IP协议,具备稳定可靠的网络功能。因此车载服务器的操作系统采用Linux作为软件的开发和调试平台。从软件的角度分析,嵌入式Linux系统通常包括引导加载程序、Linux内核、文件系统和用户应用程序这4个层次[10]。
Bootloader是指系统的引导加载程序,可以完成硬件设备的初始化并建立内存空间的映射图,本系统Bootloader采用的是支持ARM体系结构的u-boot。移植过程的关键点是在下载并解压u-boot源码后,需要将解压后的文件导入到本地目录下,并重新配置目录中的Makefile文件,使用配置好的交叉编译工具对系统源码进行编译,生成u-boot.bin文件说明编译成功。
Linux内核位于操作系统的最底层,负责管理外围硬件设备的驱动,而且为系统的应用程序提供合适的运行环境。内核移植需要注意的地方是在配置内核选项时,要根据硬件资源添加所需的驱动程序,主要包括网卡、USB、大容量存储设备等,使最后编译的内核能够支持s3c6410硬件平台[11]。
虽然内核是Linux系统的核心但用户与操作系统交互的主要方式是系统文件。Linux系统开启后,首先加载根文件系统,根文件系统包含系统启动时所必须的目录和关键性的文件,以及挂载其他文件系统所必备的文件。根文件系统的制作,需要利用编译安装好的Busybox工具包,在Busybox生成的install文件下添加bin目录、root目录、etc目录、home目录等,并为每个目录导入对应的设备文件,最后使用mkcramfs工具完成对根文件系统的打包。
2.2 基于Linux+Apache+Mysql+Php的设计方案
面对列车旅客人数较多,常出现同一时刻服务器用户访问量激增导致的视频流传输不稳定的情况。需设计大流量、高并发车载服务器系统架构,在软件架构上选用Linux+Apache+Mysql+Php为组合的LAMP架构,其具备高性能的操作系统、高稳定的Web服务器、高存储量的数据库、高效率的编程语言。
Apache服务器通过HTTP协议响应客户端请求并提供Web服务,拥有快速处理Php程序的能力,不容易出现连接超时的情况,适合应用于访问量较高的站点。Php服务程序以Apache服务器为依托,侧重于对客户端请求的处理并高效率的执行动态网页。Mysql数据库对视频资源进行动态管理,数据存储量大,支持视频流的存储,可与Apache服务器建立稳定连接,同时Mysql数据库没有用户数量限制,多个客户端可同时使用一个数据库,适用于响应多用户请求的系统设计。基于LAMP框架的模块交互流程如图3所示。
图3 LAMP框架模块交互流程图
视频点播系统的设计基于HTTP协议,HTTP协议属于一种请求/响应模式的协议,是实现客户端与服务端通信的常用协议[12]。此外,在多用户访问服务器的情况下,使用HTTP协议有利于减轻服务器的负担,能够将更多的CPU资源提供对外服务。在视频点播系统具备良好通信协议的基础上,用户可在浏览器中输入服务器IP地址,回车触发页面文件名请求,Apache服务器接收到响应后,调用Php服务程序并启动Php引擎对数据库进行访问[13]。Php引擎将会对Apache传送过来的文件从头到尾进行扫描,根据命令从后台读取,处理数据,并动态地生成相应的HTML页面,最终服务器通过HTTP协议将页面返回给浏览器。视频点播流程如图4所示。
图4 视频点播流程图
2.3 服务端播放器程序的设计
Apache服务器采用php程序调用的方式实现与数据库的动态交互。php的程序结构主要主要有四部分组成,分别为服务端应用编程接口、主程序、Php引擎和代码扩展层。服务端应用编程接口位于php框架的最外层,负责与外围模块进行数据交互;主程序主要完成协议的解析、Web服务器的通信、文件流的处理等工作;Php引擎不能单独存在,需要依托Apache服务器,它是Apache功能模块的一种扩展,主要用于解析php程序[14]。代码扩展层主要由类库和函数组成,是扩充php功能的一种方式。采用Php语言编写的服务器端网站主页主要包括视频,图片,书籍,上传几个选项。部分代码如下:
视频点播系统采用Video标签在页面中嵌入视频播放器,通过Video.js播放器库所提供的HTML/Flash自适应播放应用[15],客户端可以自动侦测当前浏览器类型。根据是否支持HTML5标签和Mp4/H.264编码格式,决定使用Video标签嵌入视频播放器还是调用flash程序来实现视频播放。客户端播放模式设计如图5所示。
图5 客户端播放模式设计图
下面是引入Video播放的部分核心代码:
1)在页面中head区域引用必要的js文件
2)设置flash路径,Video.js会在不支持HTML5的浏览器中使用Flash播放视频文件:
Videojs.option.flash.swf="Video-js.swf"
3)设置视频内容文件信息,包括路径信息,播放器支持的视频格式,以及播放器的窗口大小。其中WebM文件格式主要支持Vorbis音频编码和VP8视频编码; Ogg文件格式支持Vorbis音频编码和Theora视频编码。
2.4 数据库程序的设计
为了更好的对数据进行处理操作,使用了Mysql数据管理系统,在数据库中专门为系统中的几类对象建立了数据表,包括影片信息表、用户信息表、资源分类表、点播统计表等。影片信息表主要包括如下属性:存储影片ID、影片文件名、影片所属分类、影片描述、上传时间、上传影片名称、上传影片大小、文件存储地址等[16],其中影片ID是影片在数据库中的唯一标记,通过该属性可以检索到对应的视频。影片信息表中的关键字段如表1所示。
表1 影片信息表
系统中的每个页面都动态生成,页面显示的内容从数据库实时提取会导致操作量激增,为了减少连接服务器、选择数据库等重复性操作,本文定义了一个数据库访问类DB_Mysql,将重复执行的程序隐藏在类的内部。该类的定义如下:
class DB_Mysql
{
var $Host = "localhost";//服务器地址
var $Database = "media";//数据库名称
var $User = "root"; //用户名
var $Password = ""; //用户密码
var $Link_ID = 0; //数据库连接
var $Query_ID = 0; //查询结果
var $Row_Result = array();//结果组成的数组
var $Field_Result = array();//结果集字段名组成的数组
var $Affected_Rows; //影响的行数
var $Rows; //结果集中记录行数
var $Fields; //结果集中字段个数
var $Row_Position = 0; //记录指针位置索引
function_construct();//建立服务器连接
function_destruct();//取消服务器连接
Function connect($Database= "",$Host= "",$User = "",$Password = "") ;//数据库连接
function query($Query_String);//字符串查询
function seek($pos);//数据存储位置搜索
function get_rows_array() ;//行数结果的集中记录
function get_fields_array() ;//字段个数结果的集中记录
function get_affected_rows() ;//函数返回前一次Mysql操作所影响的记录行数。
function get_rows(); //行数获取
function get_fields(); //字段个数获取
function fetch_one_array($sql);//数据以数字索引方式存储在数组中
}
DB_Mysql类是基于Mysql扩展函数库封装得到的[17],该类中,属性$Host、$Database、$User、$Password定义了连接 Mysql使用的默认参数;$Row_Result为查询返回的结果集组成的数组;$Field_Result为查询结果集中字段名称组成的数组;Rows为查询结果集的记录行数。DB_Mysql类的使用,有利于数据库与页面交互程序的快速执行。
2.5 LAMP软件的移植
嵌入式软件开发采用交叉编译,源文件在宿主机上编译,运行在目标机上。LAMP软件的移植,是指在嵌入式平台上运行交叉编译后的二进制文件的过程[18]。这里重点说明Apache和Php的移植过程。
1)Apache的移植。
Apache的交叉编译,需要Apache库文件的支持,通过gcc编译器生成pc端的Apache可执行文件,使用arm-linux-gcc交叉工具链对Apache源文件进行编译。移植流程是在官网上下载Apache源码,进入解压缩的Apache源文件根目录进行配置:
[heyun@heyun Apache-arm11]./configure CC=arm-linux-gcc--host=arm-linux--prefix=/usr/local/Apache-arm--enable-so--enable-modules=so--with-mpm=prefork ac_cv_file__dev_zero=yes
ac_cv_func_setpgrp_void=yes apr_cv_process_shared_works=yes
apr_cv_mutex_robust_shared=yes apr_cv_tcp_nodelay_with_cork=yes ap_void_ptr_lt_long=no
配置选项中,指明了交叉编译工具链arm-linux-gcc ,生成二进制可执行代码的安装目录/usr/local/Apache-arm,编译成动态模块。配置完成后,会自动将当前目录下configure文件中的CC、LD、AR、NM、RANLIB以及STRIP选项修改为:
CC=arm-linux-gcc
AR=arm-linux-ar
LD=arm-linux-ld
NM=arm-linux-nm
STRIP=arm-linux-strip
RANLIB=arm-linux-ranlib。
配置完成后,执行make进行编译。
2)Php的移植。
Php的移植需要Php、libconv、libxml2、zlib等库文件的支持[19]。对于Php编译,在官网上下载Php-5.2.0源码后,进入解压缩的Php源文件根目录进行配置:
[heyun@heyun Php-5.2.0]:./configureCC=arm-linux-gcc--host=arm-linux--prefix=/usr/local/Apache-arm11/Php-5.2.0/sapi/Apache/--with-apxs=/usr/local/Apache-arm11/Apache/bin/apxs--enable-pdo=shared--with-zlib --with-iconv
配置选项与Apache类似,不同之处在于Php的编译指明了依赖库文件zlib,libconv。配置完成后,执行make进行编译即可。
3)配置Apache支持Php。
由于Apache默认支持静态网页,不支持Php页面,所以Apache与Php各自独立编译完成后,需配置二者的协同工作[20]。进入编译好的Apache文件中,找到configure文件,主要对该文件的下述选项进行配置:
#登陆服务器的端口号与用户名的设置
Port 8080
User nobody
Group nobody
#网站根目录的设置
DocumentRoot "/sdcard/ShipinDianBo/"
#配置Apache支持Php解析
DirectoryIndex index.html
DirectoryIndex index.Php
DirectoryIndex index.Php3
DirectoryIndex index.phtml
#指定Php解析器的路径及类型
LoadModule.Php5_module libexec/libPhp5.so
ScriptAlias/cgi-bin/"/usr/local/Apache-arm11/cgi-bin/"
ScriptAlias/Php5/"/usr/local/Apache-arm11/Php/bin/"
AddType application/x-tar.tgz
AddType application/x-httpd-Php.Php3
AddType application/x-httpd-Php.Php
AddType application/x-httpd-Php.phtml
Apache与Php的移植和配置工作全部完成后,启动Apache服务器,自动加载Php解析器,可实现客户端与服务器端页面的动态交互。
3 系统测试
3.1 系统测试平台
系统的嵌入式平台搭建了s3c6410为处理器的ARM最小系统,USR-WiFi232-D2模组,固态硬盘,RS232串口模块,电源模块。嵌入式系统采用linux内核,使用yaffs文件管理系统[21],服务器的运行环境选用LAMP架构,客户端应用程序基于移动终端而开发。
程序开发阶段,在pc端使用SecureCRT软件对系统进行调试,通过串口控制嵌入式平台,将之前交叉编译好的LAMP二进制文件拷贝到板载固态硬盘中,在SecureCRT软件下通过命令,将二进制文件拷贝到linux系统对应的文件目录下。USR-WiFi232-D2模组需配置为AP模式,设置IP地址为:10.100.100.100。最后配置嵌入式系统初始化文件,设置上电自动开启Apache服务器程序。
3.2 测试结果与分析
嵌入式平台与pc连接上后,使用ifconfig命令查看服务端的IP地址,使用ps命令查看Apache是否正常运行,测试结果如下:
[root@CHD /]# ifconfig
[root@CHD /]# eth0 Link encap:Ethernet HWaddr 08:90:00:A0:90:90inetaddr:10.100.100.100Bcast:10.255.255.255Mask:255.0.0.0UPBROADCAST RUNNING MULTICAST MTU:1500 Metric:1
[root@CHD /]#./Apachectl start
[Fri Sep 29 05:14:37 2000] [alert] httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
从上面结果测试结果可以看出,配置Apache服务器时,将IP地址默认设置为10.100.100.100。使用Apachectl命令启动Apache服务器,从上面打印的信息可以看出,服务器正常启动。如图6所示,Apache启动后默认同时开启多个进程,多个用户同时访问Apache服务器,可缩短服务器的响应时间,给用户提供稳定可靠的数据。
图6 Apache开启多进程
调试完成后,重新启动嵌入式平台,移动终端确认连接上WiFi信号后打开浏览器,输入IP地址10.10.100.100,回车即可访问服务器中的视频资源。手机访问服务器主界面如图7所示,视频播放如图8所示。
图7 手机访问服务器主界面
图8 视频播放功能
为了测试视频传输过程中的带宽稳定性和用户观看视频的流畅度,将视频的传输速率作为系统性能的核心指标[22]。测试方法是在车载服务器和手机终端上分别安装网络性能测试工具iperf来对客户端和服务端之间的网络传输速率进行检测,服务器系统安装iperf后在终端输入命令iperf -s开启服务端,手机终端则需要打开iperf输入命令iperf -c 10.10.100.100-t 60,测试60 s内的网络传输速率。如图9所示为60 s内网络传输速率与时间的关系图,图中的虚线为网络传输速率平均水平线。对图中数据结果的分析可知,车载服务系统所在网络的码流传输速率基本稳定在35 Mbps到56 Mbps区间内,均值为48.41 Mbps,方差为17.61,离散程度较小,传输速率在一段时间内保持相对稳定的状态。由于流畅播放高清视频所需要的带宽至少为4 Mbps,系统的实时带宽远高于播放高清视频所需的带宽且系统网络较稳定,故网络性能测试结果满足系统设计的要求。
图9 传输速率与时间的关系图
根据列车车厢所限制的空间范围,测试其范围内不同位置的网络传输速率及其带宽稳定性,将移动设备在距离服务器的不同位置作为网络信号测试点,统计测试点距离车载服务器1 m至15 m之间网络传输速率随距离的变化情况,统计结果如图10所示。实验结果表明,随着客户端与服务器之间传输距离的增大,码流传输速率逐渐减小,变化范围在18 Mbps到50 Mbps之间。可以看到,在列车车厢所允许的最远距离下,传输速率最小为18.2 Mbps,满足系统对于传输高清视频码流速率的要求,能够让用户在有限空间内获得良好的观影体验。
图10 距离与视频传输速率的关系图
4 结束语
本文利用嵌入式硬件的特点,结合LAMP架构的优点,提出了一种高速移动场景下的平稳宽带车载视频点播系统的设计方案,设计出了硬件开发平台和应用软件,客户端与服务器之间是基于HTTP协议的B/S模式,服务器端采用LAMP框架部署网站。最后分别完成了服务器端和客户端的工作,实现了视频点播功能,经测试硬件平台稳定可靠且网络性能良好,服务器稳定流畅地给用户提供视频点播服务,满足设计需求。在高速移动场景下,面对大量的用户群如何均衡带宽负载,从而提升车载服务器的服务能力和网络性能,是后期研究的一个主要方向。