王寶珠,程 杰
(河北工業(yè)大學(xué) 信息與工程學(xué)院,天津 300401)
由于網(wǎng)絡(luò)與信息技術(shù)的不斷發(fā)展,遠(yuǎn)程視頻監(jiān)控技術(shù)得到了廣泛的推廣,同時(shí)對(duì)視頻傳輸?shù)男省⒐摹?shí)時(shí)性、分辨率以及傳輸設(shè)備的體積大小等方面提出了更高的要求。自從H.264編碼標(biāo)準(zhǔn)發(fā)布以來(lái),因其具有優(yōu)異的壓縮性能、很好的網(wǎng)絡(luò)親和性,獲得了極大地支持與應(yīng)用。但在很多應(yīng)用場(chǎng)合是通過(guò)調(diào)用H.264編碼庫(kù),實(shí)現(xiàn)了軟件方式的編解碼。本文采用擁有強(qiáng)大的多媒體處理能力ARM11芯片進(jìn)行開(kāi)發(fā),它內(nèi)部集成了專門(mén)處理多媒體數(shù)據(jù)的位處理器,通過(guò)ARM內(nèi)部的MFC模塊完成了對(duì)H.264的硬件方式的編解碼。本論文視頻服務(wù)器建立在具有豐富的網(wǎng)絡(luò)協(xié)議、較強(qiáng)的穩(wěn)定性的Linux系統(tǒng)上,完成了視頻數(shù)據(jù)的采集、壓縮,然后發(fā)送到Boa中,然后通過(guò)以太網(wǎng)發(fā)送到上位機(jī)進(jìn)行顯示,實(shí)現(xiàn)了遠(yuǎn)程的實(shí)時(shí)監(jiān)控[1]。
本系統(tǒng)主要以友善之臂Tiny6410開(kāi)發(fā)板作為視頻服務(wù)器平臺(tái)。Tiny6410核心板采用ARM1176JZF-S核設(shè)計(jì)的CPU,S3C6410內(nèi)部集成了強(qiáng)大的多媒體處理單元,支持Mpeg4、H.264等格式的硬件編解碼,核心板集成了256M的DDRRAM、1GB Nand Flash存儲(chǔ)器,通過(guò)豐富的接口資源與外圍電路相連接。本論文所涉及的主要接口包括標(biāo)準(zhǔn)DB9串口、SD卡接口、JTAG接口、USB串口以及網(wǎng)絡(luò)接口。整個(gè)硬件系統(tǒng)框圖如圖1所示。

圖1 硬件系統(tǒng)結(jié)構(gòu)圖Fig.1 Structure diagram of hardware system
在該硬件系統(tǒng)中現(xiàn)代的v500攝像頭通過(guò)usb接口與開(kāi)發(fā)板相連,向S3C6410提供YUY2格式的視頻幀。目標(biāo)板通過(guò)串口與宿主機(jī)連接,通過(guò)超級(jí)終端與目標(biāo)板進(jìn)行通信,對(duì)目標(biāo)板進(jìn)行控制和文件的傳輸。JTAG接口連接Jlink仿真器,通過(guò)宿主機(jī)上的rvds軟件進(jìn)行程序的調(diào)試。SD卡用于燒寫(xiě)superboot,然后完成整個(gè)linux系統(tǒng)的移植工作與應(yīng)用軟件的復(fù)制工作。服務(wù)器通過(guò)DM900網(wǎng)卡與遠(yuǎn)程客戶端進(jìn)行通信。
整個(gè)軟件系統(tǒng)包括引導(dǎo)裝入程序、Linux內(nèi)核、文件系統(tǒng)、各種驅(qū)動(dòng)程序以及應(yīng)用軟件組成。圖2為視頻服務(wù)器的軟件結(jié)構(gòu)框圖。

圖2 軟件系統(tǒng)結(jié)構(gòu)圖Fig.2 Structure diagram of software system
在進(jìn)行系統(tǒng)移植之前,首先在宿主機(jī)上建立開(kāi)發(fā)環(huán)境,安裝linux虛擬操作系統(tǒng),安裝編譯調(diào)試軟件RVDS,建立與目標(biāo)板通信的超級(jí)終端,建立交叉編譯環(huán)境等相關(guān)操作。
本系統(tǒng)首先在SD卡中燒寫(xiě)superboot,然后將Uboot引導(dǎo)程序移植到Nand Flash中,然后移植版本為L(zhǎng)inux 2.6.38的內(nèi)核,接著移植根文件系統(tǒng)Rootfs,這樣整個(gè)操作系統(tǒng)環(huán)境就搭建完成了。在編譯Linux內(nèi)核之前,要配置本系統(tǒng)所需的驅(qū)動(dòng)模塊,將MFC驅(qū)動(dòng)和萬(wàn)能攝像頭驅(qū)動(dòng)集成到內(nèi)核中[2]。
V4L2是集成在Linux系統(tǒng)中的一個(gè)虛擬的設(shè)備驅(qū)動(dòng)。主要功能是使應(yīng)用程序發(fā)現(xiàn)多媒體設(shè)備,然后對(duì)設(shè)備進(jìn)行操作管理。它提供了各種API接口,在本系統(tǒng)中完成了對(duì)攝像頭視頻流的捕獲與輸出,如圖3為數(shù)據(jù)幀采集流程圖[3]。

