欒博悅+張鎣+趙慧元
收稿日期:2013-05-27
作者簡(jiǎn)介:欒博悅(1990—),男,山東牟平人,學(xué)士生,研究方向:電子科學(xué)與技術(shù)。
文章編號(hào):1003-6199(2014)02-0101-04
摘 要:對(duì)基于ARM的視頻數(shù)據(jù)采集傳輸系統(tǒng)進(jìn)行研究及設(shè)計(jì),通過(guò)ARM新一代嵌入式開(kāi)發(fā)平臺(tái),與現(xiàn)在流行的互聯(lián)網(wǎng)及無(wú)線傳輸技術(shù)相結(jié)合,實(shí)現(xiàn)視頻數(shù)據(jù)的采集和遠(yuǎn)程數(shù)據(jù)的傳輸。設(shè)計(jì)中采用嵌入式Linux系統(tǒng)通過(guò)USB攝像頭進(jìn)行視頻數(shù)據(jù)的采集,解決圖像的格式轉(zhuǎn)換和MJPEG編碼壓縮的數(shù)據(jù)處理,以及通過(guò)軟件的設(shè)計(jì)實(shí)現(xiàn)MJPEG格式文件到流媒體輸出等問(wèn)題,最終實(shí)現(xiàn)視頻數(shù)據(jù)采集和傳輸。本系統(tǒng)有以下幾個(gè)方面的應(yīng)用:家庭環(huán)境的實(shí)時(shí)監(jiān)測(cè)、家居的智能化控制、高危車(chē)間廠房無(wú)線監(jiān)控與控制、中長(zhǎng)距離的家庭視頻通訊、企業(yè)實(shí)時(shí)視頻監(jiān)控等。
關(guān)鍵詞:嵌入式;視頻;數(shù)據(jù)采集;傳輸
中圖分類號(hào):TP368文獻(xiàn)標(biāo)識(shí)碼:A
Design and Implementation of Video Data Acquisition and Transmission Based on ARM
LUAN Boyue,ZHANG Ying,ZHAO Huiyuan
(Beijing Institute ofTechnologu,Zhuhai,Guangdong 519085,China)
Abstract:The video data acquisition and transmission based on ARM is discussed in this paper. through a new generation of ARM embedded development plaform,and combined with internet and wireless transmission technology,implementation of video data acquisition and remote data transmission.Usingembedded Linux system through the USB camera for video data collection,solve the image format conversion and MJPEG encoding date processing,designed and implemented through software MJPEG format output files to streaming media,finally achieved of video date acquisition and transmission.This system can be used for real-time monitoring of family environment and home intelligent control,in some highrisk factory workshop wireless monitoring and control ,can also be used in longdistance home video communications and realtime video surveillance in enterprise.
Key words:embedded system;video; data acquisition;transmission
1 引 言
隨著人們?nèi)粘I罟ぷ鞯木W(wǎng)絡(luò)化,各種系統(tǒng)的無(wú)線化,以及多媒體技術(shù)、寬帶網(wǎng)絡(luò)傳輸技術(shù)的不斷發(fā)展,視頻數(shù)據(jù)的采集和傳輸已成為遠(yuǎn)程監(jiān)控和工業(yè)自動(dòng)化控制領(lǐng)域的一項(xiàng)核心技術(shù)。在日益成熟的ARM嵌入式開(kāi)發(fā)平臺(tái)下,其穩(wěn)定性也大大提高,通過(guò)CMOS攝像頭將視頻信號(hào)數(shù)字化后再將視頻數(shù)據(jù)進(jìn)行壓縮,經(jīng)由網(wǎng)絡(luò)模塊上傳至局域網(wǎng)或互聯(lián)網(wǎng),實(shí)現(xiàn)了視頻數(shù)據(jù)采集傳輸。
2 系統(tǒng)總體設(shè)計(jì)
整個(gè)系統(tǒng)的設(shè)計(jì)分為三個(gè)部分:USB攝像頭、ARM嵌入式開(kāi)發(fā)平臺(tái)、網(wǎng)絡(luò)模塊。系統(tǒng)整體結(jié)構(gòu)如圖1所示。
系統(tǒng)中所采用的攝像頭是中星微公司生產(chǎn)的ZC301芯片的攝像頭,該攝像頭將CMOS圖像傳感器所產(chǎn)生的圖像信號(hào)送到微處理器,處理后再轉(zhuǎn)換為數(shù)字信號(hào)輸出到外部設(shè)備。ARM嵌入式開(kāi)發(fā)平臺(tái)使用了三星公司S3C2440微處理器[1],其最高時(shí)鐘頻率為533MHZ,并且平臺(tái)包括了256M的NAND Flash、4M NOR Flash、64M SDRAM 和一個(gè)USB host接口。USB host接口用于和攝像頭相接。網(wǎng)絡(luò)模塊采用DAVICOM公司的以太網(wǎng)控制芯片DM9000CEP [2],該芯片裝配有標(biāo)準(zhǔn)10M/100M自適應(yīng)收發(fā)器,16K大容量FIFO,支持以太網(wǎng)接口協(xié)議,當(dāng)從內(nèi)存中接收到的壓縮后的碼流數(shù)據(jù)后,通過(guò)TCP/IP網(wǎng)絡(luò)通信協(xié)議對(duì)數(shù)據(jù)進(jìn)行打包,如果接收到瀏覽器向服務(wù)器的數(shù)據(jù)訪問(wèn)請(qǐng)求,則將數(shù)據(jù)發(fā)送至瀏覽器[3]。以太網(wǎng)芯片與嵌入式微處理器S3C2440接口電路如圖2所示。
圖1 系統(tǒng)整體結(jié)構(gòu)
圖2 以太網(wǎng)接口電路
計(jì)算技術(shù)與自動(dòng)化2014年6月
第33卷第2期欒博悅等:基于ARM的視頻數(shù)據(jù)采集傳輸系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
3 系統(tǒng)軟件結(jié)構(gòu)設(shè)計(jì)
系統(tǒng)的軟件設(shè)計(jì)主要包括:視頻設(shè)備的掛載,視頻數(shù)據(jù)的采集,數(shù)據(jù)格式轉(zhuǎn)換、編碼壓縮,視頻數(shù)據(jù)傳輸?shù)取1鞠到y(tǒng)的視頻圖像顯示涉及到了顏色空間轉(zhuǎn)換問(wèn)題,即對(duì)于現(xiàn)代數(shù)字圖像傳感器的數(shù)據(jù)輸出格式一般為YUV/YCbCr 顏色格式對(duì)RGB顏色格式的一種轉(zhuǎn)換。RGB色彩空間,其顏色在三維空間模型的3個(gè)軸分別對(duì)應(yīng)著紅(Red)、綠(Green)、藍(lán)(Blue),模型內(nèi)部的點(diǎn)對(duì)應(yīng)不同顏色。YUV空間中顏色的三個(gè)分量為亮度Y(Luminance),色度U、V(Chrominance),其中YCbCr也是由YUV經(jīng)過(guò)偏移縮放形成的。具體的轉(zhuǎn)換關(guān)系如下所示[4]:
R = 1.164*(Y-16)+1.596*(Cr-128)
G = 1.164*(Y-16)-0.392*(Cb-128)-0.813*(Cr-128)
B = 1.164*(Y-16)+2.017*(Cb-128) (1)
視頻數(shù)據(jù)的傳輸離不開(kāi)網(wǎng)絡(luò),但是只有遵循一定的協(xié)議才能在網(wǎng)絡(luò)中正確的實(shí)現(xiàn)數(shù)據(jù)的傳送。其中TCP/IP(網(wǎng)絡(luò)通訊協(xié)議)是因特網(wǎng)最基本的協(xié)議,也是互聯(lián)網(wǎng)絡(luò)的基礎(chǔ)。TCP/IP通訊協(xié)議采用了4層的層次結(jié)構(gòu),分別是應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、網(wǎng)絡(luò)接口層,每一層都呼叫它的下一層所提供的網(wǎng)絡(luò)來(lái)完成自己的需求。傳輸層協(xié)議主要是傳輸控制協(xié)議TCP和用戶數(shù)據(jù)報(bào)協(xié)議UDP。應(yīng)用層協(xié)議主要有:FTP、TELNET、HTTP(超文本傳輸協(xié)議)等,本系統(tǒng)所用的傳輸層協(xié)議是TCP協(xié)議,應(yīng)用層協(xié)議為HTTP協(xié)議。
3.1 視頻數(shù)據(jù)采集
系統(tǒng)實(shí)現(xiàn)視頻數(shù)據(jù)采集主要是利用Linux操作系統(tǒng)中通用的Vedio 4 Linux 2接口[5]。Vedio 4 Linux是Linux操作系統(tǒng)中音視頻設(shè)備統(tǒng)一的API,同時(shí)也可以提供無(wú)線電通信、文字電視廣播解碼和垂直消隱的數(shù)據(jù)接口。通過(guò)該接口就可以很方便的將視頻數(shù)據(jù)進(jìn)行采集。利用以下程序代碼,可以任意按用戶需要進(jìn)行配置。
memset(&vd->cap,0,sizeof(struct v4l2_capability));
ret=ioctl(vd>fd,VIDIOC_QUERYCAP, &vd->cap);
獲取攝像頭基本參數(shù)
vd->fmt.fmt.pix.width =vd>width;
捕獲視頻寬度像素
vd->fmt.fmt.pix.height=vd>height;
捕獲視頻高度像素
Struct v4l2_streamparm*setfps;
etfps=(struct v4l2_streamparm*)
calloc(1,sizeof(structv4l2_stre-amparm));
設(shè)置視頻幀頻率
memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers));
vd->rb.count = NB_BUFFER;
設(shè)置視頻幀緩沖區(qū)個(gè)數(shù)
for (i = 0; i < NB_BUFFER; i++) {memset(&vd->buf,0,sizeof(struc-t v4l2_buffer));
將幀緩沖區(qū)數(shù)據(jù)映射到內(nèi)存
int uvcGrab(struct vdIn *vd);
獲取一幀視頻信號(hào)的圖像。
視頻數(shù)據(jù)采集具體流程如圖3所示。
圖3 視頻采集流程圖
3.2 格式轉(zhuǎn)換和MJPEG編碼壓縮
由于不同的攝像頭都有不同的輸出格式,所以進(jìn)行合適的格式轉(zhuǎn)換是非常有必要的,由攝像頭所采集到的原始數(shù)據(jù)并不適合用于傳輸,為了減少傳輸視頻數(shù)據(jù)的碼流大小還需要對(duì)圖像進(jìn)行壓縮。本系統(tǒng)所用的攝像頭輸出YUV 4:2:2格式的圖像數(shù)據(jù),將圖像數(shù)據(jù)轉(zhuǎn)換為RGB格式,再通過(guò)調(diào)用Linux下的Libjpeg庫(kù)對(duì)圖像進(jìn)行壓縮。
格式轉(zhuǎn)換以及壓縮處理過(guò)程和基本代碼函數(shù)名如下:
1)上鎖全局變量的圖像緩沖區(qū)(pthread_mutex_Lock)。
2)判斷圖像顏色編碼格式,如果是YUV格式的顏色編碼(以YUV4:2:2為例,調(diào)用compress_yuyv_o_jpeg函數(shù))將一行YUV轉(zhuǎn)換RGB,并將一行RGB壓縮成JPEG格式[6],行加一,判斷圖像是否壓縮到最后一行。如果是MJPEG編碼格式輸出的圖像(調(diào)用int memcpy_picture函數(shù)),查找起始幀標(biāo)志位,并插入Huffman數(shù)據(jù)表。
3)通知所有線程有一幀數(shù)據(jù)已經(jīng)處理為JPEG格式。
4)解鎖全局變量的圖像緩沖區(qū)。
3.3 視頻數(shù)據(jù)的傳輸
為了實(shí)現(xiàn)能將采集到的視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,本系統(tǒng)使用了在Linux下TCP協(xié)議的Socket編程[7]。Socket接口是一個(gè)在不同進(jìn)程間的通訊端點(diǎn),Socket在Linux系統(tǒng)中被看做是一個(gè)文件,當(dāng)客戶端和服務(wù)器端的Socket被創(chuàng)建時(shí),服務(wù)器端會(huì)調(diào)用accept()函數(shù),并以阻塞方式等待響應(yīng)客戶端的連接請(qǐng)求,連接成功后,雙方就可以進(jìn)行正常的數(shù)據(jù)通信,通訊結(jié)束后,釋放Socket結(jié)構(gòu)。其編程結(jié)構(gòu)如圖4所示。
當(dāng)有多個(gè)客戶端提出請(qǐng)求時(shí)還需要建立多線程并發(fā)服務(wù)器[8],當(dāng)客戶端提出連接請(qǐng)求時(shí),會(huì)建立一個(gè)新的線程,這樣每一個(gè)客戶端都會(huì)有一個(gè)獨(dú)立的線程,實(shí)現(xiàn)多個(gè)線程數(shù)據(jù)的并發(fā)。線程可以對(duì)進(jìn)程的內(nèi)存空間和資源進(jìn)行訪問(wèn),并與同一進(jìn)程中的其他線程共享數(shù)據(jù)區(qū)。因此,并發(fā)服務(wù)器線程的增加并不會(huì)讓服務(wù)器進(jìn)程隨著客戶端的增加而線性增長(zhǎng),這樣就降低了服務(wù)器進(jìn)程壓力,提高了其性能。代碼如下:
pthread_t client;struct addrinfo*aip,*aip2;
struct addrinfo hints;
struct sockaddr_storageclient_a-
ddr;
服務(wù)器監(jiān)聽(tīng)I(yíng)P
socklen_taddr_len=sizeof(structsockaddr_storage);
阻塞方式等待客戶端連接
pcfd->fd = accept(pcontext->sd, (struct sockaddr *)&client_addr, &addr_len);
新客戶端申請(qǐng)結(jié)構(gòu)
while(!pglobal->stop) cfd *pcfd = malloc(sizeof(cfd));
客戶端線程創(chuàng)建
if(pthread_create(&client, NULL, &client_thread, pcfd) != 0)
pthread_detach(client);
圖4 Linux下TCP協(xié)議的Socket編程結(jié)構(gòu)
4 系統(tǒng)運(yùn)行與實(shí)現(xiàn)
由于視頻傳輸數(shù)據(jù)量大、實(shí)時(shí)要求高,完成視頻傳輸,鏈路的數(shù)據(jù)吞吐量必須大于視頻數(shù)據(jù)流量。測(cè)試結(jié)果表明,本系統(tǒng)能夠達(dá)到穩(wěn)定的傳輸效果,圖像清晰,視頻無(wú)卡頓現(xiàn)象,并支持多個(gè)客戶端同時(shí)瀏覽頁(yè)面,最終實(shí)現(xiàn)了視頻數(shù)據(jù)采集傳輸。系統(tǒng)運(yùn)行效果如圖5所示。在移動(dòng)設(shè)備和網(wǎng)絡(luò)飛速發(fā)展的今天,將本系統(tǒng)網(wǎng)絡(luò)進(jìn)行拓展,手機(jī)等移動(dòng)設(shè)備也可作為客戶端,隨時(shí)隨地的進(jìn)行遠(yuǎn)程監(jiān)控,這樣也為以后的智能化控制提供了基礎(chǔ)。本設(shè)計(jì)主要有以下幾個(gè)特點(diǎn):
1)實(shí)現(xiàn)了多方式無(wú)線局域網(wǎng)視頻數(shù)據(jù)采集傳輸,可以利用各種無(wú)線移動(dòng)設(shè)備對(duì)視頻數(shù)據(jù)實(shí)時(shí)監(jiān)控,例如手機(jī)、平板電腦等。
2)應(yīng)用范圍廣、效果好,穩(wěn)定性高。
3)硬件結(jié)構(gòu)簡(jiǎn)單,成本低,體積小,可運(yùn)用于飛機(jī)航拍等一些特殊環(huán)境場(chǎng)所。
圖5 系統(tǒng)運(yùn)行效果圖
參考文獻(xiàn)
[1] SamsungElectronics S3C24 10X 32- BIT RISC MIC R O P R E SSO R SRSMANA L . Revision 1.2.Pu blication Number:21.2-S3-C 24 10-052003 ,May 2005.
[2] 韓超,王可人.基于DM9000的嵌入式系統(tǒng)的網(wǎng)絡(luò)接口的設(shè)計(jì)與實(shí)現(xiàn) [J].工業(yè)控制計(jì)算機(jī) ,2005,20(4):17-18.
[3] BATCHAEVSS.Computer assisted monitoring systems use of computer network sandinter nettechnologies[J].BiomediealEngineering,2005,9(4):161-166.
[4] GENESIS MICROCHIP. gm6015 Preliminary Data Sheet[M]. California US: Genesis Microchip Company, 2001:33-34.
[5] 李珊珊,王緒國(guó).基于V4L2的遠(yuǎn)程視頻采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2011.
[6] JTC 1/SC29/WG 1.ISO/IEC CD29199-2: 2010 JPEG XR image coding Specification[S]. ISO/IEC:2010.
[7] GUHA S,FRANCIS P.Characterization and Measurement of TCP Traversal Through NATs and FireWalls[C] //Proc of Internet Measurement Conference,2005-10.
[8] GYU SANG CHOI,J inHaKim,Deniz Ersoz,SO.A multithreaded P IPEL lNED Web server architecture for SMP/SoC machines[C].Proceedings of the 14 th internationaleonference onWorldWideWeb,ACM Press 2005:730-739.
memset(&vd->cap,0,sizeof(struct v4l2_capability));
ret=ioctl(vd>fd,VIDIOC_QUERYCAP, &vd->cap);
獲取攝像頭基本參數(shù)
vd->fmt.fmt.pix.width =vd>width;
捕獲視頻寬度像素
vd->fmt.fmt.pix.height=vd>height;
捕獲視頻高度像素
Struct v4l2_streamparm*setfps;
etfps=(struct v4l2_streamparm*)
calloc(1,sizeof(structv4l2_stre-amparm));
設(shè)置視頻幀頻率
memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers));
vd->rb.count = NB_BUFFER;
設(shè)置視頻幀緩沖區(qū)個(gè)數(shù)
for (i = 0; i < NB_BUFFER; i++) {memset(&vd->buf,0,sizeof(struc-t v4l2_buffer));
將幀緩沖區(qū)數(shù)據(jù)映射到內(nèi)存
int uvcGrab(struct vdIn *vd);
獲取一幀視頻信號(hào)的圖像。
視頻數(shù)據(jù)采集具體流程如圖3所示。
圖3 視頻采集流程圖
3.2 格式轉(zhuǎn)換和MJPEG編碼壓縮
由于不同的攝像頭都有不同的輸出格式,所以進(jìn)行合適的格式轉(zhuǎn)換是非常有必要的,由攝像頭所采集到的原始數(shù)據(jù)并不適合用于傳輸,為了減少傳輸視頻數(shù)據(jù)的碼流大小還需要對(duì)圖像進(jìn)行壓縮。本系統(tǒng)所用的攝像頭輸出YUV 4:2:2格式的圖像數(shù)據(jù),將圖像數(shù)據(jù)轉(zhuǎn)換為RGB格式,再通過(guò)調(diào)用Linux下的Libjpeg庫(kù)對(duì)圖像進(jìn)行壓縮。
格式轉(zhuǎn)換以及壓縮處理過(guò)程和基本代碼函數(shù)名如下:
1)上鎖全局變量的圖像緩沖區(qū)(pthread_mutex_Lock)。
2)判斷圖像顏色編碼格式,如果是YUV格式的顏色編碼(以YUV4:2:2為例,調(diào)用compress_yuyv_o_jpeg函數(shù))將一行YUV轉(zhuǎn)換RGB,并將一行RGB壓縮成JPEG格式[6],行加一,判斷圖像是否壓縮到最后一行。如果是MJPEG編碼格式輸出的圖像(調(diào)用int memcpy_picture函數(shù)),查找起始幀標(biāo)志位,并插入Huffman數(shù)據(jù)表。
3)通知所有線程有一幀數(shù)據(jù)已經(jīng)處理為JPEG格式。
4)解鎖全局變量的圖像緩沖區(qū)。
3.3 視頻數(shù)據(jù)的傳輸
為了實(shí)現(xiàn)能將采集到的視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,本系統(tǒng)使用了在Linux下TCP協(xié)議的Socket編程[7]。Socket接口是一個(gè)在不同進(jìn)程間的通訊端點(diǎn),Socket在Linux系統(tǒng)中被看做是一個(gè)文件,當(dāng)客戶端和服務(wù)器端的Socket被創(chuàng)建時(shí),服務(wù)器端會(huì)調(diào)用accept()函數(shù),并以阻塞方式等待響應(yīng)客戶端的連接請(qǐng)求,連接成功后,雙方就可以進(jìn)行正常的數(shù)據(jù)通信,通訊結(jié)束后,釋放Socket結(jié)構(gòu)。其編程結(jié)構(gòu)如圖4所示。
當(dāng)有多個(gè)客戶端提出請(qǐng)求時(shí)還需要建立多線程并發(fā)服務(wù)器[8],當(dāng)客戶端提出連接請(qǐng)求時(shí),會(huì)建立一個(gè)新的線程,這樣每一個(gè)客戶端都會(huì)有一個(gè)獨(dú)立的線程,實(shí)現(xiàn)多個(gè)線程數(shù)據(jù)的并發(fā)。線程可以對(duì)進(jìn)程的內(nèi)存空間和資源進(jìn)行訪問(wèn),并與同一進(jìn)程中的其他線程共享數(shù)據(jù)區(qū)。因此,并發(fā)服務(wù)器線程的增加并不會(huì)讓服務(wù)器進(jìn)程隨著客戶端的增加而線性增長(zhǎng),這樣就降低了服務(wù)器進(jìn)程壓力,提高了其性能。代碼如下:
pthread_t client;struct addrinfo*aip,*aip2;
struct addrinfo hints;
struct sockaddr_storageclient_a-
ddr;
服務(wù)器監(jiān)聽(tīng)I(yíng)P
socklen_taddr_len=sizeof(structsockaddr_storage);
阻塞方式等待客戶端連接
pcfd->fd = accept(pcontext->sd, (struct sockaddr *)&client_addr, &addr_len);
新客戶端申請(qǐng)結(jié)構(gòu)
while(!pglobal->stop) cfd *pcfd = malloc(sizeof(cfd));
客戶端線程創(chuàng)建
if(pthread_create(&client, NULL, &client_thread, pcfd) != 0)
pthread_detach(client);
圖4 Linux下TCP協(xié)議的Socket編程結(jié)構(gòu)
4 系統(tǒng)運(yùn)行與實(shí)現(xiàn)
由于視頻傳輸數(shù)據(jù)量大、實(shí)時(shí)要求高,完成視頻傳輸,鏈路的數(shù)據(jù)吞吐量必須大于視頻數(shù)據(jù)流量。測(cè)試結(jié)果表明,本系統(tǒng)能夠達(dá)到穩(wěn)定的傳輸效果,圖像清晰,視頻無(wú)卡頓現(xiàn)象,并支持多個(gè)客戶端同時(shí)瀏覽頁(yè)面,最終實(shí)現(xiàn)了視頻數(shù)據(jù)采集傳輸。系統(tǒng)運(yùn)行效果如圖5所示。在移動(dòng)設(shè)備和網(wǎng)絡(luò)飛速發(fā)展的今天,將本系統(tǒng)網(wǎng)絡(luò)進(jìn)行拓展,手機(jī)等移動(dòng)設(shè)備也可作為客戶端,隨時(shí)隨地的進(jìn)行遠(yuǎn)程監(jiān)控,這樣也為以后的智能化控制提供了基礎(chǔ)。本設(shè)計(jì)主要有以下幾個(gè)特點(diǎn):
1)實(shí)現(xiàn)了多方式無(wú)線局域網(wǎng)視頻數(shù)據(jù)采集傳輸,可以利用各種無(wú)線移動(dòng)設(shè)備對(duì)視頻數(shù)據(jù)實(shí)時(shí)監(jiān)控,例如手機(jī)、平板電腦等。
2)應(yīng)用范圍廣、效果好,穩(wěn)定性高。
3)硬件結(jié)構(gòu)簡(jiǎn)單,成本低,體積小,可運(yùn)用于飛機(jī)航拍等一些特殊環(huán)境場(chǎng)所。
圖5 系統(tǒng)運(yùn)行效果圖
參考文獻(xiàn)
[1] SamsungElectronics S3C24 10X 32- BIT RISC MIC R O P R E SSO R SRSMANA L . Revision 1.2.Pu blication Number:21.2-S3-C 24 10-052003 ,May 2005.
[2] 韓超,王可人.基于DM9000的嵌入式系統(tǒng)的網(wǎng)絡(luò)接口的設(shè)計(jì)與實(shí)現(xiàn) [J].工業(yè)控制計(jì)算機(jī) ,2005,20(4):17-18.
[3] BATCHAEVSS.Computer assisted monitoring systems use of computer network sandinter nettechnologies[J].BiomediealEngineering,2005,9(4):161-166.
[4] GENESIS MICROCHIP. gm6015 Preliminary Data Sheet[M]. California US: Genesis Microchip Company, 2001:33-34.
[5] 李珊珊,王緒國(guó).基于V4L2的遠(yuǎn)程視頻采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2011.
[6] JTC 1/SC29/WG 1.ISO/IEC CD29199-2: 2010 JPEG XR image coding Specification[S]. ISO/IEC:2010.
[7] GUHA S,FRANCIS P.Characterization and Measurement of TCP Traversal Through NATs and FireWalls[C] //Proc of Internet Measurement Conference,2005-10.
[8] GYU SANG CHOI,J inHaKim,Deniz Ersoz,SO.A multithreaded P IPEL lNED Web server architecture for SMP/SoC machines[C].Proceedings of the 14 th internationaleonference onWorldWideWeb,ACM Press 2005:730-739.
memset(&vd->cap,0,sizeof(struct v4l2_capability));
ret=ioctl(vd>fd,VIDIOC_QUERYCAP, &vd->cap);
獲取攝像頭基本參數(shù)
vd->fmt.fmt.pix.width =vd>width;
捕獲視頻寬度像素
vd->fmt.fmt.pix.height=vd>height;
捕獲視頻高度像素
Struct v4l2_streamparm*setfps;
etfps=(struct v4l2_streamparm*)
calloc(1,sizeof(structv4l2_stre-amparm));
設(shè)置視頻幀頻率
memset(&vd->rb, 0, sizeof(struct v4l2_requestbuffers));
vd->rb.count = NB_BUFFER;
設(shè)置視頻幀緩沖區(qū)個(gè)數(shù)
for (i = 0; i < NB_BUFFER; i++) {memset(&vd->buf,0,sizeof(struc-t v4l2_buffer));
將幀緩沖區(qū)數(shù)據(jù)映射到內(nèi)存
int uvcGrab(struct vdIn *vd);
獲取一幀視頻信號(hào)的圖像。
視頻數(shù)據(jù)采集具體流程如圖3所示。
圖3 視頻采集流程圖
3.2 格式轉(zhuǎn)換和MJPEG編碼壓縮
由于不同的攝像頭都有不同的輸出格式,所以進(jìn)行合適的格式轉(zhuǎn)換是非常有必要的,由攝像頭所采集到的原始數(shù)據(jù)并不適合用于傳輸,為了減少傳輸視頻數(shù)據(jù)的碼流大小還需要對(duì)圖像進(jìn)行壓縮。本系統(tǒng)所用的攝像頭輸出YUV 4:2:2格式的圖像數(shù)據(jù),將圖像數(shù)據(jù)轉(zhuǎn)換為RGB格式,再通過(guò)調(diào)用Linux下的Libjpeg庫(kù)對(duì)圖像進(jìn)行壓縮。
格式轉(zhuǎn)換以及壓縮處理過(guò)程和基本代碼函數(shù)名如下:
1)上鎖全局變量的圖像緩沖區(qū)(pthread_mutex_Lock)。
2)判斷圖像顏色編碼格式,如果是YUV格式的顏色編碼(以YUV4:2:2為例,調(diào)用compress_yuyv_o_jpeg函數(shù))將一行YUV轉(zhuǎn)換RGB,并將一行RGB壓縮成JPEG格式[6],行加一,判斷圖像是否壓縮到最后一行。如果是MJPEG編碼格式輸出的圖像(調(diào)用int memcpy_picture函數(shù)),查找起始幀標(biāo)志位,并插入Huffman數(shù)據(jù)表。
3)通知所有線程有一幀數(shù)據(jù)已經(jīng)處理為JPEG格式。
4)解鎖全局變量的圖像緩沖區(qū)。
3.3 視頻數(shù)據(jù)的傳輸
為了實(shí)現(xiàn)能將采集到的視頻數(shù)據(jù)通過(guò)網(wǎng)絡(luò)進(jìn)行傳輸,本系統(tǒng)使用了在Linux下TCP協(xié)議的Socket編程[7]。Socket接口是一個(gè)在不同進(jìn)程間的通訊端點(diǎn),Socket在Linux系統(tǒng)中被看做是一個(gè)文件,當(dāng)客戶端和服務(wù)器端的Socket被創(chuàng)建時(shí),服務(wù)器端會(huì)調(diào)用accept()函數(shù),并以阻塞方式等待響應(yīng)客戶端的連接請(qǐng)求,連接成功后,雙方就可以進(jìn)行正常的數(shù)據(jù)通信,通訊結(jié)束后,釋放Socket結(jié)構(gòu)。其編程結(jié)構(gòu)如圖4所示。
當(dāng)有多個(gè)客戶端提出請(qǐng)求時(shí)還需要建立多線程并發(fā)服務(wù)器[8],當(dāng)客戶端提出連接請(qǐng)求時(shí),會(huì)建立一個(gè)新的線程,這樣每一個(gè)客戶端都會(huì)有一個(gè)獨(dú)立的線程,實(shí)現(xiàn)多個(gè)線程數(shù)據(jù)的并發(fā)。線程可以對(duì)進(jìn)程的內(nèi)存空間和資源進(jìn)行訪問(wèn),并與同一進(jìn)程中的其他線程共享數(shù)據(jù)區(qū)。因此,并發(fā)服務(wù)器線程的增加并不會(huì)讓服務(wù)器進(jìn)程隨著客戶端的增加而線性增長(zhǎng),這樣就降低了服務(wù)器進(jìn)程壓力,提高了其性能。代碼如下:
pthread_t client;struct addrinfo*aip,*aip2;
struct addrinfo hints;
struct sockaddr_storageclient_a-
ddr;
服務(wù)器監(jiān)聽(tīng)I(yíng)P
socklen_taddr_len=sizeof(structsockaddr_storage);
阻塞方式等待客戶端連接
pcfd->fd = accept(pcontext->sd, (struct sockaddr *)&client_addr, &addr_len);
新客戶端申請(qǐng)結(jié)構(gòu)
while(!pglobal->stop) cfd *pcfd = malloc(sizeof(cfd));
客戶端線程創(chuàng)建
if(pthread_create(&client, NULL, &client_thread, pcfd) != 0)
pthread_detach(client);
圖4 Linux下TCP協(xié)議的Socket編程結(jié)構(gòu)
4 系統(tǒng)運(yùn)行與實(shí)現(xiàn)
由于視頻傳輸數(shù)據(jù)量大、實(shí)時(shí)要求高,完成視頻傳輸,鏈路的數(shù)據(jù)吞吐量必須大于視頻數(shù)據(jù)流量。測(cè)試結(jié)果表明,本系統(tǒng)能夠達(dá)到穩(wěn)定的傳輸效果,圖像清晰,視頻無(wú)卡頓現(xiàn)象,并支持多個(gè)客戶端同時(shí)瀏覽頁(yè)面,最終實(shí)現(xiàn)了視頻數(shù)據(jù)采集傳輸。系統(tǒng)運(yùn)行效果如圖5所示。在移動(dòng)設(shè)備和網(wǎng)絡(luò)飛速發(fā)展的今天,將本系統(tǒng)網(wǎng)絡(luò)進(jìn)行拓展,手機(jī)等移動(dòng)設(shè)備也可作為客戶端,隨時(shí)隨地的進(jìn)行遠(yuǎn)程監(jiān)控,這樣也為以后的智能化控制提供了基礎(chǔ)。本設(shè)計(jì)主要有以下幾個(gè)特點(diǎn):
1)實(shí)現(xiàn)了多方式無(wú)線局域網(wǎng)視頻數(shù)據(jù)采集傳輸,可以利用各種無(wú)線移動(dòng)設(shè)備對(duì)視頻數(shù)據(jù)實(shí)時(shí)監(jiān)控,例如手機(jī)、平板電腦等。
2)應(yīng)用范圍廣、效果好,穩(wěn)定性高。
3)硬件結(jié)構(gòu)簡(jiǎn)單,成本低,體積小,可運(yùn)用于飛機(jī)航拍等一些特殊環(huán)境場(chǎng)所。
圖5 系統(tǒng)運(yùn)行效果圖
參考文獻(xiàn)
[1] SamsungElectronics S3C24 10X 32- BIT RISC MIC R O P R E SSO R SRSMANA L . Revision 1.2.Pu blication Number:21.2-S3-C 24 10-052003 ,May 2005.
[2] 韓超,王可人.基于DM9000的嵌入式系統(tǒng)的網(wǎng)絡(luò)接口的設(shè)計(jì)與實(shí)現(xiàn) [J].工業(yè)控制計(jì)算機(jī) ,2005,20(4):17-18.
[3] BATCHAEVSS.Computer assisted monitoring systems use of computer network sandinter nettechnologies[J].BiomediealEngineering,2005,9(4):161-166.
[4] GENESIS MICROCHIP. gm6015 Preliminary Data Sheet[M]. California US: Genesis Microchip Company, 2001:33-34.
[5] 李珊珊,王緒國(guó).基于V4L2的遠(yuǎn)程視頻采集系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[D].武漢:武漢理工大學(xué),2011.
[6] JTC 1/SC29/WG 1.ISO/IEC CD29199-2: 2010 JPEG XR image coding Specification[S]. ISO/IEC:2010.
[7] GUHA S,FRANCIS P.Characterization and Measurement of TCP Traversal Through NATs and FireWalls[C] //Proc of Internet Measurement Conference,2005-10.
[8] GYU SANG CHOI,J inHaKim,Deniz Ersoz,SO.A multithreaded P IPEL lNED Web server architecture for SMP/SoC machines[C].Proceedings of the 14 th internationaleonference onWorldWideWeb,ACM Press 2005:730-739.