楊 澤,裴海龍
(華南理工大學 自主系統與網絡控制教育部重點實驗室,廣東 廣州510640)
實時視頻傳輸技術在人們生活和工作中的應用越來越多,如遠程監控、遠程教學、電視電話會議等。在對成本、空間、功耗和體積要求較為嚴格的工程應用中,嵌入式平臺因小巧、軟硬件可裁剪具有不可替代的優點,這使得以嵌入式為平臺的多媒體系統成為當今工程實現及學術研究的熱點之一。但視頻信息具有信息量大、對計算資源需求高的特點[1,2],導致嵌入式實時視頻往往圖像分辨率低,幀率小,應用效果較差。因此必須對采集到的原始視頻信息進行壓縮,同時又要考慮嵌入式設備計算資源的約束。本文為解決上述問題,采用了ARM和DSP雙內核完成視頻采集和基于H.264的視頻壓縮,大大加快了圖像壓縮速度,同時減輕了ARM的計算負擔。系統基于實時流傳輸協議 (real time streaming protocol,RTSP)搭建流媒體服務器,將壓縮后的視頻有效傳輸至遠程計算機上解碼顯示。本系統目前已經用于實驗室無人機監控平臺,取得了很好的實驗效果。
硬件組成
本系統的硬件平臺主要由嵌入式核心板、底板、USB彩色攝像頭和遠程計算機組成。嵌入式核心板選用以色列Compulab公司生產的CM-T3530(如圖1(a)所示)。該核心板體積小,僅66mm*44m*5mm,功耗低 (0.2-2w),搭載的OMAP3530處理器集成了720MHZ的Cortex-A8 ARM內核和520MHZC64x+DSP內核,同時核心板還有NAND FLASH、WIFI模塊等,圖形計算能力強,支持運行Linux、WinCE操作系統,并且具有硬件可擴展結構。底板 (如圖1(b)所示)為自行開發,該底板提供有核心板插槽、普通USB接口、高速USB接口、調試口、串口、網口、核心板供電及外設供電接口等。經測試核心板在上述底板上運行穩定可靠,很好的滿足了系統開發和運行的需求,。由于Linux內核中包含UVC(USB video class)模塊及USB設備驅動,可使用V4L2(video for linux version 2)對攝像頭進行操作,因此本系統攝像頭設備選用支持UVC的即插即用USB攝像頭即可。這里我們選用羅技高清攝像頭C270,其最高支持分辨率為720P視頻采集,且支持自動對焦,具有較好的成像效果。系統的遠程計算機裝有Ubuntu操作系統,用于調試開發工作及實時視頻的解碼顯示。整個系統硬件平臺如圖2所示。

圖1 核心板與底板

圖2 系統硬件平臺
在視頻實時傳輸過程中,嵌入式系統首先打開攝像頭設備并配置攝像頭參數,然后創建采集壓縮函數供RTSP流媒體服務器循環調用。在采集壓縮函數中,采集得到的原始視頻幀放到采集傳輸進程和調用DSP壓縮的進程共享的內存空間中,經DSP壓縮后再次放回共享內存區,然后被RTSP流媒體服務器放入發送緩沖區。RTSP流媒體服務器會為該視頻流創建網絡訪問地址,供遠程計算機訪問。在遠程計算機端,使用具備H.264解碼能力的播放器訪問視頻流網絡地址即可實時觀看遠程攝像頭采集到的信息。系統整體流程如圖3所示。

圖3 系統軟件流程
為使本系統外接攝像頭可方便更換以滿足不同環境的需求,同時使代碼易于移植,系統采用基于V4L2(video for linux version 2)的圖像采集程序。V4L2是Linux內核中專門用于視頻設備的驅動,它為程序員提供了訪問視頻設備的通用接口[3,4],包括視頻設備的打開、設備屬性的獲取與設置、圖像的獲取等。當系統需要更換攝像頭時,只需要編譯相應設備的驅動模塊添加到Linux內核即可而不需要修改系統程序,這樣大大方便了系統的開發與擴展。基于V4L2的圖像采集程序流程[5]如圖4所示,具體步驟如下文所述。

