王建新,張 凱,王 秀
(西安科技大學(xué)雁塔校區(qū)通信與信息工程學(xué)院,西安710054)
目前,各種視頻采集以及傳輸?shù)南到y(tǒng)都是由DSP(圖像處理),ARM(圖像顯示)以及利用FPGA搭建整個(gè)框架[1],這樣會(huì)造成資源嚴(yán)重浪費(fèi),并且成本較大。隨著嵌入式技術(shù)的迅猛發(fā)展,利用嵌入式實(shí)現(xiàn)遠(yuǎn)程視頻采集、可視電話會(huì)議等應(yīng)用已經(jīng)成為可能。
本文基于 S3C2440和 Linux系統(tǒng)平臺(tái),采用USB攝像頭捕捉視頻信號(hào),利用V4L2應(yīng)用編程接口函數(shù),實(shí)現(xiàn)了視頻連續(xù)幀圖像的采集,并利用TCP傳輸方式傳輸給服務(wù)器端,實(shí)現(xiàn)對(duì)嵌入式視頻遠(yuǎn)程傳輸。開發(fā)的終端具有體積小,功耗低,適用于便攜式視頻采集需要。
本文以三星公司S3C2440為硬件平臺(tái),其片上64 M SDRAM可以滿足視頻采集軟件的內(nèi)存需要,256 M NAND FlLASH用于存放文件和系統(tǒng),3個(gè)通道的UART等控制器和豐富的接口,使其擴(kuò)展功能強(qiáng)大,功耗低,簡(jiǎn)單穩(wěn)定符合要求。整個(gè)硬件框架如圖1所示。
圖1 系統(tǒng)硬件架構(gòu)
視頻采集傳輸系統(tǒng)軟件架構(gòu)由以下部分組成:USB(ZC301)攝像頭,攝像頭驅(qū)動(dòng),視頻采集應(yīng)用程序,視頻傳輸,視頻顯示組成。如圖2所示。
圖2 視頻采集傳輸系統(tǒng)軟件構(gòu)架
USB攝像頭進(jìn)行采集圖像數(shù)據(jù),采集圖像格式為MJPE,采集應(yīng)用程序通過(guò)攝像頭驅(qū)動(dòng)從攝像頭獲得采集的圖像數(shù)據(jù)。利用V4L2接口函數(shù)對(duì)設(shè)備采集的數(shù)據(jù)進(jìn)行操作,最后通過(guò)網(wǎng)絡(luò)傳輸(TCP)將數(shù)據(jù)傳輸給PC機(jī)進(jìn)行顯示[2]。
Linu系統(tǒng)具有開源性,高可靠性和強(qiáng)大的網(wǎng)絡(luò)功能等特點(diǎn)。在此基于linux2.6內(nèi)核,對(duì)其進(jìn)行裁剪和配置,使內(nèi)核支持USB驅(qū)動(dòng)和V4L2標(biāo)準(zhǔn),建立交叉編譯環(huán)境,移植編譯好的內(nèi)核到目標(biāo)板,以構(gòu)建linux文件系統(tǒng),進(jìn)行視頻采集傳輸應(yīng)用程序的開發(fā)。
在linux系統(tǒng)下,圖像采集設(shè)備依賴于V4L2(Video 4 linux 2)標(biāo)準(zhǔn)支持,它針對(duì)linux內(nèi)核視頻設(shè)備提供了一系列API接口函數(shù)[3],視頻采集流程如圖3所示。
①打開視頻設(shè)備
在V4L2中,視頻設(shè)備被看作一個(gè)文件。使用open()函數(shù)以阻塞模式打開攝像頭設(shè)備,函數(shù)格式為:
open()函數(shù)中包含兩個(gè)參數(shù),第1個(gè)參數(shù)代表打開的設(shè)備文件名,第2個(gè)參數(shù)代表設(shè)備的打開類型(讀/寫,阻塞或非阻塞),返回值為文件描述符fd,若返回值為大于0,則打開設(shè)備正確;若返回值為-1,則打開設(shè)備錯(cuò)誤。
②初始化設(shè)備,包括獲取設(shè)備信息,設(shè)置設(shè)備格式,函數(shù)格式為:
圖3 視頻采集流程
③設(shè)置視頻捕獲格式
當(dāng)檢測(cè)完視頻設(shè)備支持的標(biāo)準(zhǔn)后,還需要設(shè)定視頻捕獲格式,函數(shù)格式如下:
④分配內(nèi)存
向驅(qū)動(dòng)申請(qǐng)幀緩沖,一般不超過(guò)5個(gè)。使用ioctl命令字VIDIOC_REQBUFS來(lái)調(diào)用struct v4l2_requestbuffers,v4l2_requestbuffers結(jié)構(gòu)中定義了緩存的數(shù)量,驅(qū)動(dòng)會(huì)據(jù)此申請(qǐng)對(duì)應(yīng)數(shù)量的視頻緩存。
⑤獲取并記錄緩存的物理空間
使用VIDIOC_REQBUFS,獲取兩個(gè)緩存,并通過(guò)調(diào)用VIDIOC_QUERYBUF命令來(lái)獲取這些緩存的地址,再使用mmap()函數(shù)轉(zhuǎn)換成應(yīng)用程序中的絕對(duì)地址,最后把這段緩存放入緩存隊(duì)列。使用V4L2進(jìn)行圖像采集時(shí)候,在一幀緩沖完成之后,都會(huì)將第二幀覆蓋到另一個(gè)緩存中,req.count個(gè)緩存輪流使用,不丟數(shù)據(jù)。函數(shù)格式如下:
ioctl(fd,VIDIOC_QUERYBUF,&buf);//獲取到對(duì)應(yīng)index的緩存信息,此處主要利用length信息及offset信息來(lái)完成后面的mmap操作。與用戶空間傳遞數(shù)據(jù)的一個(gè)中介,會(huì)被循環(huán)利用。
⑥圖像數(shù)據(jù)采集
V4L2有三種視頻圖像采集方式:read()、write()方式,內(nèi)存映射方式和用戶指針方式。
本文采用的內(nèi)存映射方式是在內(nèi)核空間開辟一段地址空間,通過(guò)mmap()系統(tǒng)調(diào)用將其映謝到地址空間。
圖像采集過(guò)程中需要使用兩個(gè)ioctl的命令:即VIDIOC_DQBUF和VIDIOC_QBUF命令。函數(shù)格式為:
在配置內(nèi)核時(shí)候,對(duì)USB驅(qū)動(dòng)初始化,我們加上V4L2,并修改.config文件,支持ZC301攝像頭,然后進(jìn)行編譯成內(nèi)核鏡像。
常用的圖像傳輸協(xié)議有TCP協(xié)議和UDP協(xié)議。
TCP是傳輸控制協(xié)議,是一種面向連接(連接導(dǎo)向)的、可靠的、基于字節(jié)流的運(yùn)輸層通信協(xié)議。UDP即用戶數(shù)據(jù)報(bào)協(xié)議,是一種無(wú)連接協(xié)議,傳輸數(shù)據(jù)之前客戶端和服務(wù)器端不建立連接[4]。
在傳輸過(guò)程中,TCP在丟包方面比UDP嚴(yán)密,不容易丟包。因此本文為利用TCP協(xié)議來(lái)傳輸數(shù)據(jù),首先初始化攝像頭利用V4L2接口,連接到linux系統(tǒng)的公用協(xié)議標(biāo)準(zhǔn),然后將數(shù)據(jù)存放至緩沖區(qū),產(chǎn)生數(shù)據(jù)包,并且將數(shù)據(jù)包利用TCP傳輸,最后傳輸?shù)?PC 機(jī)并顯示出來(lái)[5]。
在linux中網(wǎng)絡(luò)編程是通過(guò)socket接口來(lái)進(jìn)行的。Socket是一種常用的進(jìn)程之間的通信機(jī)制。TCP協(xié)議下的socket編程流程圖,如圖4所示。
Socket編程基本函數(shù)有 socket()、bind()、listen()、accept()、Send()以及 Recv()等,其中根據(jù)客戶端還是服務(wù)器,這些函數(shù)的調(diào)用流程有所區(qū)別,這里對(duì)每個(gè)函數(shù)進(jìn)行簡(jiǎn)明:
圖4 TCP協(xié)議socket編程流程圖
Socket():該函數(shù)用于建立一個(gè)socket連接,可以指定socket類型信息,對(duì)結(jié)構(gòu)體sockaddr_in初始化:包含地址族,端口號(hào),IP地址等;
Bind()該函數(shù)用于將本地IP地址綁定到端口號(hào),若綁定其他IP地址則不成功。另外還用于TP連接;
Listen():服務(wù)端程序成功建立套接字和地址進(jìn)行綁定之后,還需要準(zhǔn)備在該套接字上接受新的連接請(qǐng)求;
Accept():調(diào)用accept()函數(shù)等待并且接收客戶端的連接請(qǐng)求;
Connect():用于與服務(wù)器建立連接;
Send()與Recv():分別用于發(fā)送和接收數(shù)據(jù)。
搭建目標(biāo)機(jī)linux2.6.32運(yùn)行環(huán)境,并且通過(guò)宿主機(jī)使用交叉編譯器連接生成可執(zhí)行文件,向目標(biāo)機(jī)移植后運(yùn)行。
將USB攝像頭同目標(biāo)機(jī)連接好了之后,若成功掛載USB攝像頭,則終端下會(huì)顯示識(shí)別USB設(shè)備,如圖5所示。
圖5 USB攝像頭驅(qū)動(dòng)測(cè)試結(jié)果
對(duì)整個(gè)系統(tǒng)進(jìn)行測(cè)試,該系統(tǒng)在傳輸320×240大小并以MJPEG編碼的視頻時(shí),視頻監(jiān)控服務(wù)器端觀察圖像流暢并且清晰,足夠滿足視頻監(jiān)控需求,如圖6所示。
圖6 系統(tǒng)測(cè)試結(jié)果
本文提出一種基于S3C2440平臺(tái)和嵌入式linux系統(tǒng)的C/S模型視頻采集和傳輸方案,采用普通市面上的USB攝像頭,極大的降低了成本,利用socket編程實(shí)現(xiàn)TCP網(wǎng)絡(luò)傳輸過(guò)程,經(jīng)測(cè)試,服務(wù)器端可以實(shí)時(shí)的接受到采集傳輸?shù)囊曨l,圖像清晰,滿足視頻監(jiān)控要求。
[1]周立功.ARM&WinCE實(shí)驗(yàn)與實(shí)踐—基于S3C2410[M].北京:北京航空航天大學(xué)出版社,2007.
[2]王培珍,徐俊生.基于ARM9的嵌入式linux圖像采集設(shè)計(jì)系統(tǒng)[J].中國(guó)制造業(yè)信息化,2007,10:85-88
[3]李新峰,何廣生,趙秀文.基于ARM9的嵌入式Linux開發(fā)技術(shù)[M].北京:電子工業(yè)出版社,2008,10:118-127
[4]陳文智.嵌入式系統(tǒng)開發(fā)原理與實(shí)踐[M].北京:清華大學(xué)出版社,2005.
[5]怯肇乾.嵌入式網(wǎng)絡(luò)通信開發(fā)應(yīng)用[M].北京:北京航空航天大學(xué)出版社,2010.
[6]吳明暉.基于ARM的嵌入式系統(tǒng)開發(fā)和應(yīng)用[M].北京:人民郵電出版社,2005.
[7]江湖,蘇詳芳,劉立海,等.基于網(wǎng)絡(luò)的數(shù)字視頻監(jiān)控系統(tǒng)[J].武漢大學(xué)學(xué)報(bào)(自然科學(xué)版),2000,46(5):608-612.
[8]Lu Yinli,Yu Hongli,Zhang Pengpeng.The Implementation of Embedded Image Acquisition Based on V4L2[C]//Electronics,Communications and Control(ICECC),2011 International Conference.Heng yang,China.2011:549-552