陳宗成,鄧華秋
(華南理工大學理學院物理系,廣東 廣州 510640)
隨著圖像處理技術和網絡技術的不斷發展,視頻監控系統大致經歷了三個發展階段,前兩代分別以黑白電視為代表的模擬監控系統和以硬盤錄像機為代表的半數字化監控系統[1],第三代視頻監控系統是指以前端網絡視頻為代表的全數字視頻監控系統,視頻從前端的采集、壓縮、傳輸和瀏覽、存儲全部數字化。CCD和CMOS攝像頭為數字視頻采集提供便利。隨著視頻壓縮算法的發展,高壓縮比、還原能力強的壓縮算法不斷出現,特別是伴隨著流媒體技術產生的H.264視頻壓縮技術,為視頻的實時傳輸和實時瀏覽提供便捷。
伴隨著數字化視頻監控系統的到來,對視頻監控系統的要求也不斷提高,要求實時可靠、操作簡單、功能豐富、經濟適用等。而嵌入式系統的基本特點恰好滿足了以上要求,嵌入式視頻監控系統應運而生。目前嵌入式視頻系統普遍采用BS架構,雖然實現起來簡單方便[2],卻不利于顯示端功能的升級和改進。本文根據嵌入式視頻監控系統的發展現狀,在ARM-Linux嵌入式系統上搭建監控系統必須的軟件平臺,通過CS架構實現視頻的采集、編碼、發送和顯示功能。編碼方面采用最新的H.264標準,有效地降低了碼率,和MPEG-2和MPEG-4 ASP等標準相比,在同等圖像質量下,采用H.264技術壓縮后的數據量只有MPEG-2的1/8,MPEG-4 的 1/3[3]。在視頻發送方面,采用協議 UDP/RTP/RTCP,既滿足視頻服務器所需的組播特性,又能通過RTP/RTCP協議保證流媒體的實時傳輸[4]。
本文在ARM-Linux嵌入式平臺實現遠程視頻實時監控系統,利用現有的網絡設備,滿足用戶遠程監控的目的。需要實現的主要工作包括前端視頻采集、網絡傳輸和終端接收播放,主要功能總結如下:
1)監控前端設備通過COMS攝像頭實現視頻的采集;
2)在ARM-Linux平臺對原始視頻數據編碼;
3)前端服務器與客戶端通過局域網或者因特網實現視頻數據的組播發送;
4)客戶端接受H.264視頻數據,實時解碼播放。
考慮到視頻監控系統需要視頻的實時采集、編碼和發送,因此,需要集成度高、穩定、實時性好的SoC系統。在綜合考慮成本的情況下,選擇三星公司S3C6410作為主控芯片。S3C6410是以功能強大的ARM11為核心的SoC芯片,使用廣州友善之臂技術有限公司開發的mini6410嵌入式平臺。整體硬件平臺如圖1所示。

圖1 系統硬件平臺
利用V4L2接口函數獲取視頻幀數據有3種方式:直接通過read()函數讀取視頻幀,用戶指針方式,mmap內存映射。本文通過內存映射方式采集,采用這種方法讀取方便,而且省去了大量的內存拷貝,效率較高,具體操作步驟如圖2 所示[5]。

圖2 視頻采集流程
本文利用S3C6410提供的MFC硬件編碼器對原始視頻數據進行H.264格式編碼,與V4L2視頻采集操作相同,MFC進行編碼時,絕大多數操作都是通過I/O control接口函數來完成的,S3C6410已經提供了針對H.264視頻編碼的I/O control接口的封裝API函數。為了減小編程工作量,本文使用這些已經比較穩定的API函數進行視頻編碼操作,主要步驟如下:
1)初始化編碼句柄。在進行編碼之前需要初始化一個編碼句柄handles,該變量是一個結構體變量,其中存儲了視頻編碼的控制信息,初始化該結構體的API函數是:void*SsbSipH.264EncodeInit(unsigned int uiWidth,unsigned int uiHeight,nsigned int uiFramerate,unsigned int uiBitrate_kbps,unsigned int uiGOPNum)。
2)將編碼信息寫入MFC驅動層,初始化MFC硬件。完成這一工作的API函數是:int SsbSipH.264EncodeExe(void*openHandle)。
3)獲取輸入緩存地址。通過函數void*SsbSipH.264EncodeGetInBuf(void*openHandle,long size)獲得內核存儲原始數據的幀緩存地址。
4)將原始視頻大小存入內核緩沖區。通過memcpy函數,將采集到的視頻數據發送該內核驅動空間,用于MFC對視頻進行編碼。
5)對視頻數據進行編碼。視頻編碼的API函數是:int SsbSipH.264EncodeExe(void*openHandle)。在進行編碼時,有些編碼器會在每個關鍵幀前面都添加序列參數集(Sequence Parameter Set,SPS)和圖像參數集(Picture Parameter Set,PPS),造成無用的碼率增加。MFC只對第一幀H.264碼流上添加SPS和PPS。SPS和PPS中含有解碼所必須的參數,包括幀頻、圖像大小等。
6)獲取編碼后的幀緩存地址和大小。通過API函數GetOutBuf函數獲取編碼后視頻數據在內核中的緩沖區地址。返回的編碼數據,除了第一幀圖像外,每次緩沖區內保存的都包含并且只包含一個完整的NAL單元;第一幀圖像編碼完成之后,緩沖區除了第一個NAL單元之外,還有序列參數集和圖像參數集2個NAL單元。
7)將編碼數據放入環形存儲隊列。8)釋放資源,關閉編碼設備。
本系統采用流媒體最常用的RTP/RTCP協議發送視頻數據。編碼后的視頻數據按照RTP協議打包,并利用UDP協議對局域網組播。RTP協議的定位是應用層協議,這樣便于擴展。本文利用RTP的一個C++庫JRTPLIB進行視頻發送,該庫封裝了網絡協議的配置,只要調用其中的API函數就可以輕易配置網絡,不過JRTPLIB本身不是針對某一種實時數據的開發庫,因此,發送不同的數據流需要用戶根據相應的協議進行RTP的分包和打包。
1)移植JRTPLIB到ARM平臺
本系統使用的JRTPLIB版本是3.7.1。該C++庫是根據RTP標準RFC3550寫成的,支持Windows和類Linux操作系統,為用戶提供了RTP頭和網絡配置接口,只要將需要傳輸的數據根據RTP協議進行適當修飾就可以輕易使用RTP協議發送數據。同時,JRTPLIB會自動發送RTCP控制信息到接收端。
2)初始化RTP會話實例
聲明三個變量:RTPSession rtpsess,RTPSessionParams sessionparams,RTPUDPv4TransmissionParams transparams。
通過實例化類RTPSession建立RTP會話,RTP傳輸的大多數操作都是通過RTPSession對象提供的。同時,用到的2個參數類是RTPSessionParams和RTPUDPv4 TransmissionParams,分別用來設置RTP協議的頭信息和傳輸信息。
3)對H.264視頻數據進行RTP打包
S3C6410的MFC對視頻進行H.264編碼時,為了存儲到介質上之后解碼器能夠區分每一個NAL單元,MFC在每一個NAL單元之前添加起始碼0x00000001,這也是H.264標準的建議[6],但是,實時遠程播放系統,解碼器會根據RTP時間戳區分不同的NAL單元,因此在發送數據之前需要去掉該起始碼。為了解碼器獲取序列信息和圖像信息,MFC在第一個NAL單元之前添加序列參數集和圖像參數集,這兩個參數集分別作為獨立的NAL單元與第一個視頻NAL單元形成一個數據組。MFC編碼后,輸出緩沖區內的數據結構如圖3所示。