圖3 數(shù)據(jù)采集流程Fig.3 Flow diagram of data capture
1)打開(kāi)設(shè)備文件。 fd=open(Devicename,mode);第一個(gè)參數(shù)是注冊(cè)在/dev/目錄下的設(shè)備名,打開(kāi)模式可分為阻塞和非阻塞模式。
2)獲取設(shè)備屬性。通過(guò)調(diào)用 ioctl(fd,VIDIO_QUERYCAP,&cp)獲取打開(kāi)設(shè)備相關(guān)參數(shù)存放到cp結(jié)構(gòu)中。
3)設(shè)置捕獲格式。 調(diào)用 ioctl(fd,VIDIOCS_FMT,&fmt)設(shè)置捕獲圖像的存儲(chǔ)格式、寬帶、高度、像素大小等。
4)為視頻幀分配內(nèi)存。 通過(guò) ioctl(fd,VIDIOC_REQBUFS,&req)向內(nèi)核申請(qǐng)req.count個(gè)緩存。
5)映射緩存。首先通過(guò)VIDIOC_QUERBUF獲取緩存地址,然后mmap到用戶空間。
6)視頻幀的采集。調(diào)用read()將數(shù)據(jù)存放到緩存中。
7)處理采集數(shù)據(jù)。V4L2的數(shù)據(jù)緩存采用FIFO的方式,當(dāng)應(yīng)用程序?qū)⒆钕炔傻降囊粠瑪?shù)據(jù)取走時(shí),將重新采集最新的數(shù)據(jù)。
8)關(guān)閉視頻設(shè)備。調(diào)用close()實(shí)現(xiàn)設(shè)備的關(guān)閉。
本系統(tǒng)通過(guò)S3C6410內(nèi)部多媒體編解碼模塊實(shí)現(xiàn)H.264標(biāo)準(zhǔn)的視頻壓縮。采用硬壓縮不占用CPU資源而且速度更快,為視頻的實(shí)時(shí)傳輸做好了準(zhǔn)備[4]。如圖4為MFC編碼流程圖。

圖4 h.264編碼流程圖Fig.4 Flow diagram of h.264 encoder
1)初始化H.264編碼環(huán)境。調(diào)用SsbSipH264 EncodeInit(Width, Height, Framerate, Bitrate, GOPNum) 來(lái)打開(kāi) MFC設(shè)備并且對(duì)編碼結(jié)構(gòu)參數(shù)進(jìn)行初始化。
2)設(shè)置編碼參數(shù)。調(diào)用SsbSip H264 EncodeS et Config(open Handle,type,value)對(duì)編碼的各種參數(shù)進(jìn)行配置。
3)獲得視頻輸入地址。通過(guò)SsbSipH264EncodeGetInBuf(openHandle,size)獲取視頻輸入地址。
4)通過(guò) memcpy(p_inbuf, in_addr, frame_size)將需要編碼視頻幀復(fù)制到編碼時(shí)存放原始數(shù)據(jù)的緩存中。
5)通過(guò) SsbSipH264EncodeExe(handle)函數(shù)進(jìn)行編碼壓縮。
6)關(guān)閉設(shè)備,調(diào)用 SsbSipH264 EncodeDeInit(handle)函數(shù)釋放占用資源并且關(guān)閉設(shè)備。
本系統(tǒng)將boa移植到運(yùn)行在ARMM11開(kāi)發(fā)板上的Linux系統(tǒng)中,建立了嵌入式web服務(wù)器,為遠(yuǎn)程客戶端提供基于HTTP協(xié)議的網(wǎng)絡(luò)接入方式。Boa支持基于CGI的動(dòng)態(tài)網(wǎng)頁(yè),因此采用編寫(xiě)CGI腳本對(duì)遠(yuǎn)程客戶端的請(qǐng)求進(jìn)行響應(yīng),發(fā)送經(jīng)過(guò)編碼的視頻數(shù)據(jù)包。如圖5為boa中視頻傳輸?shù)牧鞒虉D[5]。

