黃俊偉,巴 義
(重慶郵電大學(xué)通信與信息工程學(xué)院,重慶 400065)
隨著信息化產(chǎn)業(yè)的高速發(fā)展,人們對(duì)自己的生活居住環(huán)境也提出了更高的需求。在智能家居大力推廣下,視頻監(jiān)控作為其中的一個(gè)重要模塊也已經(jīng)備受關(guān)注。移動(dòng)視頻監(jiān)控是指用戶通過3G手機(jī)上網(wǎng)方式隨時(shí)隨地觀看遠(yuǎn)程監(jiān)控端的視頻。目前市面上主要存在著兩種視頻監(jiān)控系統(tǒng)類型,一種是以數(shù)字錄像設(shè)備為核心的傳統(tǒng)視頻監(jiān)控系統(tǒng),另一種是以嵌入式技術(shù)為核心的視頻監(jiān)控系統(tǒng)。本文所設(shè)計(jì)的視頻監(jiān)控系統(tǒng)正是基于后者,該系統(tǒng)與傳統(tǒng)的相比較,不需要復(fù)雜布線,實(shí)時(shí)性強(qiáng)、性能穩(wěn)定、成本低廉,并且整體架構(gòu)簡(jiǎn)潔,客戶端由手機(jī)代替?zhèn)鹘y(tǒng)的PC監(jiān)控,方便用戶使用[1]。因此這種以嵌入式技術(shù)為核心,將嵌入式技術(shù)、流媒體技術(shù)、網(wǎng)絡(luò)技術(shù)結(jié)合為一體的監(jiān)控系統(tǒng)具有很強(qiáng)的研究意義。而監(jiān)控前端一體化也正是未來發(fā)展的方向。
V4L2(Video for Linux 2)是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng),并已成為L(zhǎng)inux 2.6的標(biāo)準(zhǔn)接口。目前V4L2可以支持多種設(shè)備,并提供了視頻采集接口、視頻輸出接口、直接傳輸視頻接口等?;赩4L2的視頻采集采用流水線方式,操作極為簡(jiǎn)單方便,應(yīng)用程序通過調(diào)用V4L2提供API完成對(duì)攝像頭的基本操作[2]。很多操作都是通過調(diào)用iotcl函數(shù)來實(shí)現(xiàn)設(shè)備的打開、關(guān)閉,以及設(shè)置圖像格式等。
本文設(shè)計(jì)理念是基于家庭智能化而提出的設(shè)想。通過在家中門窗等重要位置安裝攝像頭,用戶只要在有手機(jī)信號(hào)覆蓋的范圍下,通過手機(jī)上網(wǎng)的方式就可以對(duì)家庭的情況進(jìn)行實(shí)時(shí)監(jiān)控[3]。本系統(tǒng)借鑒傳統(tǒng)的C/S設(shè)計(jì)模式,提出了一種更輕巧更簡(jiǎn)便的系統(tǒng)。本系統(tǒng)包括采集端和監(jiān)控端兩部分,采集端是一個(gè)ARM11開發(fā)板,開發(fā)板上集成了視頻采集模塊、壓縮編碼模塊、數(shù)據(jù)傳輸模塊、云臺(tái)控制模塊。此設(shè)計(jì)避免了建立大型服務(wù)器對(duì)數(shù)據(jù)進(jìn)行處理,而是利用嵌入式技術(shù)與流媒體技術(shù)有效結(jié)合,將前端對(duì)視頻數(shù)據(jù)的處理都集中在ARM開發(fā)板上。系統(tǒng)實(shí)物架構(gòu)如圖1所示。
圖1 系統(tǒng)架構(gòu)實(shí)物圖
本系統(tǒng)硬件平臺(tái)以C6310作為核心處理器。在此芯片中集成了ARM1176核、ZSP800核等,同時(shí)在此還集成了LCD控制器、Camera控制器,ImageDMA模塊。攝像頭選擇OV2655,支持RGB/YUV兩種輸出格式;客戶端選用Android操作系統(tǒng)的智能手機(jī)??蛻舳送ㄟ^3G上網(wǎng)的方式與視頻采集端建立連接,用于獲取實(shí)時(shí)視頻流,并且在手機(jī)客戶端處發(fā)出簡(jiǎn)單的控制指令,對(duì)前端的云臺(tái)進(jìn)行操作,從而達(dá)到控制攝像頭角度轉(zhuǎn)動(dòng)的效果。圖2為移動(dòng)視頻監(jiān)控系統(tǒng)軟件架構(gòu),整個(gè)系統(tǒng)工作流程如下:
1)前端攝像頭采集視頻流,以YUV442格式放置到申請(qǐng)的buffer中。
2)應(yīng)用程序調(diào)用ZSP模塊讀取YUV buffer里的視頻流按照H.264標(biāo)準(zhǔn)壓縮進(jìn)行硬件編碼,將已經(jīng)編碼后的數(shù)據(jù)存放在緩沖區(qū)中。
3)從緩沖區(qū)中提取H.264視頻流進(jìn)行RTP封包,采用RTP/RTCP協(xié)議,最終通過socket通信將數(shù)據(jù)報(bào)發(fā)送出去。
4)在客戶端Android手機(jī)上設(shè)計(jì)視頻數(shù)據(jù)接收軟件,對(duì)傳來的視頻流解碼后播放。
圖2 移動(dòng)視頻監(jiān)控系統(tǒng)軟件框圖
本文工作重心在于系統(tǒng)的軟件設(shè)計(jì),主要包括開發(fā)環(huán)境搭建和移動(dòng)視頻監(jiān)控采集端軟件設(shè)計(jì)兩大方面。在采集端分為系統(tǒng)軟件和應(yīng)用軟件,系統(tǒng)軟件主要包括Bootloader、嵌入式Linux操作系統(tǒng)移植,驅(qū)動(dòng)程序移植;應(yīng)用軟件包括視頻采集,H.264編碼壓縮、RTP/RTCP協(xié)議傳輸應(yīng)用程序設(shè)計(jì)編寫。
嵌入式開發(fā)采用交叉編譯方式,需要1臺(tái)宿主機(jī)和1個(gè)開發(fā)板,開發(fā)過程在宿主機(jī)上完成,將編譯后的可執(zhí)行文件通過串口下載到開發(fā)板上。本系統(tǒng)主要涉及到Bootloader、Linux內(nèi)核移植、根文件系統(tǒng)的構(gòu)建及相關(guān)的應(yīng)用程序設(shè)計(jì)。開發(fā)環(huán)境搭建流程如下:
1)下載Linux內(nèi)核源碼、交叉編譯器。內(nèi)核版本為L(zhǎng)inux-2.6.36.tar.bz,交叉編譯器選擇版本為 arm920teabi-4.1.2.tar.gz。
2)打開ubuntu虛擬機(jī),將下載的壓縮包放置到指定目錄下,打開終端解壓縮。
3)根據(jù)使用的硬件平臺(tái)修改Makefile文件。Makefile記錄了編譯所要遵守的規(guī)則,它決定哪些文件要編譯、哪些文件先編譯等,也決定了文件之間的依賴關(guān)系。
4)參照硬件手冊(cè)修改并移植驅(qū)動(dòng)程序,本系統(tǒng)中主要完成了攝像頭驅(qū)動(dòng)的移植,并將驅(qū)動(dòng)編譯成模塊形式加載到內(nèi)核中。
5)打開config文件夾,修改C6310_deconfig配置文件,將需要的驅(qū)動(dòng)模塊加載進(jìn)去,不需要的屏蔽掉。
6)進(jìn)入到內(nèi)核目錄下,執(zhí)行make編譯。
Linux設(shè)備驅(qū)動(dòng),外圍的硬件都被當(dāng)作一個(gè)設(shè)備文件來看,通過調(diào)用驅(qū)動(dòng)程序提供的接口,用打開文件的方式對(duì)硬件設(shè)備進(jìn)行操作。設(shè)備文件存放在/dev目錄下,視頻設(shè)備文件存放完整路徑為:/dev/video0,主設(shè)備號(hào)為81[3]。本系統(tǒng)中視頻采集端主要用到了Camera控制器、ImageDMA、ZSP三大模塊。Camera控制器驅(qū)動(dòng)按照應(yīng)用程序的要求通過I2C總線向攝像頭發(fā)送各種控制命令;ImageDMA模塊主要完成的功能是將緩沖區(qū)的數(shù)據(jù)取出來,并可以對(duì)圖像的尺寸進(jìn)行改變;ZSP模塊主要完成對(duì)數(shù)據(jù)的編解碼功能。視頻采集基本步驟如下:接收到指令后調(diào)用Camera驅(qū)動(dòng)程序打開視頻設(shè)備,設(shè)置圖像數(shù)據(jù)大小、格式以及每秒獲取的幀數(shù);申請(qǐng)內(nèi)存緩沖區(qū),視頻數(shù)據(jù)入列、出列,輸入輸出隊(duì)列都采用環(huán)形隊(duì)列;采集完成畢后關(guān)閉視頻設(shè)備。
本系統(tǒng)視頻采集基于V4L2架構(gòu),用到V4L2驅(qū)動(dòng)下重要結(jié)構(gòu)體和提供的接口函數(shù),應(yīng)用程序發(fā)送控制命令使用ioctl操作,因此系統(tǒng)對(duì)每一種控制命令都要定義相應(yīng)的ioctl控制命令和參數(shù)[4]。本設(shè)計(jì)流程用到的ioctl函數(shù)控制命令如下:
1)CAMERA_OPEN_SENSOR:該操作用于打開攝像頭傳感器并初始化。
2)VIDIOC_REQBUFS:用戶向照相機(jī)驅(qū)動(dòng)程序注冊(cè)buffer。
3)VIDIOC_QBUF:編碼器通知buffer編碼完畢。
4)CAMERA_GET_VIDEO_MEMSIZE:獲取視頻數(shù)據(jù)使用內(nèi)存的大小。
5)CAMERA_SET_VIDEO_MODE:設(shè)置圖像輸出幀參數(shù)。
6)CAMERA_GET_VIDEO_MODE:獲得圖像輸出幀參數(shù)。
7)CAMERA_RELEASE:釋放當(dāng)前使用的攝像頭。
本系統(tǒng)視頻采集設(shè)計(jì)是以硬件為基礎(chǔ)。前端的攝像頭使用的是OV2655,該攝像頭本身輸出格式支持RGB565和YUV422兩種格式,本文將攝像頭原始輸出格式設(shè)置為YUV422格式,因?yàn)樵摲N格式便于以H.264標(biāo)準(zhǔn)壓縮。圖3為采集流程圖。
圖3 視頻采集流程
視頻采集流程描述為:
1)打開視頻設(shè)備:接收到指令后,調(diào)用sensor驅(qū)動(dòng)中的int powerup(void)接口函數(shù),此函數(shù)表示攝像頭傳感器上電。并且這里使用非阻塞模式打開,使用非阻塞模式調(diào)用視頻設(shè)備,即使沒有捕獲到信息,驅(qū)動(dòng)程序依舊會(huì)把緩沖區(qū)里的視頻流返回給應(yīng)用程序。對(duì)應(yīng)代碼為:
2)當(dāng)攝像頭作為設(shè)備文件打開后,讀取設(shè)備信息,選擇視頻輸入,調(diào)用ioctl函數(shù)設(shè)置視頻格式。本系統(tǒng)選用的攝像頭輸出格式為YUV422,圖像大小設(shè)置為176×144。調(diào)用的主要函數(shù)為:
3)用戶空間申請(qǐng)分配內(nèi)存,通過VIDIOC_REQBUFS控制命令向驅(qū)動(dòng)程序注冊(cè)buffer,在這里并沒有采用read,write等傳統(tǒng)方式對(duì)數(shù)據(jù)操作,而是調(diào)用mmap內(nèi)存映射函數(shù)把內(nèi)核空間內(nèi)存映射到用戶空間。程序就可以直接對(duì)緩沖區(qū)中數(shù)據(jù)進(jìn)行操作,極大地減少了數(shù)據(jù)交互時(shí)間,提高了效率。
4)啟動(dòng)視頻采集命令,應(yīng)用程序調(diào)用ioctl(cam_fd,VIDIOC_STREAMON,&type),攝像頭開始采集,并把采集的原始數(shù)據(jù)存放到申請(qǐng)的YUV buffer中。
5)應(yīng)用程序調(diào)用ioctl(cam_fd,VIDIOC_STREAMOFF,&type)函數(shù),視頻設(shè)備驅(qū)動(dòng)程序即不再采集視頻數(shù)據(jù),并調(diào)用CAMERA_RELEASE釋放當(dāng)前使用的攝像頭。
本移動(dòng)視頻監(jiān)控系統(tǒng)對(duì)實(shí)時(shí)性要求非常高,因此該系統(tǒng)必須具有低時(shí)延和低丟包率特性。TCP/IP是一種提供面向連接和可靠傳輸服務(wù)的協(xié)議,但重傳和擁塞機(jī)制導(dǎo)致在本系統(tǒng)中實(shí)時(shí)性很難滿足,影響了傳輸質(zhì)量[5]。如果使用UDP,雖然其不保證提供可靠傳輸,甚至還有丟包的情況,但實(shí)時(shí)性可以保證,雖然丟了一些數(shù)據(jù)包,對(duì)用戶整體感覺影響不大。
隨著流媒體技術(shù)日益成熟,RTP/RTCP是目前解決流媒體實(shí)時(shí)傳輸?shù)淖詈棉k法。RTP/RTCP協(xié)議是由實(shí)時(shí)傳輸協(xié)議RTP和實(shí)時(shí)傳輸控制協(xié)議RTCP兩部分組成。RTP負(fù)責(zé)實(shí)時(shí)性數(shù)據(jù)傳輸,工作在UDP/IP之上。RTCP主要負(fù)責(zé)監(jiān)測(cè)數(shù)據(jù)傳輸并管理控制信息,監(jiān)視延遲并周期性地發(fā)送數(shù)據(jù)包和通知發(fā)送端。因此本系統(tǒng)采用RTP和RTCP配合使用,這樣在保證視頻流實(shí)時(shí)傳輸?shù)耐瑫r(shí)也保證了QoS,達(dá)到傳輸效率的最優(yōu)化。圖4表示流媒體協(xié)議棧各個(gè)協(xié)議之間的關(guān)系。
圖4 RTP/RTCP流媒體協(xié)議棧
本系統(tǒng)采用的是H.264壓縮標(biāo)準(zhǔn),實(shí)現(xiàn)H.264流媒體視頻流傳輸?shù)年P(guān)鍵在于如何將媒體封裝成RTP包。本文采用開源JRTPLIB庫,JRTPLIB對(duì)RFC3550的實(shí)現(xiàn)進(jìn)行了封裝,將此開源庫移植到采集端的開發(fā)板中。該庫提供大量的API接口,應(yīng)用程序通過調(diào)用接口函數(shù),完成壓縮數(shù)據(jù)的封包,并傳輸出去[6]。傳輸流程如下:
1)由客戶端發(fā)出申請(qǐng),服務(wù)器接收請(qǐng)求后給客戶端一個(gè)響應(yīng),同時(shí)建立起連接。
2)按照RTP協(xié)議要求進(jìn)行封裝,將H.264碼流封裝成RTP包,RTP包封裝在UDP包內(nèi)并通過socket通信發(fā)送出去。
3)采集端周期性地發(fā)送RTCP包,并接收來自客戶端含有客戶統(tǒng)計(jì)信息的RTCP包。
客戶端收到采集端的數(shù)據(jù)包后,分別經(jīng)過IP/UDP/RTP層解析后,經(jīng)手機(jī)解碼后即可正常播放。系統(tǒng)的QoS基于RTCP協(xié)議實(shí)現(xiàn),根據(jù)客戶端的反饋信息動(dòng)態(tài)調(diào)整視頻發(fā)送速率。接收端生成反饋信息,封裝成RTCP RR包發(fā)送到發(fā)送端。發(fā)送端根據(jù)反饋信息,來控制H.264碼流封裝RTP的速率,從而能夠在帶寬有限的網(wǎng)絡(luò)條件下更好地傳輸。圖5為視頻流傳輸流程圖。
圖5 視頻流傳輸過程
本文提出了一個(gè)基于V4L2的移動(dòng)視頻監(jiān)控系統(tǒng)解決方案,系統(tǒng)采用Linux 2.6內(nèi)核作為操作系統(tǒng),采用C6310作為主控制器。系統(tǒng)以嵌入式技術(shù)為核心,將視頻采集、傳輸、控制功能都集成在前端的開發(fā)板上,用戶只須在手機(jī)上安裝特定軟件即可進(jìn)行實(shí)時(shí)監(jiān)控。將圖像幀率設(shè)置為15幀/秒(f/s),用局域網(wǎng)模擬公網(wǎng),圖像清晰度能達(dá)到基本要求。圖6為客戶端顯示的監(jiān)控圖像。本系統(tǒng)的最大優(yōu)勢(shì)在于避免建立大型服務(wù)器來對(duì)視頻數(shù)據(jù)處理,極大地降低了硬件成本,非常適用于家居安防。在此系統(tǒng)上可以進(jìn)行二次開發(fā),利用傳感器技術(shù)對(duì)家中的溫度、濕度等各項(xiàng)指標(biāo)實(shí)時(shí)查看,達(dá)到家庭智能化的效果。
圖6 客戶端監(jiān)控畫面
[1]盧秋波.視頻監(jiān)控技術(shù)簡(jiǎn)介與發(fā)展趨勢(shì)[J].安防科技,2007(5):21-23.
[2]李珊珊,王緒國(guó).基于V4L2的遠(yuǎn)程視頻采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2011.
[3]姜璐.基于ARM的嵌入式移動(dòng)視頻監(jiān)控的設(shè)計(jì)[D].上海:華東師范大學(xué),2008.
[4]Sasoritattoo.基于Linux的V4L2視頻架構(gòu)驅(qū)動(dòng)編寫[EB/OL].[2011-12-20].http://www.linuxidc.com/Linux/2011-03/33022.htm.
[5]STEVENS R W.TCP/IP協(xié)議詳解卷一:協(xié)議[M].北京:北京大學(xué)出版社,1999.
[6]張溢華,萬曉榆,樊自甫.3G視頻監(jiān)控系統(tǒng)傳輸部分的設(shè)計(jì)[J].電視技術(shù),2009,33(2):61-62.