圖4 圖像采集流程
(1)打開設備文件。int fd=open (“/dev/video0”,O_RDWR);Linux操作系統中,由V4L2驅動的視頻設備節點文件通常是/dev/videoX。
(2)取得設備屬性,ioctl(fd,VIDIOC_QUERYCAP,&cap),變量cap為struct v4l2_capability類型;設置視頻格式,ioctl(fd,VIDIOC_S_FMT,&fmt),變量fmt為struct v4l2_format類型。
(3) 向 驅 動 申 請 幀 緩 沖,ioctl(fd,VIDIOC _REQBUFS,&reqbuf),變量reqbuf為 struct v4l2_requestbuffers類型;申請物理內存 (內存映射),調用calloc函數向用戶空間申請相同數目的幀緩沖,并使用mmap內存映射方式將幀緩沖映射到用戶空間。
(4)將申請的幀緩沖放入用于存放采集到視頻幀的隊列,ioctl(fd,VIDIOC_QBUF,&buf)。然后調用ioctl(fd,VIDIOC_STREAMON,&type),type是enum v4l2_buf_type枚舉類型。
(5)出隊列以取得采集到的視頻幀,ioctl(fd,VIDIOC_DQBUF,&buf)。如果需要循環,則將buf重新放入隊列并反復獲取幀緩沖中的數據。
2.2.1 H.264算法分析
H.264視頻壓縮技術是現在世界上最新的圖像編解碼標準,它以低碼率、高清晰的特點能夠持續提供高質量的視頻[6]。在本系統選擇編碼器時,調用FFMPEG軟件中的MPEG4和H.264進行了壓縮率的對比。在相同的幀間和幀內預測選擇參數情況下,H.264壓縮率是普通MPEG4的4倍左右,同時視頻圖像更加穩定。因此系統選用H.264作為視頻壓縮算法,H.264壓縮流程如圖5所示。

圖5 H.264編碼流程
H.264算法包含了幀內編碼和幀間編碼。為保證系統圖像質量并縮短壓縮時間,本文對 H.264算法中的IntraFrameInterval參數,即幀內幀間模式選擇參數進行了調試,以選擇最適合性能要求的參數值。經過試驗,最終將IntraFrameInterval參數設置為1,即僅采用幀內編碼,這樣獲得的圖像清晰度高、圖像壓縮時間短,且壓縮率仍在35倍左右。H.264主要參數如下所示:
Params->inputHeight=480;//系統最大支持480,實驗調試還包括120、240;
Params->inputWidth=640;//系統最大支持720,實驗調試還包括160、320
Params->targetFrameRate=30000;
Params->refFrameRate=Params->targetFrameRate;
Params->targetBitRate=4000000;
Params->intraFrameInterval=1;//僅選用幀內編碼
Params->generateHeader=XDM_ENCODE_AU;
Params->captureWidth=0;//以圖像寬作為間距(寬大于高時)
Params->forceFrame=IVIDEO_NA_FRAME;//-1;
Params->interFrameInterval=1;//不支持B幀
2.2.2 調用DSP實現壓縮
盡管與其他編碼器相比,H.264的壓縮效率非常突出,但帶來的問題是其算法復雜度也大大提高[7],對系統的計算資源提出了更高的要求。本文在選用DSP實現H.264圖像壓縮前,首先在ARM平臺運行的Linux操作系統上通過調用交叉編譯的FFMPEG和X264庫實現H.264圖像編碼。經實驗觀察,在壓縮分辨率僅為160*120大小的視頻流時,平均每幀仍需耗時90~105ms,視頻實時性很差。而且壓縮任務占用了大量ARM運算資源影響了系統其它程序的運行,因此尋求實現快速的H.264壓縮方法是實時視頻處理的關鍵因素之一。DSP具有強大的數字信號處理能力,在一個DSP上可以同時進行多路音視頻信號的壓縮處理。而且DSP產品成熟,開發周期短,可以實現快速技術更新和產品換代。所以本系統使用TI公司OMAP3530處理器中的DSP核實現視頻的H.264壓縮,這樣大大節約了視頻壓縮時間,并減輕了ARM核的運算壓力。
系統對DSP的調用使用TI-DVSDK (digital video software development kit)進行開發。DVSDK是TI公司推出的一款軟件,作用是建立ARM與DSP之間的聯系,它包含了引導加載 (u-boot)、編解碼器引擎多媒體堆棧、達芬奇多媒體接口 (DMAI)、多媒體編解碼器等部件,目前支持的視頻解碼格式有 H.264,MPEG-2,MPEG-4,編碼格式有H.264,MPEG-4。利用DVSDK我們能夠很快搭建出滿足系統要求的H.264視頻壓縮環境,本系統單獨編寫了基于DVSDK的程序負責完成視頻的壓縮任務,與系統主要進程間采用共享存儲方式進行數據共享與通信[8],兩個進程的流程圖如圖6所示。經實驗證明,系統對分辨率160*120的視頻幀平均壓縮時間僅為每幀5~7ms,很好的滿足了實時性要求。

