閆 軍,代豐羽,王紹雷
(中國電子科技集團公司第三十四研究所,廣西 桂林 541004)
近年來隨著視頻技術、網(wǎng)絡技術以及終端處理技術的不斷發(fā)展,人們對多媒體業(yè)務的需求呈現(xiàn)日益增長的趨勢,據(jù)調(diào)查顯示,目前網(wǎng)絡視頻數(shù)據(jù)量占據(jù)了整個互聯(lián)網(wǎng)流量的90%,其中高清視頻正在逐漸成為未來應用和發(fā)展的重點[1-3]。然而,在不斷提升視頻質(zhì)量的同時也導致圖像數(shù)據(jù)量呈現(xiàn)幾何式的增長,這也使得視頻編解碼技術成為目前多媒體研究領域的熱門技術之一。
目前,傳統(tǒng)的視頻編解碼器由于性能的限制并不具備高清視頻數(shù)據(jù)的處理能力[4,5],HI3531A是海思半導體針對多路D1和高清DVR、NVR產(chǎn)品應用開發(fā)推出的一款專業(yè)高端SOC芯片,具有高集成、高性能、多協(xié)議編解碼和專用網(wǎng)絡加速等優(yōu)點,可輕松應對越來越高的高清應用和網(wǎng)絡需求[6,7]。本文基于HI3531A芯片,結合H264視頻壓縮技術、嵌入式技術和網(wǎng)絡技術,提出了網(wǎng)絡高清視頻編解碼系統(tǒng)的設計方案。
高清視頻編解碼器同時具備編碼、解碼、傳輸、存儲等功能,圖1為該高清視頻編解碼器的硬件組成框圖。
圖1 高清視頻編解碼器硬件組成框圖
各個模塊的功能如表1所示。
表1 硬件模塊功能表
編碼模塊的設計需要調(diào)用海思媒體處理函數(shù)庫和Linux系統(tǒng)函數(shù),完成編碼器視頻輸入、編碼、網(wǎng)絡傳輸、本地回顯等功能,軟件設計的流程如圖2所示。
圖2 編碼器軟件設計流程圖
在該處理流程中視頻信號由輸入設備(VI)接收進入輸入通道,輸入通道與視頻前處理單元(VPSS)的通道組連接,在VPSS通道組中對視頻信號進行去噪、縮放、銳化等統(tǒng)一預處理,形成多種不同分辨率的圖像輸出。輸出的圖像信號分別輸送到兩個方向:
一是經(jīng)過輸出(VO)通道傳輸給輸出設備進行本地回顯;二是經(jīng)過編碼(VENC)通道進入編碼器進行視頻編碼,如圖3所示。
編碼模塊的軟件設計中涉及到三個關鍵線程,編碼線程、數(shù)據(jù)發(fā)送線程和存儲線程。其中,編碼線程由碼率控制器和編碼器協(xié)同完成圖像信號到碼流的轉(zhuǎn)換;數(shù)據(jù)發(fā)送線程對碼流數(shù)據(jù)進行IP包封裝(TCP/UDP數(shù)據(jù)包)和傳輸,采用嵌入式系統(tǒng)自帶的socket套接字完成;存儲線程完成碼流數(shù)據(jù)的本地存儲,可以按照自定義存儲協(xié)議執(zhí)行。三個線程之間相互協(xié)作,利用各自的緩存片區(qū)來完成整個編碼、傳輸、存儲過程,具體的流程如圖4所示。
圖3 視頻信號處理過程
圖4 編碼器三線程協(xié)作圖
解碼模塊同樣由三個線程組成:一個主線程和兩個子線程。主線程完成解碼程序環(huán)境參數(shù)的配置并對整個解碼過程進行控制;子線程1負責從網(wǎng)絡中接收碼流數(shù)據(jù)包;子線程2負責對碼流數(shù)據(jù)包進行解碼并將解碼后的數(shù)據(jù)發(fā)送給輸出設備。
在解碼器的設計過程中采用“流式發(fā)送”的方式,每次將任意長度的碼流發(fā)送給解碼器,由解碼器內(nèi)部完成一幀碼流的識別過程,這樣可以降低因為不夠一幀而出現(xiàn)解碼錯誤的概率,從而加快解碼的速度,提高解碼的正確性。此外,本設計還將解碼過程和網(wǎng)絡接收功能獨立開來,采用雙線程處理的方式來避免碼流數(shù)據(jù)的激增造成數(shù)據(jù)大量溢出,從而導致解碼后圖像質(zhì)量下降的情況。
網(wǎng)絡接收線程與視頻解碼線程之間采用環(huán)形緩存區(qū)的方式進行數(shù)據(jù)的交換。在環(huán)形緩存區(qū)中又分成若干個鏈表隊列,每個隊列可以存放數(shù)幀圖像數(shù)據(jù),該環(huán)形緩存區(qū)對數(shù)據(jù)交換的執(zhí)行算法如下所述。
定義1.環(huán)形緩存區(qū)由鏈表數(shù)量、鏈表項、出鏈、入鏈組成,可表示為一個四元組:Z=(n,list,ar,aw),其中l(wèi)ist=(id,len,mem)是鏈表項list的編號id,緩存數(shù)據(jù)長度len(len≤maximum)和緩存數(shù)據(jù)值mem,ar=(id,ex)是出鏈ar的編號id和動作ex,aw=(id,len)是入鏈aw的編號id和長度len。
定義2.如果環(huán)形緩存區(qū)Z的出鏈編號ar(id)等于入鏈編號aw(id),則出鏈動作ar(ex)停止,否則繼續(xù),即
Z:ar(id)=aw(id)→ar(ex)=false
ar(id)≠aw(id)→ar(ex)=true
定義3.如果出入鏈ar/aw的當前編號id等于list(n),則出入鏈的下一編號為list(1)。
圖5 環(huán)形緩存數(shù)據(jù)交換圖
假設當前環(huán)形緩存區(qū)在鏈表j,當前數(shù)據(jù)項為data(len,buf),其中l(wèi)en為數(shù)據(jù)長度,buf為數(shù)據(jù)緩存,則入鏈的執(zhí)行過程如下:
init:aw(id)=j
aw(len)=0
whiletrue
ifaw(len)+data(len)≤maximum
copydata(buf)tolistj(mem)
aw(len)=aw(len)+data(len)
else
listj(len)=aw(len)
break
endif
假設當前環(huán)形緩存區(qū)在鏈表i,每次拷貝到網(wǎng)絡包packet中的長度為length,則出鏈的執(zhí)行過程如下:
init:ar(id)=i
ifaw(ex)=true
whiletrue
iflisti(len)>0
copylistj(mem)topacket
listj(len) =listj(len)-length
else
break
endif
為了測試編解碼器的有效性、可靠性和實時性,首先搭建了視頻編解碼器的工作環(huán)境,通過設置配置文件中的各種運行參數(shù),來測試在不同應用環(huán)境中編解碼器的性能。本設計選取分辨率為1920*1080、1280*720的圖像,以VGA和SDI作為輸入,解碼輸出選取VGA和HDMI接口。
其次,為了測試存儲日志的質(zhì)量,系統(tǒng)還移植了FTP和WEB服務器,利用VLC進行遠程播放。通過設置配置文件的的輸出地址和網(wǎng)絡協(xié)議,可以將編碼后的碼流傳輸給上位機,在PC端利用VLC播放軟件直接進行解碼輸出。
為增加測試用例的難度,VGA輸入接口的測試視頻選取了運動性很強且背景復雜的MTV,測試結果如表2所示。
表2 測試結果
測試結果表明,該高清視頻編解碼器針對不同的場景,能夠保證畫面清晰流暢,實時性能良好,延遲在預定的范圍內(nèi)。
本文提出了一種網(wǎng)絡高清視頻編解碼解決方案,能夠?qū)?080p/720p等高清分辨率的視頻進行采集、編解碼、存儲、傳輸和播放,其具有實時性好,清晰度高,延遲低等優(yōu)點,目前該設計方案已被應用到某設備的視頻編解碼存儲矩陣中,運行效果良好。下一步希望能夠在此基礎上對視頻流進行實時分析和遠程傳輸,實現(xiàn)智能監(jiān)控和遠程播放的功能。