劉明健
(江西理工大學 信息工程學院,贛州 341000)
劉明健
(江西理工大學 信息工程學院,贛州 341000)
網(wǎng)絡視頻監(jiān)控系統(tǒng)不僅要求采集的圖像清晰度要高,而且對視頻圖像的壓縮和傳輸都有很高的要求。本設計選取海思SoC Hi3507為主芯片,結(jié)合CMOS高清圖像傳感器OV2643、H.264編碼技術和基于live555的流媒體服務器搭建了一個高清網(wǎng)絡視頻監(jiān)控系統(tǒng)。實踐表明,該系統(tǒng)不僅采集到的圖像清晰流暢、實時性好,而且具有較高的性價比。
Hi3507;OV2643;H.264;live555;流媒體服務器
現(xiàn)有的視頻監(jiān)控系統(tǒng)主要有模擬視頻監(jiān)控系統(tǒng)、數(shù)字視頻監(jiān)控系統(tǒng)和網(wǎng)絡視頻監(jiān)控系統(tǒng)。模擬視頻監(jiān)控系統(tǒng)因為擴展能力差、傳輸距離短,只適用于較小范圍區(qū)域的監(jiān)控;數(shù)字視頻監(jiān)控系統(tǒng)采用光端機將采集的模擬視頻信號傳輸?shù)娇蛻舳?,然后轉(zhuǎn)換成數(shù)字視頻進行保存,其弊端是不僅兩端都要布置光端機,而且遠距離的傳輸需要鋪設專門的電纜,這樣就使得成本較高,維護也比較困難;網(wǎng)絡視頻監(jiān)控系統(tǒng)采用IP Camera將采集到的模擬視頻在本地轉(zhuǎn)換并壓縮為視頻流,并采用當前價格低廉、應用廣泛的IP網(wǎng)絡作為傳輸媒介,客戶端只需要開發(fā)相應的流媒體播放器即可實現(xiàn)遠程視頻監(jiān)控。
網(wǎng)絡視頻監(jiān)控系統(tǒng)目前正朝著高清化、集成化和智能化的方向發(fā)展,這就對IP Camera提出了更高的要求。華為海思SoC芯片Hi3507集成了H.264編解碼協(xié)處理器,獨特的MPP系統(tǒng)為上層應用開發(fā)提供了MPI接口,降低了開發(fā)者的難度和開發(fā)成本。本文提出了一種基于Hi3507的視頻監(jiān)控系統(tǒng)的設計方案,可廣泛用于銀行、超市、交通道路等場所。
本系統(tǒng)分為3大部分:IP Camera模塊,流媒體服務器模塊和客戶端模塊。IP Camera模塊用來完成視頻圖像的采集、編碼任務,由SoC芯片Hi3507、圖像傳感器OV2643、存儲器等外圍器件組成,是整個系統(tǒng)中的核心模塊。系統(tǒng)工作流程如下:主芯片 Hi3507控制圖像傳感器OV2643采集模擬圖像并完成模數(shù)轉(zhuǎn)換,轉(zhuǎn)換后的視頻圖像經(jīng)digital camera接口送入主芯片內(nèi)處理,Hi3507 MPP系統(tǒng)的VI模塊捕獲視頻圖像后首先交由VPP模塊進行編碼前的圖像處理,再通過AHB總線將其寫入外存(DDR2 SDRAM)中,VENC模塊從外存中讀取原始圖像進行H.264編碼處理,編碼后的視頻流重新寫入外存中,然后流媒體服務器從外存中讀取視頻流并將其封裝成RTP數(shù)據(jù)包轉(zhuǎn)發(fā)到客戶端,最后客戶端開發(fā)相應的客戶端播放器,對視頻編碼流解碼后就可以看到高清的實時監(jiān)控畫面。圖1是視頻監(jiān)控系統(tǒng)的總體設計圖。
圖1 系統(tǒng)總體設計圖
Hi3507是一款基于ARM926EJ-S處理器內(nèi)核和視頻硬件加速引擎的高性能通信媒體處理器,具有高集成、可編程、支持H.264和MJPEG等多協(xié)議的優(yōu)點,廣泛應用于實時視頻通信、網(wǎng)絡攝像機等領域。視頻處理單元支持高清720P@30 fps,支持H.264和MJPEG雙碼流同時編碼,H.264 編碼算法極大地提高了視頻質(zhì)量,同時提供場編碼或者幀編碼,靈活支持不同的顯示終端,圖形處理單元提供運動檢測功能,并支持視頻、圖形縮放和OSD[1]。
視頻采集設備采用Omni Visio公司生產(chǎn)的CMOS圖像傳感器OV2643,該芯片采用2.2 μmOmniPixel3-HS架構(gòu),允許1250 mV/lux-sec光照敏感度,支持自動曝光、自動白平衡、透鏡校正、圖像邊緣增強等功能。具備200萬像素,并支持最高300萬像素下的抓拍模式,可以在30 fps下完成720P高清視頻的拍攝,同時支持UXGA和SVGA兩種模式。該芯片支持兩路輸入,輸出格式支持YUV422/YCbCr422、GBR422、RGB565/555和RAW RGB[2]。
OV2643圖像傳感器與Hi3507主芯片的通信是通過I2C總線協(xié)議完成的。OV2643的SIO_C和SIO_D引腳分別與Hi3507的SCL和SDA引腳連接,Hi3507通過I2C總線對OV2643的寄存器進行配置來實現(xiàn)OV2643芯片的初始化和過程控制,將OV2643的HREF和VSYNC分別作為行同步信號和幀同步信號輸入,OV2643通過DATA[0:7]端口將8位圖像數(shù)據(jù)從VI0DAT[2:9]輸入,同時輸出像素時鐘(PCLK)。視頻采集模塊硬件接口如圖2所示。
圖2 視頻采集模塊硬件接口
在網(wǎng)絡視頻監(jiān)控系統(tǒng)中,存儲模塊分為DDR2 SDRAM和NOR Flash兩類,存儲模塊是視頻壓縮過程中非常重要的部分,DDR2 SDRAM為軟件系統(tǒng)運行提供物理內(nèi)存,NOR Flash則用來存儲系統(tǒng)軟件的映像文件和上層應用程序。NOR Flash存儲模塊采用的是S29GL256N,Hi3507的SMI控制器對外提供異步靜態(tài)存儲器接口來連接NOR Flash,用以實現(xiàn)系統(tǒng)的啟動和數(shù)據(jù)的存儲等功能。DDR2 SDRAM采用HY5PS1G1631CFP-Y5,Hi3507的DDRC控制器對外提供DDR2接口,用于完成DDR2 SDRAM的訪問。鑒于H.264算法數(shù)據(jù)量大的特點,此系統(tǒng)采用兩片16位的DDR2 SDRAM與其連接,最大支持512 MB存儲空間。以太網(wǎng)模塊采用Realtek公司的網(wǎng)卡芯片RTL8201CP,Hi3507的以太網(wǎng)接口ETH提供MII接口與RTL8201CP連接,可以工作在10 Mb/s或者100 Mb/s,支持全雙工或半雙工工作模式,同時支持對網(wǎng)口的幀進行選擇性過濾接收和流量限制功能。
圖3 軟件總體設計流程
嵌入式軟件開發(fā)平臺主要包括上位機Linux環(huán)境的搭建、交叉編譯環(huán)境的搭建和操作系統(tǒng)的移植,開發(fā)和調(diào)試采用“宿主機+目標機”的模式進行,宿主機和目標機分別是PC機和IP Camera。宿主機采用Linux操作系統(tǒng)作為開發(fā)環(huán)境,解壓并安裝Hi3507的SDK,安裝交叉編譯環(huán)境、TFTP服務器和超級終端完成宿主機開發(fā)環(huán)境的搭建。操作系統(tǒng)的移植包括Bootloader、Linux內(nèi)核和文件系統(tǒng)的移植。Bootloader是基于uboot-1.4.4開發(fā),根據(jù)Hi3507的相關硬件特性進行裁減,在宿主機上使用AXD調(diào)試軟件并通過JTAG仿真器將Uboot燒寫到目標板中,并設置從Flash中啟動操作系統(tǒng)。同時根據(jù)應用需求配置并裁剪Linux內(nèi)核和文件系統(tǒng),Linux內(nèi)核和文件系統(tǒng)分別是基于linux-2.6.14和busybox-1.1.2來開發(fā)的,可以通過網(wǎng)口下載到目標板中,目標板的開發(fā)環(huán)境搭建完畢。
目標板上電后,啟動進入內(nèi)核,加載Hi3507軟件開發(fā)包提供的MPP系統(tǒng)中的各個接口和外圍芯片驅(qū)動,只需調(diào)用其提供的API函數(shù)就可以完成上層應用軟件的設計。本文重點闡述了IP Camera模塊和流媒體服務器的軟件開發(fā),軟件總體設計流程如圖3所示。
3.1 IP Camera軟件設計
IP Camera軟件設計分為驅(qū)動程序設計和視頻編碼軟件設計。驅(qū)動程序為應用程序提供訪問接口,應用程序用來驗證驅(qū)動程序的有效性,二者密不可分。
3.1.1 驅(qū)動程序設計
OV2643圖像傳感器負責視頻圖像的采集,首先要為其編寫相應的驅(qū)動程序。驅(qū)動程序包括OV2643驅(qū)動程序和I2C總線驅(qū)動程序,這里用GPIO來模擬I2C總線。OV2643設備文件操作接口的數(shù)據(jù)結(jié)構(gòu)如下所示:
static struct file_operations OV2643_fops = {
.owner = THIS_MODULE,
.read = OV2643_read, //讀設備
.write = OV2643_write, //寫設備
.ioctl = OV2643_ioctl, //控制命令
.open = OV2643_open, //打開設備
.release = OV2643_close, //關閉設備
};
驅(qū)動程序的主要任務就是填充文件操作接口數(shù)據(jù)結(jié)構(gòu)中定義的子函數(shù),OV2643_open和OV2643_close在設備打開或關閉時被調(diào)用,OV2643_read函數(shù)通過系統(tǒng)調(diào)用copy_to_user(buf, ®_data, count)把緩存數(shù)據(jù)從內(nèi)核空間拷貝到用戶空間處理。在驅(qū)動程序中,ov2643_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)是用戶進程向OV2643設備進行I/O控制的方法。其中cmd是控制字,本系統(tǒng)涉及到的控制字有OV2643_CONFIG_720P、OV2643_CONFIG_VGA、OV2643_CONFIG_QVGA,分別操控3種不同分辨率視頻的拍攝。
相關子函數(shù)編寫完成后,需要編寫module_init()和module_exit( )函數(shù)。module_init()是驅(qū)動程序的入口,它包括加載GPIO_I2C模塊、注冊OV2643設備、初始化OV2643設備。
3.1.2 視頻編碼軟件設計
視頻編碼軟件的設計包括系統(tǒng)初始化、視頻采集和編碼程序的設計,主函數(shù)中自定義了一個視頻編碼函數(shù),同時創(chuàng)建一個線程來獲取并存儲視頻流。視頻編碼軟件設計流程圖略——編者注。
Hi3507為軟件開發(fā)者提供了專門的媒體軟件處理平臺MPP,MPP層基于驅(qū)動層,屏蔽了Hi3507芯片媒體處理硬件的操作細節(jié),提供面向媒體業(yè)務的基本功能,為上層應用軟件提供MPI接口。應用程序啟動MPP業(yè)務前,必須完成MPP系統(tǒng)初始化工作,主要是視頻緩存池和系統(tǒng)控制兩大部分的初始化。視頻緩存池主要為視頻編碼提供大塊物理內(nèi)存,負責內(nèi)存的分配和回收,調(diào)用HI_MPI_VB_SetConf和HI_MPI_VB_Init完成視頻緩存池的配置和初始化工作;系統(tǒng)控制則根據(jù)Hi3507芯片特性,完成硬件各個部件的復位、基本初始化工作,同時負責完成MPP系統(tǒng)各個業(yè)務模塊的初始化、去初始化以及管理MPP系統(tǒng)各個業(yè)務模塊的工作狀態(tài),調(diào)用HI_MPI_SYS_SetConf和HI_MPI_SYS_Init完成MPP系統(tǒng)配置和初始化。整個系統(tǒng)的初始化流程略——編者注。當應用程序退出MPP業(yè)務后,還需要調(diào)用HI_MPI_SYS_Exit和HI_MPI_VB_Exit函數(shù)完成MPP系統(tǒng)去初始化和釋放資源[3]。
主函數(shù)中調(diào)用自定義函數(shù)SAMPLE_720pH264_Enable(video_setting)完成視頻編碼,采集參數(shù)定義在如下的video profile結(jié)構(gòu)體中:
typedef struct video_profile{
unsigned int bit_rate; //比特率
unsigned int width; //圖像寬度
unsigned int height; //圖像高度
unsigned int framerate; //幀率
unsigned int gop_size; //圖像組長度
}video_setting;
采集程序調(diào)用open("/dev/misc/ov2643",O_RDWR)函數(shù)打開設備文件,第一個參數(shù)代表設備文件打開路徑,第二個參數(shù)表示以讀、寫的方式打開文件。成功打開設備后需要對OV2643進行配置,配置函數(shù)調(diào)用ioctl(fd,cmd)函數(shù)來配置OV2643,fd代表成功打開OV2643后返回的文件描述符,cmd代表控制字,配置函數(shù)根據(jù)主函數(shù)傳遞的采集參數(shù)來選擇控制字,驅(qū)動函數(shù)為配置函數(shù)提供了OV2643_CONFIG_720P、OV2643_CONFIG_VGA、OV2643_CONFIG_QVGA三個控制字,用來支持拍攝3種不同分辨率的視頻圖像,在驅(qū)動程序中需要對3種不同采集方式的寄存器分別進行配置。
視頻采集后進入Hi3507中進行處理和編碼,Hi3507有一個VI設備接口,可支持一路視頻輸入,視頻的編碼是由VI和VENC兩個模塊完成的。VI模塊用于視頻捕獲,其公共屬性中設置視頻輸入接口模式為數(shù)字輸入模式,VI捕獲子流程略——編者注。VENC完成視頻的編碼,首先要配置H.264編碼屬性和編碼通道屬性,設置圖像分辨率為1280×720,VI輸入幀率和目標幀率為30 fps,采用幀編碼模式和幀模式獲取碼流,配置完成后創(chuàng)建一個通道組,用于容納通道,如果有多路編碼,首先需要創(chuàng)建多個通道組,創(chuàng)建的通道組需與指定的VI通道完成綁定,然后創(chuàng)建所需要的編碼通道并將其注冊到指定的編碼通道組,最后啟動通道進行編碼,H.264編碼子流程略——編者注。編碼完成后強制停止并銷毀視頻編碼,其流程圖略——編者注。
3.1.3 獲取并存儲視頻編碼流
創(chuàng)建線程獲取和存儲編碼流,首先獲取編碼通道fd,選擇該編碼通道,如果出錯或超時則退出,否則根據(jù)查詢到當前幀中的碼流包個數(shù)來分配結(jié)構(gòu)體緩存大小,可以通過分配一個非常大的緩存來容納任何情況下的一幀所有碼流包。獲取碼流后對碼流進行存儲,還要進行釋放碼流,按照先取出先釋放的順序釋放,盡早釋放,防止碼流阻塞,當釋放完分配的碼流包結(jié)構(gòu)體緩存后開始下一個循環(huán),具體流程圖略——編者注。
3.2 流媒體服務器軟件設計
圖4 NALU單元頭格式
本文采用支持RTP/RTCP、RTSP協(xié)議的live555開源項目來完成視頻流的傳輸,首先要熟悉H.264的碼流格式以及RTP封包發(fā)送過程。H.264基本流是由一系列的NALU組成,H.264壓縮標準采用前綴碼0x00 0001作為NALU的分隔符,可以通過搜索前綴碼0x00 0001來識別一個NALU,每個NALU單元由一個NALU頭和若干個字節(jié)的載荷數(shù)據(jù)組成。NALU單元頭格式如圖4所示,其中TYPE是NALU中最重要的語法元素,它指出了NALU的類型。
每一個RTP數(shù)據(jù)包都由固定包頭和載荷兩部分組成,其頭部格式是固定的,載荷是經(jīng)壓縮編碼后的視頻數(shù)據(jù),RTP固定包頭格式如圖5所示。
圖5 RTP固定包頭
RTP數(shù)據(jù)包格式包含了傳輸媒體的類型、格式、序列號、時間戳和是否有附加數(shù)據(jù)等信息,為實時流媒體傳輸提供了相應的基礎。使用RTP協(xié)議傳輸流媒體數(shù)據(jù)時,RTP協(xié)議首先從上層鏈路獲取流媒體數(shù)據(jù),加入RTP頭后向下發(fā)送到UDP層,在UDP層加入UDP頭后發(fā)送到IP層,最后在IP層加入IP頭后通過網(wǎng)絡傳輸?shù)娇蛻舳恕T赗TP會話期間,參與者周期性地傳送RTCP包,動態(tài)調(diào)整數(shù)據(jù)傳輸速率,實現(xiàn)流量控制和阻塞控制,以適應網(wǎng)絡環(huán)境的變化。按照規(guī)范,RTP包和RTCP包會通過兩個連續(xù)的UDP端口進行分流,RTP使用偶數(shù)端口,RTCP使用相鄰的奇數(shù)端口[4],RTP包發(fā)送過程如圖6所示。
圖6 RTP包發(fā)送過程
RTSP協(xié)議主要用于控制流的網(wǎng)絡傳輸,服務器端主要任務是從視頻流中分離出每個NALU單元并封裝成RTP包進行發(fā)送。本文采用live555開源項目來實現(xiàn)基于RTP/RTCP、RTSP協(xié)議的視頻數(shù)據(jù)的流化、傳輸及處理,live555主要包括UsageEnvironment、BasicUsageEnvrionment、GroupSock、LiveMedia四個基本庫和各種測試代碼。流媒體服務器端接收到客戶端發(fā)送的Play報文時開始視頻流的傳輸,具體的視頻流傳輸是通過子會話對象ServerMediasubsession中的Source和Sink來完成的,發(fā)送的實質(zhì)是Sink從Source讀取視頻流的過程。RTP包的發(fā)送是從MediaSink::startplaying函數(shù)調(diào)用開始的,從Sink上調(diào)用startplaying,從Source讀取一個幀的數(shù)據(jù)并返回給Sink,通過調(diào)用回調(diào)函數(shù)afterGettingFrame的方式,由發(fā)送數(shù)據(jù)函數(shù)SendPacketifnecessary()發(fā)送數(shù)據(jù)。一個包發(fā)送完成之后,若數(shù)據(jù)發(fā)送完,則停止;若沒有發(fā)送完,則繼續(xù)調(diào)用SendNext()函數(shù)來發(fā)送下一個包,下一個包又會調(diào)用buildAndSendPacket函數(shù)來組建新的RTP頭。RTP打包發(fā)送函數(shù)調(diào)用流程圖略——編者注。
客戶端與服務器端的交互是通過Option、Describe、Setup、Play和Teardown五個報文來實現(xiàn)的,客戶端通過向服務端發(fā)送建立RTSP會話請求并通過服務器認證后,就可以接收來自服務器端的RTP包,客戶端從接收的RTP包中解析出NALU單元并進行解碼播放,用戶就可以看到實時高清的視頻。
系統(tǒng)測試證明,客戶端視頻播放流暢,系統(tǒng)運行穩(wěn)定。該方案對于實時高清網(wǎng)絡視頻監(jiān)控領域具有一定的借鑒意義。
[1] 深圳海思半導體.海思Hi3507 H.264編碼處理器用戶指南,2011.
[2] Omni Vision Technologies.OV2643 Color CMOS UXGA(2 megapixel)Image Sensor with OmniPixel3-HS Techonology ,Version1.0[EB/OL].[2014-10].http://www.ovt.com.
[3] 深圳海思半導體.海思Hi3507 Hi3507 媒體處理軟件開發(fā)參考,2011.
[4] 李校林,劉海波.RTP/RTCP,RTSP在無線視頻監(jiān)控系統(tǒng)的設計與實現(xiàn)[J].電視技術,2011,35(19):89-92.
劉明健(碩士研究生),主要研究方向為視頻壓縮編碼、嵌入式系統(tǒng)。
Liu Mingjian
(School of Information Engineering,Jiangxi University of Science and Technology,Ganzhou 341000,China)
Network video surveillance system not only requires high definition image,but also has very high request about the compression and transmission of video image.The design selects Hisilicon’s SoC chip Hi3507 as the main chip,combining with CMOS HD image sensor OV2643,H.264 encoded technology and streaming media server based on live555, then realizes a HD network surveillance system.The practice shows that this system not only collects the clear and smooth image in real-time,but also has a high ratio of quality to price.
Hi3507;OV2643;H.264;live555;streaming media server
TN277
A
?士然
2014-10-04)