圖6 視頻壓縮流程
為完成兩個進程的通信,進程需要先調用shmget(key_t key,size_t size,int flag)來創建新的共享存儲段或引用一個現存的共享存儲段,同時獲得共享存儲ID,再調用shmat(int shmid,const void*addr,int flag)來將共享存儲段連接到自身的地址空間中。在獲取共享存儲后,調用DSP的進程就可以直接從共享存儲中讀取圖像和寫入壓縮后的圖像。
從共享存儲讀取圖像到待壓縮緩沖區:

將輸入緩沖區圖像壓縮,并輸出至輸出緩沖區:
retVal=VIDENC1_process(enc,&inputBufDesc,&outputBufDesc,&inArgs,&outArgs);
將壓縮后的圖像放入共享存儲:

壓縮結束后,視頻采集與傳輸的進程會獲取壓縮后的圖像,使其經流媒體服務器傳輸至遠端。
本系統最初采用基于TCP的Socket編程實現視頻的傳輸功能,由于TCP的可靠連接特性,視頻卡頓現象嚴重,無法滿足實時性要求。而簡單的UDP套接字又無法保證有效傳輸,因此系統選用控制聲音或視頻傳輸的多媒體流協議作為服務器協議。RTSP(real time streaming protocol),實時流傳輸協議,在TCP/IP體系結構中位于RTP (realtime transport protocol)和 RTCP (RTP control protocol)之上,是一個應用層協議 (如圖7所示),其數據傳輸部分使用RTP或RTCP來完成[9]。該協議可以控制多個數據發送連接,并為連接選擇發送通道,從而保證流媒體傳輸的高效性。

圖7 RTSP體系的各層
系統使用開源的LIVE555項目實現RTSP流媒體服務器的搭建。LIVE555是一個專門為流媒體提供解決方案的跨平臺開源項目,其支持的流媒體傳輸協議有RTP/RTCP、RTSP、SIP等。該項目的源代碼包括4個基本的庫和各種測試代碼,4個基本的庫分別是:UsageEnvironment,GroupSock, LiveMedia 和 BasicUsageEnvironment[10]。UsageEnvironment模塊是對系統環境的抽象,包括抽象類UsageEnvironment、TaskScheduler和HashTable,前兩個類用于調度已推遲事件,配置異步讀取事件的句柄以及輸出錯誤和警告信息,HashTable類定義了一個通用的哈希表的接口供其它代碼調用。GroupSock類實現了對網絡接口和套接字的封裝,并且專門封裝了一個套接字用于發送接收廣播。LiveMedia庫定義了一系列從Medium類衍生的類,以支持多種流媒體和編碼器類型。BasicUsage-Environment是UsageEnvironment類的一個子類,用于簡單的控制臺應用程序。測試代碼的文件夾包含了利用上述基本庫編寫的多種流媒體協議客戶端與服務器實現程序和多個支持不同視頻格式的例子。
利用LIVE555搭建RTSP流媒體服務器主要過程是:
(1)初始化本地環境,建立RTP和RTCP套接字,將RTP套接字與本機綁定,建立sink接收器并與該RTP套接字關聯。
(2)建立于該RTP套接字、本機環境、sink接收器配套的流控RTCP實例。
(3)建立RTSP服務器 (包含與RTP/RTCP關聯的會話)。輸出該RTSP服務器的網絡地址 (本機地址加流名稱)。至此,向外發數據 (RTP/RTCP遠程通信)所需的準備已經完成。
(4)建立圖像數據傳遞:根據 WebCamDeviceSource建立VideoSource。WebCamDeviceSource初始化時,就使Webcam負責攝像頭圖像采集、與DSP壓縮程序通信并將壓縮圖像存入fTO指向的緩沖區。VideoSource初始化時就與WebCam關聯了,因此也關聯了fTO指向的緩沖區,這樣圖像經采集壓縮后傳入VideoSource。
(5)sink調用startPlaying(),開始播放流,sink就循環的接受經采集壓縮后的數據。
(6)事件循環,當RTSP客戶端輸入訪問地址rtsp://192.168.0.xx:xxx/testStream連接服務器時,服務器就開始對客戶端對話進行處理。
系統使用開源的VLC播放器訪問嵌入式流媒體服務器地址,該播放器支持大量的文件格式和流媒體播放格式,可安裝在 Windows、Linux、Android平臺。本系統播放終端界面如圖7所示,遠程攝像頭的視頻信息成功的得到了解碼與播放。在局域網環境下,本文對系統的性能做了進一步測試。通過對不同圖像分辨率的視頻傳輸情況進行試驗,觀察系統的穩定性和傳輸幀率,得到表1所示結果。結果表明,本系統在表中各圖像分辨率下都有較好的幀率表現,系統的實時性較強,而且系統在低分辨率情況下能夠保證視頻的清晰流暢,滿足了大多數實時視頻應用的需求。不過隨著分辨率的提高,壓縮運算的時間消耗大大增加,網絡帶寬需求提高,使得系統延遲增大、穩定性下降。針對這一情況,系統應進一步優化壓縮算法和流媒體傳輸控制,以提高系統性能。

