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