圖3 MFC輸出緩沖區中數據結構
為了將H.264視頻數據按照RTP協議傳輸,并且能夠讓接收端的解碼器能夠識別,需要有統一的標準對H.264數據打包和解包。本系統根據標準 RFC3984[7]對H.264打包。
4)發送視頻數據
JRTPLIB調用RTPSession的成員函數完成發送:int SendPacket(const void*data,size_t len,uint8_t pt,bool mark,uint32_t timestampinc)。其中,data是打包完成的視頻數據首地址;len是待發送視頻數據長度;pt是發送的數據類型;mark是標示位,本文用來標示一個NAL單元的最后一個分包;timestampinc是時間戳的增量,由于每個NAL單元中的內容都是在同一時刻采集的視頻數據,發送同一個NAL單元分包期間,時間戳不變,該值為0。
本文在PC機上通過會話描述協議(Session Description Protocol,SDP)[8]文本與發送端通信,并使用 VLC 播放器解析該協議文本對視頻流實時播放。
本系統利用BOA網絡服務器將SDP文件發送到接收端,BOA使用http傳輸協議。接收端的VLC播放器通過http協議接收SDP文件,然后對SDP文件解析,通過RTP協議接收并播放實時視頻數據。在PC端,使用VLC播放器通過http協議打開服務器端的SDP文件實時播放視頻。接收端PC環境為Intel Core 2 Duo處理器,2.67 GHz,1.75 Gbyte 內存,視頻采集格式為 YUV420,大小480 ×272,幀頻30 f/s(幀/秒)。
圖4a是單個VLC播放器實時播放效果圖,經測試,播放延遲在0.5 s以內,考慮到傳輸延時和VLC播放器的緩沖,0.5 s以內的延遲屬于正常。在視頻監控期間,丟包率在0.3%以內。圖4b是單個VLC播放器實時播放效果圖。圖4b是4個VLC播放器同時播放效果,表1為同時打開4個VLC播放器測得的數據。由于使用組播發送視頻數據,同時打開多個播放器同時進行播放,畫面清晰流暢,沒有明顯抖動,丟包率沒有沒有明顯增加。

圖4 使用VLC播放器實時播放效果

表1 4個VLC播放器信息
隨著社會的發展,視頻監控系統成為安防系統中越來越重要的監控工具。近些年,網絡技術和視頻處理技術的不斷進步,視頻監控不斷向智能化、網絡化和集成化發展。基于以上背景,本文設計并實現了一款嵌入式實時視頻服務系統。在本文的完成過程中,使用了嵌入式技術、視頻壓縮編碼技術、流媒體實時傳輸技術、SDP會話描述協議和Web技術,最終實現了基本功能。經過測試,視頻播放流暢,支持多用戶同時在線播放,丟包率較低,達到了預期的設計目標。
[1]淺析視頻監控系統發展歷程[EB/OL].[2012-07-20].http://wenku.baidu.com/view/4de33302e87101f69e3195a9.html.
[2]楊曉姣,黃云霞.嵌入式視頻監控系統視頻服務器的設計與實現[J].電子設計工程,2011(6):184-186.
[3]胡興軍.視頻編碼標準H.264的技術革新及應用[J].影像技術,2009(1):24-27.
[4]李長銀.基于UDP組播的分布式仿真系統實現[D].成都:電子科技大學,2008.
[5]白長青,陳沛.嵌入式終端基于Linux V4L2的圖像采集系統[J].信息技術,2012(2):22-23.
[6]畢厚杰.新一代視頻壓縮編碼標準——H.264/AVC[M].北京:人民郵電出版社,2009.
[7]RFC3984,RTP Payload Format for H.264 Video[S].2005.
[8]王榮生.SDP協議在視頻點播系統中的應用[J].計算機應用與軟件,2005(1):74-76.