蘇威積 杜 煒 李 劍
1(北京航天愛威電子技術有限公司 北京 100854)2 (北京郵電大學計算機學院 北京 100876)
隨著互聯(lián)網(wǎng)的發(fā)展,高效、安全地傳遞信息及實現(xiàn)信息的共享已成為現(xiàn)代社會發(fā)展的一個必要條件.視頻編碼系統(tǒng)作為視頻安防監(jiān)控系統(tǒng)[1]的一部分,對網(wǎng)絡有實時性的要求,是不允許網(wǎng)絡出現(xiàn)故障的.但網(wǎng)絡涉及到的環(huán)節(jié)非常多,任何一個環(huán)節(jié)出現(xiàn)問題都會導致整個網(wǎng)絡傳輸運行的停止.所以應該給用戶提供冗余的網(wǎng)絡、冗余的通道等確保網(wǎng)絡的暢通[2].在我們的視頻編碼系統(tǒng)里,編碼板與交換設備實現(xiàn)通信時,通過網(wǎng)線將它們的網(wǎng)口連接起來.其中,交換設備網(wǎng)口中的邏輯端口通過設置的硬件接口與編碼板設備實現(xiàn)數(shù)據(jù)傳輸.在網(wǎng)口中1個邏輯端口的通信通路出現(xiàn)故障時,可以切換至另一個邏輯端口的通信通路,實現(xiàn)直接、高效的網(wǎng)口故障防護.在視頻編碼系統(tǒng)中使用雙網(wǎng)口冗余方法[3]可以提高鏈路可靠性,冗余設備的成員能夠相互動態(tài)備份.當某一個鏈路中斷時其他成員可以迅速接替其工作,切換在1 s內(nèi)完成,而用戶并不會感覺到.
圖1 系統(tǒng)架構
現(xiàn)在實現(xiàn)雙網(wǎng)口冗余的通常做法是用戶設備上只設置1個硬件接口,通過特制的I轉(zhuǎn)2網(wǎng)線連接到交換設備的2個硬件接口上,交換設備上設置內(nèi)置或外置的開關器件.當交換設備的1個邏輯端口的通信通路發(fā)生故障時,通過切換開關,斷開故障邏輯端口這一通信通路的物理連接,將連接通路切換至另一個邏輯端口的通信通路,以保證數(shù)據(jù)的傳輸[4].這種方式用戶設備只要有1個接口即可,切換用的開關器件集成在交換設備上.但是由于開關器件的引入,將會影響信號傳輸?shù)目煽啃?,導致收發(fā)信號的實際波形無法達標.開關控制狀態(tài)變換常常引起各種信號震蕩,且開關器件本身的可靠性導致其電氣防護特性也是有限的,因此這種方式會導致交換設備本身的可靠性降低[5].所以我們需要通過軟件控制來使用雙網(wǎng)口冗余技術,以保證視頻編碼系統(tǒng)的穩(wěn)定性及實時性.
本文的目的是使用海思Hi353x開發(fā)板實現(xiàn)一種雙網(wǎng)口冗余的視頻編解碼系統(tǒng),使得該系統(tǒng)穩(wěn)定可靠[6].Hi3531是針對多路D雙網(wǎng)口1和多路高清DVR和NVR產(chǎn)品應用開發(fā)的一款專業(yè)高端SOC芯片.Hi3531內(nèi)置高性能雙核A9處理器、高達5路1080P實時多協(xié)議編解碼能力的引擎和專用TOE網(wǎng)絡加速模塊,并且支持2個GMAC接口,可以實現(xiàn)雙網(wǎng)口冗余.
本文采用的技術方案如下:
雙網(wǎng)口冗余采用的方法是交換設備上的2個邏輯端口分別對應2個硬件接口,2個硬件接口分別通過2根網(wǎng)線與交換設備上的2個硬件接口配合,連接成2個通路,2個通路互相冗余,一旦一個邏輯端口對應的通路壞掉,則可以自動切換至另一個邏輯端口對應的通路上去.這種雙網(wǎng)口冗余就是把2個網(wǎng)口當成1個網(wǎng)口使用,起到冗余的作用.
雙網(wǎng)口冗余[7]使用的技術是鏈路聚合技術,也稱為捆綁技術.其實是將幾條物理鏈路“組合”成邏輯上的一條數(shù)據(jù)通道,稱為1條聚合鏈路.將交換機與防火墻之間的2條物理鏈路link1和link2組成1條邏輯鏈路,該鏈路在邏輯上是一個整體,鏈路內(nèi)部組成和傳輸細節(jié)對上層是透明的,對外不再使用物理端口號fe1或fe2,而是使用冗余網(wǎng)口號(可命名為rd1).冗余網(wǎng)口對上層來說是一個整體,冗余設備由什么物理設備組成、物理設備之間如何進行協(xié)調(diào)動態(tài)備份,對上層都是透明的.冗余網(wǎng)口內(nèi)部聚合的物理鏈路共同完成收發(fā)任務并相互備份,只要還存在能正常工作的成員,整個傳輸鏈路就不會失效.也就是說如果link1失效,它的任務會迅速轉(zhuǎn)移到link2上,因此編碼板與交換設備之間的連接不會中斷.這種實現(xiàn)雙網(wǎng)口冗余的技術簡單易用,很適用于雙接口的設備上.
在本系統(tǒng)中,整個雙網(wǎng)口冗余的視頻編解碼系統(tǒng)包括視頻編碼模塊、視頻解碼模塊、冗余網(wǎng)絡模塊和IO傳輸模塊,如圖1所示.
在視頻編碼模塊,我們使用了海思Hi3531開發(fā)板進行視頻編碼,編碼模塊主要由圖2所示的4個部分組成,分別為視頻輸入、視頻處理、視頻編碼、視頻輸出[8].
1) 視頻輸入(VI).將芯片外的視頻數(shù)據(jù),通過ITU-R BT656/601/1120接口或digital camera接口,存入到指定的內(nèi)存區(qū)域.在此過程中,VI可以對接收到的原始視頻圖像數(shù)據(jù)進行裁剪、水平垂直縮小和水平垂直翻轉(zhuǎn),并輸出多個不同分辨率的視頻流及對應的直方圖信息.
2) 視頻處理(VPSS).該部分完成視頻的圖像增強、去噪、De-Interlace、OSD疊加、銳化等功能.也就是對輸入的視頻進行前期的處理.
3) 視頻編碼(VENC).本部分支持多路實時編碼,且每路編碼彼此獨立,編碼協(xié)議和編碼profile可以不同.在支持視頻編碼的同時,調(diào)度VPP模塊對視頻圖像進行視頻前處理,調(diào)度REGION模塊對編碼圖像內(nèi)容進行疊加和遮擋.VENC的數(shù)據(jù)流程如圖3所示.
其中編碼通道可分為主編碼通道和次編碼通道,能夠同時輸出2路碼流:一路主碼流,另一路為次碼流.
4) 視頻輸出(VO).該部分是本模塊的最后一步,輸入的視頻經(jīng)過VNEC模塊編碼后,由輸出模塊傳給交換設備,在這個過程中采用雙網(wǎng)口冗余來進行傳輸,保證了傳輸?shù)目煽啃?
圖2 視頻編碼模塊
圖3 VENC的數(shù)據(jù)流程圖
這4個部分組成了本系統(tǒng)的視頻編碼模塊,完成了視頻從輸入到編碼、再輸出的整個過程.
在視頻解碼模塊,我們使用了海思Hi3536開發(fā)板進行視頻編碼,解碼模塊主要由圖4所示的4個部分組成,分別為視頻輸入、視頻處理、視頻解碼、視頻輸出[9].
1) 視頻輸入(VI).將芯片外的視頻數(shù)據(jù),也就是視頻編碼模塊得到編碼后的視頻通過IO模塊傳輸過來,存入到指定的內(nèi)存區(qū)域.
圖4 視頻解碼模塊
2) 視頻處理(VPSS).該部分完成視頻的圖像增強、去噪、De-Interlace、OSD疊加、銳化等功能.也就是對輸入的視頻進行前期的處理,同編碼模塊的視頻處理部分.
3) 視頻解碼(VDEC).本部分支持多路實時解碼,且每路解碼彼此獨立,解碼協(xié)議和解碼profile可以不同.其中解碼通道可分為主編碼通道和次編碼通道,能夠同時輸出2路碼流:一路主碼流,一路為次碼流.
4) 視頻輸出(VO).該部分是本模塊的最后一步,輸入的視頻經(jīng)過VDEC部分解碼以后,由輸出模塊傳給屏幕.
這4個部分組成了本系統(tǒng)的視頻解碼模塊,完成了視頻從輸入到解碼、再輸出的整個過程,將由編碼模塊傳來的視屏解碼后輸出到屏幕上,完成了視頻安防監(jiān)控系統(tǒng)的最后部分,保障了視頻監(jiān)控系統(tǒng)的穩(wěn)定性.
雙網(wǎng)口配置設置虛擬為一個網(wǎng)口,實現(xiàn)網(wǎng)口的冗余,其中一個網(wǎng)口壞掉后網(wǎng)絡通信仍可正常使用,實現(xiàn)網(wǎng)口層面的負載均衡和高可用性[10].
主要是在Linux開發(fā)板上進行配置,具體步驟如下:
1) 進入網(wǎng)口配置目錄;
2) 創(chuàng)建雙網(wǎng)口綁定配置文件;
3) 修改綁定網(wǎng)口(建議:在網(wǎng)口綁定前,先對先前的網(wǎng)口配置信息進行備份),分別修改網(wǎng)口1和網(wǎng)口2的配置;
4) 配置modprobe參數(shù);
5) 關閉網(wǎng)絡管理程序.
在本模塊里我們采用了select[11]模型,這是一種IO多路復用模型.一般網(wǎng)絡程序,使用accept,recv等接口.則服務端,在調(diào)用accept時,如果此時沒有客戶端連接則服務端需要等待.recv也是一樣.這種情況下服務端只能阻塞等待.select模塊,則是使用select函數(shù)去查詢你使用到的socket的狀態(tài).比如,是否有客戶端連接,是否有客戶端發(fā)送數(shù)據(jù).這樣可以針對有數(shù)據(jù)的socket進行操作.避免盲目等待.
最主要的一個函數(shù)就是select函數(shù).該函數(shù)有5個參數(shù).
maxfdp:是一個整數(shù)值,是指集合中所有文件描述符(socket)的范圍,即所有文件描述符的最大值加1.
readfds,writefds,errorfds都是fd_set類型的指針,是1個socket的數(shù)組指針.
readfds:進行可讀操作查詢的文件描述符的集合,不需要讀操作,則可傳入NULL.
writefds:進行可寫操作查詢的文件描述符的集合,不需要寫操作,則可傳入NULL.
errorfds:進行文件異常錯誤查詢的文件描述符,也可以傳入NULL.
timeout:第一,若將NULL以形參傳入,即不傳入時間結(jié)構,就是將select置于阻塞狀態(tài),一定等到監(jiān)視文件描述符集合中某個文件描述符發(fā)生變化為止;第二,若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函數(shù),不管文件描述符是否有變化,都立刻返回繼續(xù)執(zhí)行;第三,timeout的值大于0,這就是等待的超時時間,即select在timeout時間內(nèi)阻塞,超時時間之內(nèi)有事件到來就返回,否則在超時后不管怎樣一定返回.
返回值:如果有錯誤,則返回值為-1,如果超時返回則返回值為0,如果文件描述符里面有變化,則返回值大于0.
本文描述了一種雙網(wǎng)口冗余的視頻編碼方法及系統(tǒng),是安防視頻系統(tǒng)的一部分,所以要求高實時性和高穩(wěn)定性.我們將視頻通過Hi3531進行視頻編碼后傳給IO模塊輸出,在輸出過程中我們采用了select多路復用實現(xiàn)多路傳輸,并利用冗余模塊保證了一個網(wǎng)口斷掉,視頻可以在另一個網(wǎng)口上繼續(xù)傳輸,視頻傳輸?shù)紿i3536進行解碼,最終輸出到屏幕上.
[1]雷玉堂. 安防視頻監(jiān)控實用技術[M]. 北京: 電子工業(yè)出版社, 2012
[2]丁鑫. 基于網(wǎng)絡冗余技術的應用[J]. 工業(yè)控制計算機, 2014, 27(5): 162-162
[3]王華, 劉冰, 劉煥敏, 等. 一種雙網(wǎng)實時串口通信的設計與實現(xiàn)[J]. 計算機系統(tǒng)應用, 2017, 26(3): 234-238
[4]劉錫祥, 徐曉蘇, 劉建娟, 等. VxWorks環(huán)境下基于TCP/IP協(xié)議的多網(wǎng)卡數(shù)據(jù)傳輸與雙網(wǎng)卡冗余設計[J]. 工業(yè)儀表與自動化裝置, 2006, 36(3): 30-32
[5]張士民. 基于TCP/IP網(wǎng)絡環(huán)境下網(wǎng)卡冗余熱備的實現(xiàn)[J]. 信息技術與信息化, 2016, 41(11): 26-28
[6]皮玉華. 基于海思Hi3531的高清視頻解碼器硬件系統(tǒng)設計[J]. 中國公共安全: 學術版, 2016, 15(2): 124-126
[7]劉玉賓. 基于VxWorks的雙冗余熱切換以太網(wǎng)的設計與實現(xiàn)[D]. 天津: 天津大學, 2008
[8]于鳳. 基于Hi3511的H.264編解碼器的設計與實現(xiàn)[D]. 西安: 西安電子科技大學, 2013
[9]馬林. 基于 H.264的遠程視頻傳輸軟件系統(tǒng)的開發(fā)[D]. 長春: 吉林大學計算機科學與技術學院, 2014
[10]王哲梁. 基于嵌入式Linux的遠程視頻監(jiān)控系統(tǒng)[D]. 杭州: 杭州電子科技大學, 2014
[11]劉運強, 王匯源. Socket和多線程在視頻傳輸中的應用[J]. 山東大學學報: 工學版, 2004, 34(2): 46-50