基于Linux的视频软导播系统的设计
2013-01-31吴天亭文成玉
吴天亭,杜 鸿,文成玉,满 宇
(成都信息工程学院,四川 成都610225)
随着视频采集和传输技术的发展,远程可视化指挥手段已广泛应用于指挥控制系统,视频软导播系统是运行在通用计算机和网络环境中的一种导播软件,它接收来自监控点的H.264格式的压缩视频流,在导播计算机中解码并显示,操作员可根据需要将其中几路视频流转发给解码显示设备,实现视频流的接收与派发的功能,它为指挥员提供热点视频导播和显示的核心手段。目前的视频导播系统一般由视频处理装置和转用硬件切换矩阵构成。视频切换矩阵可以从多路输入视频信号中选择出一路或多路送往视频处理装置,如视频捕获卡、压缩视频流解码器和监视器等[1]。这种基于专用硬件的导播系统存在的问题是,较为复杂的模拟信号布线带来可靠性方面的隐患,从导播中心到显示设备间的距离受模拟视频信号传输能力的约束,模拟视频传输易受环境电磁干扰而影响图像质量。
在一些有设备和布线空间限制,有抗电磁干扰能力要求的指挥系统中,硬件导播系统存在的缺陷使得它难以胜任应用需求。这也是软导播系统的研发动机。相对硬导播系统而言,软导播系统是一个具有视频解码、监控和视频流重定向功能的软件系统,运行在通用计算机中,视频流的输入输出都通过网络系统传输,不需通过模拟视频电缆;导播输出网络压缩视频流由终端指挥显示设备直接解码并显示。软导播系统工作在纯网络环境中,布线简单;导播输出视频流为网络化压缩视频流,不受传输距离限制,抗电磁干扰能力较强。
1 总体设计
在本系统当中,由于计算机性能与网络带宽等限制,在单台计算机上本系统可以接收八路视频流,并且可以转发四路视频流。当多台计算机同时使用本系统时,通过本系统中的多机协调机制,可以实现更多路视频的接收与派发。接收为8×N路视频流,派发为4×N路视频流。其中N为正在使用本系统的计算机的数量。
在视频软导播系统的总体设计中,它的前端由具有将模拟视频流编码成IP组播网络视频流能力的编码器和模拟视频源构成。后端由具有将IP多播网络视频流解码为通过RCA接口进行播放的解码器和视频播放器组成。整体结构如图1所示。
1.1 系统环境
本系统的使用环境如下:
1)支持多播转发的交换机:该交换机用来连接多播视频发生源与视频接收客户端与多播视频转发服务器。
图1 视频软导播系统结构
2)多播转发服务器:安装有Linux操作系统的计算机主机。该端用于视频多播的接收和转发,该端必须具有对多播视频的接收功能,只有接收到多播视频才可以实现将接收到的视频转发到视频接收端,即运行视频软导播系统的主机。
3)多播视频发生源(多播视频服务器):该端用于视频多播信号的产生。
4)视频接收端(多播视频客户端):该端用于对多播转发服务器转发的多播视频的接收。
视频软导播系统是将经过编码的IP组播网络视频源在用户界面上进行实时播放,并且根据实际要求对所接收到的视频流进行派发。派发的目的地点根据用户的选择而进行改变,接收到派发视频的用户可以实时地对视频进行播放。
1.2 系统结构
本系统的设计基于Linux系统平台中的Netfilter架构。整个系统的设计分为3个部分:第一部分是内核层网络驱动的设计,主要实现的是对多机协调时数据包传输的帧格式的设计,对流经本机的视频流的截获、封装和派发规则的设定,并且编写用户空间使用的API;第二部分是应用层的系统指挥控制界面的设计,主要实现的是对视频流的播放控制与派发作用,还有应用层视频解码监控及导播控制模块的设计;第三部分是内核层与应用层之间的通信,由于在应用层涉及到对视频进行界面操作的设计,而且应用层不能对内核层进行直接操作,所以要将用户空间的用户口令传达到内核空间,因此要用到内核层与应用层之间的通信。况且在多机协调的过程中也涉及到内核与用户层之间的通信,以实现多台计算机可靠并有效地进行工作。
软件的系统结构图如图2所示,IPSWITCH.KO为自行开发的内核驱动程序的模块名称。
1.3 设计思想
图2 软件系统结构
视频软导播的设计思想的核心是在内核层对截获的数据包就行修改,封装达到对数据包进行自由派发的目的。与此同时,对数据流量与实时性又有很高要求。所以Linux系统中的Netfilter架构成为了本系统首选的切入点。Netfilter的设计并不相关于某个确定的协议,而是在协议栈中为每个网络协议定义一套唯一的钩子函数,也就是HOOK函数。在数据包经过协议栈的这些挂接点时,钩子函数被系统调用,在这些钩子函数的挂接点中,数据报被协议栈及钩子函数标号作为参数,传递给Netfilter框架。对于它在网络堆栈中增加的这些HOOK。内核的任何模块可以对每种协议的一个或多个HOOK进行注册,实现挂接。这样当某个数据报被传递给Netfilter框架时,内核能检测到是否有任何模块对该协议和HOOK函数进行了注册,若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查、修改、丢弃该数据报及指示Netfilter将该数据报传入用户空间的队列[2]。这一设计思想符合本系统的设计理念。
2 系统实现
2.1 内核层网络驱动设计
Netfilter架构一般可以分为5个部分:数据报过滤模块、连接跟踪模块(Conntrack)、网络地址转换模块(NAT)、数据报修改模块(mangle)、其他高级功能模块。Netfilte的节点关系则如图3所示,其中IPSWITCH.KO为本系统的网络驱动模块。
图3 Netfilter结构图
由本系统前端输入的IP组播视频流数据包流经IP_PRE_ROUTING点后,接下来的流经路径有3种选择:第一种是对数据包不做任何处理,那么该IP视频流会经过IP_LOCAL_IN节点,然后传送到系统主机;第二种是对数据包就行修改,使其符合从IP_FORWARD流经的条件;第三种是将数据包直接由POST_ROUTING节点发送出去。
显然要达到本系统所要求的目的,也就是对视频流在用户空间进行播放并且具有派发功能。那么要用到第一种以及第三种数据包的处理方式。因为该数据包是组播包,在Linux内核的结构中对组播数据包进行修改,并且符合第二种条件的要求势必要做出大量的编码工作,而第三种数据包处理方式的选择相对要简单高效。
所以本系统对数据包的处理过程是:在IP_LOCAL_IN之前对数据包进行截获,然后复制数据包,一份数据包直接由IP_LOCAL_IN点进入本地主机,另一份则根据应用层传递的命令由POST_ROUTING点直接发送出去。截获过程HOOK函数的实现代码如下:
modify_ops.hook=modify;
modify_ops.hooknum=NF_IP_LOCAL_IN;
modify_ops.pf=PF_INET;
modify_ops.priority=NF_IP_PRI_FIRST;
ret=nf_register_hook(&modify_ops);
if(ret<0)
{
printk("%s ","can't modify skb hook!");
return ret;
}
案例3:在“均值不等式的定理”一节中,可用“某商店在节前进行商品降价酬宾销售活动,拟分两次降价,有三种降价方案:甲方案是第一次打A折销售,第二次打B折销售;乙方案是第一次打B折销售,第二次打A折销售;丙方案是两次都打—样折销售,问哪一种方案降价较多?”
printk("%s ","insmod modify skb module");return 0;
由加载钩子函数的代码可以看出,该截获数据包的函数是挂接在IP_LOCAL_IN这个节点之前的。这样就可以让数据包既流经本机又可以对数据包直接进行修改,然后发送出去。其中,对数据包的截获和发送时修改的参数都是由用户空间传递给内核层的。
2.2 多机协调机制
多机协调机制借鉴于Netfilter框架的连接跟踪机制。所谓连接跟踪机制就是跟踪并且记录连接状态。Linux为每一个经过网络堆栈的数据包,生成一个新的连接记录项[3]。此后,所有属于此连接的数据包都被唯一地分配给这个连接,并标识连接的状态。连接跟踪是防火墙模块的状态检测的基础。
本系统的多机协调机制即利用Netfilter固有的连接跟踪机制,然后多台主机的视频软系统共同维护一张视频软导播派发表。在这张表格上记录接收的视频源的地址与转发的视频流的目的地址,并且对应视频源地址与转发目的地址。这样在视频进行转发时,系统首先查询该表,针对该表中的已有记录项确定是否进行接收与派发。当该主机确定进行接收或者派发的步骤后,那么该系统将会把新的接收与派发规则更新入该表格。这样就可以很好地实现多机互动,有效地进行更多路视频的导播功能。
2.3 内核空间与用户空间之间的通信
因为不同的时间系统的视频播放和导播方案可能会不同,对于内核空间来说系统的导播方案是变换的。这样势必要将应用层制定的导播方案传递到内核层,所以内核空间与用户空间之间的通信就成为本系统必不可少的一个环节。
在内核空间与用户空间通信的方法中,本系统选择了使用Netlink的通信方式来进行。Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC),也是Linux系统中网络应用程序与内核模块进行通信的常用的接口[4]。简单易用的套接字应用编程接口(API)是Netlink套接字的特点之一,并具有其他用户与内核进程间通信所缺少的很多特性,例如多播、I/O缓冲、全双工通信、异步通信等。和其他的进程间通信比较而言,这种在内核中增加新的特性的系统,Netlink套接字更加适合作为系统中用户空间与内核空间通信的方式。而且它还支持多点传送消息,既可以实现内核模块一点对一点的通信,也可以实现单一内核模块与多个用户空间进程的多点通信。这为内核向用户空间发布事件提供了一个非常有效的机制。
本系统在Netlink通信机制的设计中制定了内核层与用户层的数据交换规则和数据包派发规则等一系列操作,在这些操作中系统都设定为类似于Iptables式的命令行参数的方式来对规则进行添加、修改、删除等操作。这样本系统不仅可以通过用户空间的程序的界面对内核规则进行操作,也可以通过Linux的系统终端向内核层传递命令。
2.4 系统程序界面设计
系统程序界面采用QT软件进行设计,而视频播放插件则选用开源软件VLC(Video Lan Client)提供的视频播放接口。在用QT对系统界面进行设计时,主要是设计Netlink命令行参数与QT界面控件的接口,而VLC的接口函数则对系统播放的多播IP地址进行解析。
VLC是一个向用户公开代码的、多个平台都可以进行使用的视频播放器。在VLC中支持大量的音视频传输、封装和编码解码格式。从程序结构来看,VLC的可扩展性是相当优秀的。因为VLC的多平台的性质。它的绝大多数代码都是用高效的C语言来编写(少量的C++和汇编)的,但是仿照与Linux内核的模块机制,实现了完全动态的模块化功能,VLC的全部功能就连程序框架本身都是VLC中的模块,这样可以在VLC运行的时候进行载入。这些特性使得VLC在功能的扩展上具有更大优势并且易于维护。VLC的这个特点正适合本系统应用的视频播放接口。
3 小结
本系统的设计在Netfilter的框架下实现了视频软导播的功能。目前支持的视频编码只限于H.264的视频格式,系统可以根据不同的派发规则,实现视频导播的功能,在视频的流畅性与实时性都达到了很好的效果。
[1]韩春梅.基于MAX456的视频切换矩阵设计[J].电视技术,2004,28(3):91-93.
[2]胡安磊,周大水,李大兴.Linux中Netfilter/Iptables的应用研究[J].计算机应用与软件,2004,21(10):56-66.
[3]张建.服务器虚拟化在代理服务器上的应用[J].计算机系统应用,2011,20(7):146-149.
[4]周莉,柯健,顾小晶.Netlink套接字在Linux系统通信中的应用研究[J].计算机与现代化,2007(3):109-111.