吳天亭,杜 鴻,文成玉,滿 宇
(成都信息工程學院,四川 成都610225)
隨著視頻采集和傳輸技術的發展,遠程可視化指揮手段已廣泛應用于指揮控制系統,視頻軟導播系統是運行在通用計算機和網絡環境中的一種導播軟件,它接收來自監控點的H.264格式的壓縮視頻流,在導播計算機中解碼并顯示,操作員可根據需要將其中幾路視頻流轉發給解碼顯示設備,實現視頻流的接收與派發的功能,它為指揮員提供熱點視頻導播和顯示的核心手段。目前的視頻導播系統一般由視頻處理裝置和轉用硬件切換矩陣構成。視頻切換矩陣可以從多路輸入視頻信號中選擇出一路或多路送往視頻處理裝置,如視頻捕獲卡、壓縮視頻流解碼器和監視器等[1]。這種基于專用硬件的導播系統存在的問題是,較為復雜的模擬信號布線帶來可靠性方面的隱患,從導播中心到顯示設備間的距離受模擬視頻信號傳輸能力的約束,模擬視頻傳輸易受環境電磁干擾而影響圖像質量。
在一些有設備和布線空間限制,有抗電磁干擾能力要求的指揮系統中,硬件導播系統存在的缺陷使得它難以勝任應用需求。這也是軟導播系統的研發動機。相對硬導播系統而言,軟導播系統是一個具有視頻解碼、監控和視頻流重定向功能的軟件系統,運行在通用計算機中,視頻流的輸入輸出都通過網絡系統傳輸,不需通過模擬視頻電纜;導播輸出網絡壓縮視頻流由終端指揮顯示設備直接解碼并顯示。軟導播系統工作在純網絡環境中,布線簡單;導播輸出視頻流為網絡化壓縮視頻流,不受傳輸距離限制,抗電磁干擾能力較強。
在本系統當中,由于計算機性能與網絡帶寬等限制,在單臺計算機上本系統可以接收八路視頻流,并且可以轉發四路視頻流。當多臺計算機同時使用本系統時,通過本系統中的多機協調機制,可以實現更多路視頻的接收與派發。接收為8×N路視頻流,派發為4×N路視頻流。其中N為正在使用本系統的計算機的數量。
在視頻軟導播系統的總體設計中,它的前端由具有將模擬視頻流編碼成IP組播網絡視頻流能力的編碼器和模擬視頻源構成。后端由具有將IP多播網絡視頻流解碼為通過RCA接口進行播放的解碼器和視頻播放器組成。整體結構如圖1所示。
本系統的使用環境如下:
1)支持多播轉發的交換機:該交換機用來連接多播視頻發生源與視頻接收客戶端與多播視頻轉發服務器。

圖1 視頻軟導播系統結構
2)多播轉發服務器:安裝有Linux操作系統的計算機主機。該端用于視頻多播的接收和轉發,該端必須具有對多播視頻的接收功能,只有接收到多播視頻才可以實現將接收到的視頻轉發到視頻接收端,即運行視頻軟導播系統的主機。
3)多播視頻發生源(多播視頻服務器):該端用于視頻多播信號的產生。
4)視頻接收端(多播視頻客戶端):該端用于對多播轉發服務器轉發的多播視頻的接收。
視頻軟導播系統是將經過編碼的IP組播網絡視頻源在用戶界面上進行實時播放,并且根據實際要求對所接收到的視頻流進行派發。派發的目的地點根據用戶的選擇而進行改變,接收到派發視頻的用戶可以實時地對視頻進行播放。
本系統的設計基于Linux系統平臺中的Netfilter架構。整個系統的設計分為3個部分:第一部分是內核層網絡驅動的設計,主要實現的是對多機協調時數據包傳輸的幀格式的設計,對流經本機的視頻流的截獲、封裝和派發規則的設定,并且編寫用戶空間使用的API;第二部分是應用層的系統指揮控制界面的設計,主要實現的是對視頻流的播放控制與派發作用,還有應用層視頻解碼監控及導播控制模塊的設計;第三部分是內核層與應用層之間的通信,由于在應用層涉及到對視頻進行界面操作的設計,而且應用層不能對內核層進行直接操作,所以要將用戶空間的用戶口令傳達到內核空間,因此要用到內核層與應用層之間的通信。況且在多機協調的過程中也涉及到內核與用戶層之間的通信,以實現多臺計算機可靠并有效地進行工作。
軟件的系統結構圖如圖2所示,IPSWITCH.KO為自行開發的內核驅動程序的模塊名稱。