圖8 實時視頻播放界面

表1 系統性能分析
本系統利用具有ARM、DSP雙內核的處理器搭建了圖像處理能力極強的硬件平臺,并且采用H.264作為視頻壓縮算法,使得實時視頻傳輸應用中視頻壓縮時間大大縮短。系統基于RTSP流媒體協議搭建了流媒體服務器,使得視頻傳輸穩定性有很大提高。該系統的性能滿足了監控、視頻會議等應用的要求,同時可以靈活的加入程序進行應用的擴展,如加入圖像識別及目標跟蹤等。目前,我們已經基于本系統實現了火點的識別及跟蹤并搭載到實驗室小型無人機上。但系統在視頻高分辨率情況下的傳輸穩定性仍存在不足,需要進一步優化以滿足高分辨率要求下的應用場合。
[1]REN Zhikao,LIU Minghua,YE Chen,et al.The real time video transmission system based on H.264[C]//International Conference on Web Information Systems and Mining.Shanghai:IEEE Press,2009:270-274.
[2]REN Zhikao,WEI Zhiqiang.Design and realization of video real time video transmission system[J].Computer Engineering and Application,2007,28 (11):2607-2610 (in Chinese).[任志考,魏志強.實時視頻傳輸系統的設計與實現[J].計算機工程與設計,2007,28 (11):2607-2610.]
[3]GUO Jian,ZHAO Jian.Image capture and display of embedded Linux[J].Modern Electronics Technique,2006 (7):129-131(in Chinese).[郭劍,趙建.嵌入式Linux的圖像采集與顯示[J].現代電子技術,2006 (7):129-131.]
[4]Jonathan Corbet,Alessandro Robini.Linux device drivers[M].Beijing:China Electric Power Press,2006(in Chinese).[科波特,魯賓尼.Linux設備驅動程序[M].北京:中國電力出版社,2006.]
[5]YAN Xinzhong,CHEN Yu.Design of image acquisition and transmission based on embedded ARM[J].Foreign Electronic Measurement Technology,2009 (11):57-59 (in Chinese).[嚴新忠,陳雨.基于嵌入式ARM的圖像采集與傳輸設計[J].國外電子測量技術,2009 (11):57-59.]
[6]LI Hongjing.H.264video compression based on network video monitoring system technical design[J].Hebei Journal of Industrial and Technology,2011,28 (4):236-239(in Chinese).[李紅京.基于H.264視頻壓縮技術的網絡視頻傳輸系統設計[J].河北工業科技,2011,28 (4):236-239.]
[7]WU Qiong.Video encoding and decoding based on H.264and its realization and optimization on DSP[J].Modern Electronics Technique,2010 (4):55-57(in Chinese).[吳瓊.基于H.264視頻編解碼DSP實現與優化[J].現代電子技術,2010(4):55-57.]
[8]Richard Stevens W,Stephen A Rago.Advanced programing in the UNIX environment[M].2nd ed.YOU Jinyuan,ZHANG Yaying,transl.Beijing:Post and Telecom Press,2006(in Chinese).[Richard Stevens W,Stephen A Rago.UNIX環境高級編程[M].2版.尤晉元,張亞英,譯.北京:人民郵電出版社,2006.]
[9]GAO Jianshui,CHEN Yaowu,LI LanLan.Video order program system design baed on RTSP[J].Chinese Journal of Electron Devices,2006,29 (4):1143-1146(in Chinese).[高建水,陳耀武,李嵐嵐.基于RTSP協議的視頻點播系統設計[J].電子器件,2006,29 (4):1143-1146.]
[10]CHEN Liang,PEI Hailong.Programming for the server of real time based on RTSP[J].Microcomputer Information,2009,28 (5-3):65-67(in Chinese).[陳亮,裴海龍.基于RTSP協議的實時視頻服務器實現[J].微計算機信息,2009,28 (5-3):65-67.]