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