圖2 軟件系統結構
視頻軟導播的設計思想的核心是在內核層對截獲的數據包就行修改,封裝達到對數據包進行自由派發的目的。與此同時,對數據流量與實時性又有很高要求。所以Linux系統中的Netfilter架構成為了本系統首選的切入點。Netfilter的設計并不相關于某個確定的協議,而是在協議棧中為每個網絡協議定義一套唯一的鉤子函數,也就是HOOK函數。在數據包經過協議棧的這些掛接點時,鉤子函數被系統調用,在這些鉤子函數的掛接點中,數據報被協議棧及鉤子函數標號作為參數,傳遞給Netfilter框架。對于它在網絡堆棧中增加的這些HOOK。內核的任何模塊可以對每種協議的一個或多個HOOK進行注冊,實現掛接。這樣當某個數據報被傳遞給Netfilter框架時,內核能檢測到是否有任何模塊對該協議和HOOK函數進行了注冊,若注冊了,則調用該模塊的注冊時使用的回調函數,這樣這些模塊就有機會檢查、修改、丟棄該數據報及指示Netfilter將該數據報傳入用戶空間的隊列[2]。這一設計思想符合本系統的設計理念。
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這個節點之前的。這樣就可以讓數據包既流經本機又可以對數據包直接進行修改,然后發送出去。其中,對數據包的截獲和發送時修改的參數都是由用戶空間傳遞給內核層的。
多機協調機制借鑒于Netfilter框架的連接跟蹤機制。所謂連接跟蹤機制就是跟蹤并且記錄連接狀態。Linux為每一個經過網絡堆棧的數據包,生成一個新的連接記錄項[3]。此后,所有屬于此連接的數據包都被唯一地分配給這個連接,并標識連接的狀態。連接跟蹤是防火墻模塊的狀態檢測的基礎。
本系統的多機協調機制即利用Netfilter固有的連接跟蹤機制,然后多臺主機的視頻軟系統共同維護一張視頻軟導播派發表。在這張表格上記錄接收的視頻源的地址與轉發的視頻流的目的地址,并且對應視頻源地址與轉發目的地址。這樣在視頻進行轉發時,系統首先查詢該表,針對該表中的已有記錄項確定是否進行接收與派發。當該主機確定進行接收或者派發的步驟后,那么該系統將會把新的接收與派發規則更新入該表格。這樣就可以很好地實現多機互動,有效地進行更多路視頻的導播功能。
因為不同的時間系統的視頻播放和導播方案可能會不同,對于內核空間來說系統的導播方案是變換的。這樣勢必要將應用層制定的導播方案傳遞到內核層,所以內核空間與用戶空間之間的通信就成為本系統必不可少的一個環節。
在內核空間與用戶空間通信的方法中,本系統選擇了使用Netlink的通信方式來進行。Netlink套接字是用以實現用戶進程與內核進程通信的一種特殊的進程間通信(IPC),也是Linux系統中網絡應用程序與內核模塊進行通信的常用的接口[4]。簡單易用的套接字應用編程接口(API)是Netlink套接字的特點之一,并具有其他用戶與內核進程間通信所缺少的很多特性,例如多播、I/O緩沖、全雙工通信、異步通信等。和其他的進程間通信比較而言,這種在內核中增加新的特性的系統,Netlink套接字更加適合作為系統中用戶空間與內核空間通信的方式。而且它還支持多點傳送消息,既可以實現內核模塊一點對一點的通信,也可以實現單一內核模塊與多個用戶空間進程的多點通信。這為內核向用戶空間發布事件提供了一個非常有效的機制。
本系統在Netlink通信機制的設計中制定了內核層與用戶層的數據交換規則和數據包派發規則等一系列操作,在這些操作中系統都設定為類似于Iptables式的命令行參數的方式來對規則進行添加、修改、刪除等操作。這樣本系統不僅可以通過用戶空間的程序的界面對內核規則進行操作,也可以通過Linux的系統終端向內核層傳遞命令。
系統程序界面采用QT軟件進行設計,而視頻播放插件則選用開源軟件VLC(Video Lan Client)提供的視頻播放接口。在用QT對系統界面進行設計時,主要是設計Netlink命令行參數與QT界面控件的接口,而VLC的接口函數則對系統播放的多播IP地址進行解析。
VLC是一個向用戶公開代碼的、多個平臺都可以進行使用的視頻播放器。在VLC中支持大量的音視頻傳輸、封裝和編碼解碼格式。從程序結構來看,VLC的可擴展性是相當優秀的。因為VLC的多平臺的性質。它的絕大多數代碼都是用高效的C語言來編寫(少量的C++和匯編)的,但是仿照與Linux內核的模塊機制,實現了完全動態的模塊化功能,VLC的全部功能就連程序框架本身都是VLC中的模塊,這樣可以在VLC運行的時候進行載入。這些特性使得VLC在功能的擴展上具有更大優勢并且易于維護。VLC的這個特點正適合本系統應用的視頻播放接口。
本系統的設計在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.