楊 澤,裴海龍
(華南理工大學(xué) 自主系統(tǒng)與網(wǎng)絡(luò)控制教育部重點(diǎn)實(shí)驗(yàn)室,廣東 廣州510640)
實(shí)時(shí)視頻傳輸技術(shù)在人們生活和工作中的應(yīng)用越來越多,如遠(yuǎn)程監(jiān)控、遠(yuǎn)程教學(xué)、電視電話會(huì)議等。在對(duì)成本、空間、功耗和體積要求較為嚴(yán)格的工程應(yīng)用中,嵌入式平臺(tái)因小巧、軟硬件可裁剪具有不可替代的優(yōu)點(diǎn),這使得以嵌入式為平臺(tái)的多媒體系統(tǒng)成為當(dāng)今工程實(shí)現(xiàn)及學(xué)術(shù)研究的熱點(diǎn)之一。但視頻信息具有信息量大、對(duì)計(jì)算資源需求高的特點(diǎn)[1,2],導(dǎo)致嵌入式實(shí)時(shí)視頻往往圖像分辨率低,幀率小,應(yīng)用效果較差。因此必須對(duì)采集到的原始視頻信息進(jìn)行壓縮,同時(shí)又要考慮嵌入式設(shè)備計(jì)算資源的約束。本文為解決上述問題,采用了ARM和DSP雙內(nèi)核完成視頻采集和基于H.264的視頻壓縮,大大加快了圖像壓縮速度,同時(shí)減輕了ARM的計(jì)算負(fù)擔(dān)。系統(tǒng)基于實(shí)時(shí)流傳輸協(xié)議 (real time streaming protocol,RTSP)搭建流媒體服務(wù)器,將壓縮后的視頻有效傳輸至遠(yuǎn)程計(jì)算機(jī)上解碼顯示。本系統(tǒng)目前已經(jīng)用于實(shí)驗(yàn)室無人機(jī)監(jiān)控平臺(tái),取得了很好的實(shí)驗(yàn)效果。
硬件組成
本系統(tǒng)的硬件平臺(tái)主要由嵌入式核心板、底板、USB彩色攝像頭和遠(yuǎn)程計(jì)算機(jī)組成。嵌入式核心板選用以色列Compulab公司生產(chǎn)的CM-T3530(如圖1(a)所示)。該核心板體積小,僅66mm*44m*5mm,功耗低 (0.2-2w),搭載的OMAP3530處理器集成了720MHZ的Cortex-A8 ARM內(nèi)核和520MHZC64x+DSP內(nèi)核,同時(shí)核心板還有NAND FLASH、WIFI模塊等,圖形計(jì)算能力強(qiáng),支持運(yùn)行Linux、WinCE操作系統(tǒng),并且具有硬件可擴(kuò)展結(jié)構(gòu)。底板 (如圖1(b)所示)為自行開發(fā),該底板提供有核心板插槽、普通USB接口、高速USB接口、調(diào)試口、串口、網(wǎng)口、核心板供電及外設(shè)供電接口等。經(jīng)測(cè)試核心板在上述底板上運(yùn)行穩(wěn)定可靠,很好的滿足了系統(tǒng)開發(fā)和運(yùn)行的需求,。由于Linux內(nèi)核中包含UVC(USB video class)模塊及USB設(shè)備驅(qū)動(dòng),可使用V4L2(video for linux version 2)對(duì)攝像頭進(jìn)行操作,因此本系統(tǒng)攝像頭設(shè)備選用支持UVC的即插即用USB攝像頭即可。這里我們選用羅技高清攝像頭C270,其最高支持分辨率為720P視頻采集,且支持自動(dòng)對(duì)焦,具有較好的成像效果。系統(tǒng)的遠(yuǎn)程計(jì)算機(jī)裝有Ubuntu操作系統(tǒng),用于調(diào)試開發(fā)工作及實(shí)時(shí)視頻的解碼顯示。整個(gè)系統(tǒng)硬件平臺(tái)如圖2所示。
圖1 核心板與底板
圖2 系統(tǒng)硬件平臺(tái)
在視頻實(shí)時(shí)傳輸過程中,嵌入式系統(tǒng)首先打開攝像頭設(shè)備并配置攝像頭參數(shù),然后創(chuàng)建采集壓縮函數(shù)供RTSP流媒體服務(wù)器循環(huán)調(diào)用。在采集壓縮函數(shù)中,采集得到的原始視頻幀放到采集傳輸進(jìn)程和調(diào)用DSP壓縮的進(jìn)程共享的內(nèi)存空間中,經(jīng)DSP壓縮后再次放回共享內(nèi)存區(qū),然后被RTSP流媒體服務(wù)器放入發(fā)送緩沖區(qū)。RTSP流媒體服務(wù)器會(huì)為該視頻流創(chuàng)建網(wǎng)絡(luò)訪問地址,供遠(yuǎn)程計(jì)算機(jī)訪問。在遠(yuǎn)程計(jì)算機(jī)端,使用具備H.264解碼能力的播放器訪問視頻流網(wǎng)絡(luò)地址即可實(shí)時(shí)觀看遠(yuǎn)程攝像頭采集到的信息。系統(tǒng)整體流程如圖3所示。
圖3 系統(tǒng)軟件流程
為使本系統(tǒng)外接攝像頭可方便更換以滿足不同環(huán)境的需求,同時(shí)使代碼易于移植,系統(tǒng)采用基于V4L2(video for linux version 2)的圖像采集程序。V4L2是Linux內(nèi)核中專門用于視頻設(shè)備的驅(qū)動(dòng),它為程序員提供了訪問視頻設(shè)備的通用接口[3,4],包括視頻設(shè)備的打開、設(shè)備屬性的獲取與設(shè)置、圖像的獲取等。當(dāng)系統(tǒng)需要更換攝像頭時(shí),只需要編譯相應(yīng)設(shè)備的驅(qū)動(dòng)模塊添加到Linux內(nèi)核即可而不需要修改系統(tǒng)程序,這樣大大方便了系統(tǒng)的開發(fā)與擴(kuò)展?;赩4L2的圖像采集程序流程[5]如圖4所示,具體步驟如下文所述。
圖4 圖像采集流程
(1)打開設(shè)備文件。int fd=open (“/dev/video0”,O_RDWR);Linux操作系統(tǒng)中,由V4L2驅(qū)動(dòng)的視頻設(shè)備節(jié)點(diǎn)文件通常是/dev/videoX。
(2)取得設(shè)備屬性,ioctl(fd,VIDIOC_QUERYCAP,&cap),變量cap為struct v4l2_capability類型;設(shè)置視頻格式,ioctl(fd,VIDIOC_S_FMT,&fmt),變量fmt為struct v4l2_format類型。
(3) 向 驅(qū) 動(dòng) 申 請(qǐng) 幀 緩 沖,ioctl(fd,VIDIOC _REQBUFS,&reqbuf),變量reqbuf為 struct v4l2_requestbuffers類型;申請(qǐng)物理內(nèi)存 (內(nèi)存映射),調(diào)用calloc函數(shù)向用戶空間申請(qǐng)相同數(shù)目的幀緩沖,并使用mmap內(nèi)存映射方式將幀緩沖映射到用戶空間。
(4)將申請(qǐng)的幀緩沖放入用于存放采集到視頻幀的隊(duì)列,ioctl(fd,VIDIOC_QBUF,&buf)。然后調(diào)用ioctl(fd,VIDIOC_STREAMON,&type),type是enum v4l2_buf_type枚舉類型。
(5)出隊(duì)列以取得采集到的視頻幀,ioctl(fd,VIDIOC_DQBUF,&buf)。如果需要循環(huán),則將buf重新放入隊(duì)列并反復(fù)獲取幀緩沖中的數(shù)據(jù)。
2.2.1 H.264算法分析
H.264視頻壓縮技術(shù)是現(xiàn)在世界上最新的圖像編解碼標(biāo)準(zhǔn),它以低碼率、高清晰的特點(diǎn)能夠持續(xù)提供高質(zhì)量的視頻[6]。在本系統(tǒng)選擇編碼器時(shí),調(diào)用FFMPEG軟件中的MPEG4和H.264進(jìn)行了壓縮率的對(duì)比。在相同的幀間和幀內(nèi)預(yù)測(cè)選擇參數(shù)情況下,H.264壓縮率是普通MPEG4的4倍左右,同時(shí)視頻圖像更加穩(wěn)定。因此系統(tǒng)選用H.264作為視頻壓縮算法,H.264壓縮流程如圖5所示。
圖5 H.264編碼流程
H.264算法包含了幀內(nèi)編碼和幀間編碼。為保證系統(tǒng)圖像質(zhì)量并縮短壓縮時(shí)間,本文對(duì) H.264算法中的IntraFrameInterval參數(shù),即幀內(nèi)幀間模式選擇參數(shù)進(jìn)行了調(diào)試,以選擇最適合性能要求的參數(shù)值。經(jīng)過試驗(yàn),最終將IntraFrameInterval參數(shù)設(shè)置為1,即僅采用幀內(nèi)編碼,這樣獲得的圖像清晰度高、圖像壓縮時(shí)間短,且壓縮率仍在35倍左右。H.264主要參數(shù)如下所示:
Params->inputHeight=480;//系統(tǒng)最大支持480,實(shí)驗(yàn)調(diào)試還包括120、240;
Params->inputWidth=640;//系統(tǒng)最大支持720,實(shí)驗(yàn)調(diào)試還包括160、320
Params->targetFrameRate=30000;
Params->refFrameRate=Params->targetFrameRate;
Params->targetBitRate=4000000;
Params->intraFrameInterval=1;//僅選用幀內(nèi)編碼
Params->generateHeader=XDM_ENCODE_AU;
Params->captureWidth=0;//以圖像寬作為間距(寬大于高時(shí))
Params->forceFrame=IVIDEO_NA_FRAME;//-1;
Params->interFrameInterval=1;//不支持B幀
2.2.2 調(diào)用DSP實(shí)現(xiàn)壓縮
盡管與其他編碼器相比,H.264的壓縮效率非常突出,但帶來的問題是其算法復(fù)雜度也大大提高[7],對(duì)系統(tǒng)的計(jì)算資源提出了更高的要求。本文在選用DSP實(shí)現(xiàn)H.264圖像壓縮前,首先在ARM平臺(tái)運(yùn)行的Linux操作系統(tǒng)上通過調(diào)用交叉編譯的FFMPEG和X264庫實(shí)現(xiàn)H.264圖像編碼。經(jīng)實(shí)驗(yàn)觀察,在壓縮分辨率僅為160*120大小的視頻流時(shí),平均每幀仍需耗時(shí)90~105ms,視頻實(shí)時(shí)性很差。而且壓縮任務(wù)占用了大量ARM運(yùn)算資源影響了系統(tǒng)其它程序的運(yùn)行,因此尋求實(shí)現(xiàn)快速的H.264壓縮方法是實(shí)時(shí)視頻處理的關(guān)鍵因素之一。DSP具有強(qiáng)大的數(shù)字信號(hào)處理能力,在一個(gè)DSP上可以同時(shí)進(jìn)行多路音視頻信號(hào)的壓縮處理。而且DSP產(chǎn)品成熟,開發(fā)周期短,可以實(shí)現(xiàn)快速技術(shù)更新和產(chǎn)品換代。所以本系統(tǒng)使用TI公司OMAP3530處理器中的DSP核實(shí)現(xiàn)視頻的H.264壓縮,這樣大大節(jié)約了視頻壓縮時(shí)間,并減輕了ARM核的運(yùn)算壓力。
系統(tǒng)對(duì)DSP的調(diào)用使用TI-DVSDK (digital video software development kit)進(jìn)行開發(fā)。DVSDK是TI公司推出的一款軟件,作用是建立ARM與DSP之間的聯(lián)系,它包含了引導(dǎo)加載 (u-boot)、編解碼器引擎多媒體堆棧、達(dá)芬奇多媒體接口 (DMAI)、多媒體編解碼器等部件,目前支持的視頻解碼格式有 H.264,MPEG-2,MPEG-4,編碼格式有H.264,MPEG-4。利用DVSDK我們能夠很快搭建出滿足系統(tǒng)要求的H.264視頻壓縮環(huán)境,本系統(tǒng)單獨(dú)編寫了基于DVSDK的程序負(fù)責(zé)完成視頻的壓縮任務(wù),與系統(tǒng)主要進(jìn)程間采用共享存儲(chǔ)方式進(jìn)行數(shù)據(jù)共享與通信[8],兩個(gè)進(jìn)程的流程圖如圖6所示。經(jīng)實(shí)驗(yàn)證明,系統(tǒng)對(duì)分辨率160*120的視頻幀平均壓縮時(shí)間僅為每幀5~7ms,很好的滿足了實(shí)時(shí)性要求。
圖6 視頻壓縮流程
為完成兩個(gè)進(jìn)程的通信,進(jìn)程需要先調(diào)用shmget(key_t key,size_t size,int flag)來創(chuàng)建新的共享存儲(chǔ)段或引用一個(gè)現(xiàn)存的共享存儲(chǔ)段,同時(shí)獲得共享存儲(chǔ)ID,再調(diào)用shmat(int shmid,const void*addr,int flag)來將共享存儲(chǔ)段連接到自身的地址空間中。在獲取共享存儲(chǔ)后,調(diào)用DSP的進(jìn)程就可以直接從共享存儲(chǔ)中讀取圖像和寫入壓縮后的圖像。
從共享存儲(chǔ)讀取圖像到待壓縮緩沖區(qū):
將輸入緩沖區(qū)圖像壓縮,并輸出至輸出緩沖區(qū):
retVal=VIDENC1_process(enc,&inputBufDesc,&outputBufDesc,&inArgs,&outArgs);
將壓縮后的圖像放入共享存儲(chǔ):
壓縮結(jié)束后,視頻采集與傳輸?shù)倪M(jìn)程會(huì)獲取壓縮后的圖像,使其經(jīng)流媒體服務(wù)器傳輸至遠(yuǎn)端。
本系統(tǒng)最初采用基于TCP的Socket編程實(shí)現(xiàn)視頻的傳輸功能,由于TCP的可靠連接特性,視頻卡頓現(xiàn)象嚴(yán)重,無法滿足實(shí)時(shí)性要求。而簡(jiǎn)單的UDP套接字又無法保證有效傳輸,因此系統(tǒng)選用控制聲音或視頻傳輸?shù)亩嗝襟w流協(xié)議作為服務(wù)器協(xié)議。RTSP(real time streaming protocol),實(shí)時(shí)流傳輸協(xié)議,在TCP/IP體系結(jié)構(gòu)中位于RTP (realtime transport protocol)和 RTCP (RTP control protocol)之上,是一個(gè)應(yīng)用層協(xié)議 (如圖7所示),其數(shù)據(jù)傳輸部分使用RTP或RTCP來完成[9]。該協(xié)議可以控制多個(gè)數(shù)據(jù)發(fā)送連接,并為連接選擇發(fā)送通道,從而保證流媒體傳輸?shù)母咝浴?/p>
圖7 RTSP體系的各層
系統(tǒng)使用開源的LIVE555項(xiàng)目實(shí)現(xiàn)RTSP流媒體服務(wù)器的搭建。LIVE555是一個(gè)專門為流媒體提供解決方案的跨平臺(tái)開源項(xiàng)目,其支持的流媒體傳輸協(xié)議有RTP/RTCP、RTSP、SIP等。該項(xiàng)目的源代碼包括4個(gè)基本的庫和各種測(cè)試代碼,4個(gè)基本的庫分別是:UsageEnvironment,GroupSock, LiveMedia 和 BasicUsageEnvironment[10]。UsageEnvironment模塊是對(duì)系統(tǒng)環(huán)境的抽象,包括抽象類UsageEnvironment、TaskScheduler和HashTable,前兩個(gè)類用于調(diào)度已推遲事件,配置異步讀取事件的句柄以及輸出錯(cuò)誤和警告信息,HashTable類定義了一個(gè)通用的哈希表的接口供其它代碼調(diào)用。GroupSock類實(shí)現(xiàn)了對(duì)網(wǎng)絡(luò)接口和套接字的封裝,并且專門封裝了一個(gè)套接字用于發(fā)送接收廣播。LiveMedia庫定義了一系列從Medium類衍生的類,以支持多種流媒體和編碼器類型。BasicUsage-Environment是UsageEnvironment類的一個(gè)子類,用于簡(jiǎn)單的控制臺(tái)應(yīng)用程序。測(cè)試代碼的文件夾包含了利用上述基本庫編寫的多種流媒體協(xié)議客戶端與服務(wù)器實(shí)現(xiàn)程序和多個(gè)支持不同視頻格式的例子。
利用LIVE555搭建RTSP流媒體服務(wù)器主要過程是:
(1)初始化本地環(huán)境,建立RTP和RTCP套接字,將RTP套接字與本機(jī)綁定,建立sink接收器并與該RTP套接字關(guān)聯(lián)。
(2)建立于該RTP套接字、本機(jī)環(huán)境、sink接收器配套的流控RTCP實(shí)例。
(3)建立RTSP服務(wù)器 (包含與RTP/RTCP關(guān)聯(lián)的會(huì)話)。輸出該RTSP服務(wù)器的網(wǎng)絡(luò)地址 (本機(jī)地址加流名稱)。至此,向外發(fā)數(shù)據(jù) (RTP/RTCP遠(yuǎn)程通信)所需的準(zhǔn)備已經(jīng)完成。
(4)建立圖像數(shù)據(jù)傳遞:根據(jù) WebCamDeviceSource建立VideoSource。WebCamDeviceSource初始化時(shí),就使Webcam負(fù)責(zé)攝像頭圖像采集、與DSP壓縮程序通信并將壓縮圖像存入fTO指向的緩沖區(qū)。VideoSource初始化時(shí)就與WebCam關(guān)聯(lián)了,因此也關(guān)聯(lián)了fTO指向的緩沖區(qū),這樣圖像經(jīng)采集壓縮后傳入VideoSource。
(5)sink調(diào)用startPlaying(),開始播放流,sink就循環(huán)的接受經(jīng)采集壓縮后的數(shù)據(jù)。
(6)事件循環(huán),當(dāng)RTSP客戶端輸入訪問地址rtsp://192.168.0.xx:xxx/testStream連接服務(wù)器時(shí),服務(wù)器就開始對(duì)客戶端對(duì)話進(jìn)行處理。
系統(tǒng)使用開源的VLC播放器訪問嵌入式流媒體服務(wù)器地址,該播放器支持大量的文件格式和流媒體播放格式,可安裝在 Windows、Linux、Android平臺(tái)。本系統(tǒng)播放終端界面如圖7所示,遠(yuǎn)程攝像頭的視頻信息成功的得到了解碼與播放。在局域網(wǎng)環(huán)境下,本文對(duì)系統(tǒng)的性能做了進(jìn)一步測(cè)試。通過對(duì)不同圖像分辨率的視頻傳輸情況進(jìn)行試驗(yàn),觀察系統(tǒng)的穩(wěn)定性和傳輸幀率,得到表1所示結(jié)果。結(jié)果表明,本系統(tǒng)在表中各圖像分辨率下都有較好的幀率表現(xiàn),系統(tǒng)的實(shí)時(shí)性較強(qiáng),而且系統(tǒng)在低分辨率情況下能夠保證視頻的清晰流暢,滿足了大多數(shù)實(shí)時(shí)視頻應(yīng)用的需求。不過隨著分辨率的提高,壓縮運(yùn)算的時(shí)間消耗大大增加,網(wǎng)絡(luò)帶寬需求提高,使得系統(tǒng)延遲增大、穩(wěn)定性下降。針對(duì)這一情況,系統(tǒng)應(yīng)進(jìn)一步優(yōu)化壓縮算法和流媒體傳輸控制,以提高系統(tǒng)性能。
圖8 實(shí)時(shí)視頻播放界面
表1 系統(tǒng)性能分析
本系統(tǒng)利用具有ARM、DSP雙內(nèi)核的處理器搭建了圖像處理能力極強(qiáng)的硬件平臺(tái),并且采用H.264作為視頻壓縮算法,使得實(shí)時(shí)視頻傳輸應(yīng)用中視頻壓縮時(shí)間大大縮短。系統(tǒng)基于RTSP流媒體協(xié)議搭建了流媒體服務(wù)器,使得視頻傳輸穩(wěn)定性有很大提高。該系統(tǒng)的性能滿足了監(jiān)控、視頻會(huì)議等應(yīng)用的要求,同時(shí)可以靈活的加入程序進(jìn)行應(yīng)用的擴(kuò)展,如加入圖像識(shí)別及目標(biāo)跟蹤等。目前,我們已經(jīng)基于本系統(tǒng)實(shí)現(xiàn)了火點(diǎn)的識(shí)別及跟蹤并搭載到實(shí)驗(yàn)室小型無人機(jī)上。但系統(tǒng)在視頻高分辨率情況下的傳輸穩(wěn)定性仍存在不足,需要進(jìn)一步優(yōu)化以滿足高分辨率要求下的應(yīng)用場(chǎng)合。
[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).[任志考,魏志強(qiáng).實(shí)時(shí)視頻傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(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].現(xiàn)代電子技術(shù),2006 (7):129-131.]
[4]Jonathan Corbet,Alessandro Robini.Linux device drivers[M].Beijing:China Electric Power Press,2006(in Chinese).[科波特,魯賓尼.Linux設(shè)備驅(qū)動(dòng)程序[M].北京:中國(guó)電力出版社,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).[嚴(yán)新忠,陳雨.基于嵌入式ARM的圖像采集與傳輸設(shè)計(jì)[J].國(guó)外電子測(cè)量技術(shù),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視頻壓縮技術(shù)的網(wǎng)絡(luò)視頻傳輸系統(tǒng)設(shè)計(jì)[J].河北工業(yè)科技,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實(shí)現(xiàn)與優(yōu)化[J].現(xiàn)代電子技術(shù),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環(huán)境高級(jí)編程[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協(xié)議的視頻點(diǎn)播系統(tǒng)設(shè)計(jì)[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協(xié)議的實(shí)時(shí)視頻服務(wù)器實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2009,28 (5-3):65-67.]