圖5 數(shù)據(jù)傳輸流程圖Fig.5 Flow diagram of data transmission
1)完成boa服務(wù)器的初始化工作。
2)通過(guò)socket創(chuàng)建流式套接字,并獲得套接字描述符。
3)通過(guò)bind將套接字與服務(wù)器地址綁定。
4)通過(guò)listen對(duì)端口進(jìn)行監(jiān)聽(tīng)。
5)通過(guò)accept等待來(lái)自客戶端的連接請(qǐng)求。
6)建立相互的連接,分析客戶端命令。
7)執(zhí)行CGI腳本程序,發(fā)送數(shù)據(jù)。
8)關(guān)閉套接字,結(jié)束通信。
工作在pc機(jī)上的遠(yuǎn)程客戶端從網(wǎng)絡(luò)接收視頻數(shù)據(jù)包,然后對(duì)視頻幀進(jìn)行解碼與在屏幕上顯示圖像。本系統(tǒng)采用基于開(kāi)源的SDL與FFmpeg庫(kù)提供的API接口,實(shí)現(xiàn)對(duì)視頻的解碼與播放[6]。
1)首先進(jìn)行初始化操作。avcodec_register_all();avdevice_register_all();av_register_all();通過(guò)以上函數(shù)注冊(cè)所有的編解碼器,復(fù)用分離器,文件格式的注冊(cè)。
2)設(shè)置 AVFormatContext結(jié)構(gòu)體,對(duì)整個(gè)編碼過(guò)程所需要的各種參數(shù)進(jìn)行設(shè)置。
3)從以上結(jié)構(gòu)體中找到相關(guān)解碼器的上下文。
4)調(diào)用avcodec_open()函數(shù)打開(kāi) H.264解碼器。
5)調(diào)用avcodec_alloc_frame()函數(shù)分配內(nèi)存來(lái)存儲(chǔ)解碼后得到的yuv數(shù)據(jù)。
6)通過(guò) avcodec_decode_video(p Codec Ctx, Inbuf, &count,outbuf, sizeof(outbuf))函數(shù)對(duì)數(shù)據(jù)進(jìn)行解碼,pCodecCtx 是解碼器的上下文,Inbuf指向解碼后數(shù)據(jù)的位置,count是已完成的幀數(shù),outbuf指向被解碼解碼的原始數(shù)據(jù)。最后調(diào)用SDL庫(kù)中的函數(shù)來(lái)實(shí)現(xiàn)視頻的顯示。
本文完成了遠(yuǎn)程視頻監(jiān)控包括數(shù)據(jù)采集、數(shù)據(jù)壓縮、數(shù)據(jù)傳輸、數(shù)據(jù)顯示的整個(gè)模塊設(shè)計(jì)。采用了性價(jià)比很高的ARM11作為整個(gè)服務(wù)器的數(shù)據(jù)處理核心,搭載了開(kāi)源的具有很好的網(wǎng)絡(luò)親和性和穩(wěn)定性的Linux操作系統(tǒng),使得應(yīng)用軟件有一個(gè)高效和穩(wěn)定的運(yùn)行環(huán)境。實(shí)現(xiàn)了對(duì)視頻數(shù)據(jù)的H.264標(biāo)準(zhǔn)的硬壓縮,極大提高了數(shù)據(jù)的處理與傳輸效率,使得整個(gè)系統(tǒng)具有較好好的實(shí)時(shí)性。在該系統(tǒng)的基礎(chǔ)上,可以進(jìn)行功能的增加和優(yōu)化,實(shí)際應(yīng)用于各種監(jiān)控場(chǎng)合。
[1]葉俊華.ARM11的嵌入式視頻處理終端設(shè)計(jì)[D].長(zhǎng)沙:中南大學(xué),2009.
[2]楊牟剛.基于嵌入式Linux的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].桂林:桂林電子科技大學(xué),2008.
[3]張建江.基于嵌入式Linux的H.264視頻接收系統(tǒng)設(shè)計(jì)[D].西安:西安電子科技大學(xué),2008.
[4]羅智勇.針對(duì)視頻會(huì)議應(yīng)用的H264視頻編碼器研究與實(shí)現(xiàn)[D].廣州:暨南大學(xué),2005.
[5]黃恒強(qiáng).基于ARM和Linux的嵌入式遠(yuǎn)程視頻監(jiān)控系統(tǒng)設(shè)計(jì)[D].南京:南京理工大學(xué),2008.
[6]胡杰.基于ARM的嵌入式視頻監(jiān)控終端的研究[D].武漢:武漢理工大學(xué),2008.