甘勤操,陳西曲
(武漢輕工大學(xué)電氣與電子工程學(xué)院,湖北武漢430023)
遠(yuǎn)程監(jiān)控是指本地的PC機(jī)通過(guò)網(wǎng)絡(luò)系統(tǒng)對(duì)遠(yuǎn)端的情況進(jìn)行實(shí)時(shí)的視頻監(jiān)控,通過(guò)遠(yuǎn)程監(jiān)控,工作人員可以足不出戶就了解現(xiàn)場(chǎng)的情形,及時(shí)的對(duì)突發(fā)事件進(jìn)行處理。但傳統(tǒng)的遠(yuǎn)程監(jiān)控存在很多不足之處:①普遍采用的同軸電纜進(jìn)行傳輸,傳輸距離近,傳輸質(zhì)量差;②無(wú)法在室外實(shí)時(shí)掌握監(jiān)控的情況[1]。隨著計(jì)算機(jī)技術(shù),通訊技術(shù),網(wǎng)絡(luò)技術(shù)的快速發(fā)展和迅速普及,促進(jìn)了基于互聯(lián)網(wǎng)技術(shù)的產(chǎn)生以及發(fā)展,傳統(tǒng)的模擬視頻監(jiān)控系統(tǒng)和基于PC機(jī)的數(shù)字視頻監(jiān)控系統(tǒng)已不能滿足社會(huì)發(fā)展的需求,基于互聯(lián)網(wǎng)技術(shù)的遠(yuǎn)程監(jiān)控系統(tǒng)不受地域限制進(jìn)行監(jiān)控,基于嵌入式的網(wǎng)絡(luò)監(jiān)控系統(tǒng)逐漸得到了關(guān)注,在越來(lái)越多的領(lǐng)域得到了應(yīng)用,它具有功能強(qiáng),實(shí)時(shí)性強(qiáng),可靠性高和結(jié)構(gòu)小巧等優(yōu)點(diǎn)。本設(shè)計(jì)基于ARM平臺(tái)及l(fā)inux操作系統(tǒng)進(jìn)行設(shè)計(jì),具有可移植性高,組網(wǎng)能力強(qiáng),視頻傳輸能力強(qiáng)等特點(diǎn),在PC機(jī)上進(jìn)行監(jiān)控,在傳統(tǒng)監(jiān)控的基礎(chǔ)上,在開發(fā)板上外接一個(gè)LCD,可以在室外看到監(jiān)控影像。
硬件平臺(tái)是整個(gè)系統(tǒng)的基礎(chǔ),起到至關(guān)重要的作用。為了滿足視頻采集,壓縮,傳輸帶來(lái)的巨大運(yùn)算量,必須有一款功能強(qiáng)大的處理器器,本系統(tǒng)采用的處理器是三星公司出產(chǎn)的S3C2440處理器,這款處理器基于ARM9構(gòu)架開發(fā),運(yùn)行主頻為400 MHz,最高主頻可達(dá)533 MHz,芯片上集成有Camera解碼器,可以完成攝像頭數(shù)據(jù)的解碼,無(wú)需再安裝解碼器。開發(fā)板與PC機(jī)之間的數(shù)據(jù)交互依靠串口來(lái)實(shí)現(xiàn)。開發(fā)板外接一個(gè)3.5吋的LCD顯示器用于顯示視頻數(shù)據(jù)。視頻采集用的是普通的USB攝像頭,視頻傳輸采用的是DM9000網(wǎng)卡,視頻信號(hào)通過(guò)網(wǎng)卡進(jìn)行傳輸[2]。嵌入式視頻監(jiān)控系統(tǒng)硬件結(jié)構(gòu)如圖1所示。
圖1 硬件結(jié)構(gòu)圖
整個(gè)系統(tǒng)的工作原理是:系統(tǒng)通過(guò)V4L2提供的統(tǒng)一的API提取攝像頭原始數(shù)據(jù),數(shù)據(jù)格式為YUV 4:2:2這些數(shù)據(jù)轉(zhuǎn)換成RGB24數(shù)據(jù),然后開辟兩個(gè)線程,一個(gè)線程將數(shù)據(jù)寫入開發(fā)板的LCD緩沖區(qū),就可以直接預(yù)覽顯示視頻,另一個(gè)線程將數(shù)據(jù)通過(guò)TCP/IP發(fā)送到遠(yuǎn)端PC機(jī)。
視頻傳輸模塊是本設(shè)計(jì)的重要模塊,S3C2440采用的DM9000網(wǎng)卡,它有一個(gè)一般處理接口,一個(gè)10/100 M自適應(yīng)的PHY和一個(gè)4 kB的DWORD值的SRAM。DM9000采用100引腳的TQFP封裝,是小型化及對(duì)成本敏感的以太網(wǎng)應(yīng)用的理想選擇。圖2是DM9000在開發(fā)板上的連接。
圖2 DM9000網(wǎng)卡連接圖
鑒于Linux開源,穩(wěn)定且具有良好的移植性和優(yōu)秀的網(wǎng)絡(luò)功能,采用Linux操作系統(tǒng)作為軟件開發(fā)平臺(tái)。首先將在PC機(jī)上編譯好的內(nèi)核和文件系統(tǒng)移植到開發(fā)板上,系統(tǒng)主要由視頻采集模塊,數(shù)據(jù)處理模塊,圖像顯示模塊組成,其中視頻采集模塊由USB攝像頭,USB驅(qū)動(dòng)程序兩部分組成。數(shù)據(jù)處理模塊由V4L2采集程序組成,圖像顯示模塊由運(yùn)行于PC機(jī)上的解碼顯示程序以及開發(fā)板上外接的LCD顯示器擔(dān)當(dāng),可以在兩地同時(shí)顯示影像。傳輸層有兩種協(xié)議可供選擇,一種是TCP協(xié)議,一種是UDP協(xié)議,因?yàn)門CP協(xié)議用一個(gè)校驗(yàn)和函數(shù)來(lái)檢驗(yàn)數(shù)據(jù)是否有錯(cuò)誤;在發(fā)送和接收時(shí)都要計(jì)算和校驗(yàn),如果出錯(cuò)要進(jìn)行數(shù)據(jù)重新傳輸,傳輸?shù)馁|(zhì)量高,所以傳輸協(xié)議選用TCP協(xié)議[3]。
Video for Linux two簡(jiǎn)稱 V4L2,是基于 V4L的不足而優(yōu)化的版本。V4L2提供了統(tǒng)一的API接口,用于在linux操作系統(tǒng)下進(jìn)行視頻采集。在視頻監(jiān)控系統(tǒng)和嵌入式多媒體終端中都有廣泛的應(yīng)用。
在Linux下,所有外設(shè)都被看成一種特殊的文件,成為“設(shè)備文件”,可以像訪問(wèn)普通文件一樣對(duì)其進(jìn)行讀寫。一般來(lái)說(shuō),采用V4L2驅(qū)動(dòng)的攝像頭設(shè)備文件是/dev/video0。為了通用,可以建立一個(gè)到/dev/video0的鏈接。V4L2支持兩種方式來(lái)采集圖像:內(nèi)存映射方式(mmap)和直接讀取方式(read)。本文采用的是mmap模式。具體視頻采集流程如圖3所示。
V4L2視頻采集主要步驟如下:
1)打開視頻設(shè)備,得到文件描述符在Linux下,攝像頭硬件已經(jīng)被映射為設(shè)備文件“/dev/video%d”,用linux下的庫(kù)函數(shù)open()打開這個(gè)設(shè)備文件,獲得其文件描述符fd_v4l2,然后對(duì)這個(gè)文件描述符進(jìn)行參數(shù)初始化。
2)打開視頻設(shè)備后,可以設(shè)置該設(shè)備的屬性,例如裁剪等,這一步是可選的。
3)設(shè)置攝像頭的制式為PAL,獲取并記錄緩沖的物理空間。
圖3 視頻采集流程
4)將申請(qǐng)到的緩沖區(qū)放入視頻采集隊(duì)列,用來(lái)存放采集到的數(shù)據(jù)。
5)設(shè)置視頻的采集方式為內(nèi)存映射方式。
6)處理采集數(shù)據(jù)。為實(shí)現(xiàn)連續(xù)的視頻幀數(shù)據(jù)采集,需要用幀緩沖區(qū)隊(duì)列來(lái)實(shí)現(xiàn)。啟動(dòng)視頻采集后,內(nèi)核驅(qū)動(dòng)開始采集數(shù)據(jù),采集到的數(shù)據(jù)被放入輸入隊(duì)列的第一個(gè)幀緩沖區(qū),一幀數(shù)據(jù)采集完成后,內(nèi)核驅(qū)動(dòng)將填滿數(shù)據(jù)的這一幀緩沖區(qū)移至視頻采集輸出隊(duì)列,等待應(yīng)用程序從輸出隊(duì)列取出。內(nèi)核驅(qū)動(dòng)接下來(lái)采集下一幀數(shù)據(jù),放入第二個(gè)幀緩沖區(qū),幀緩沖區(qū)存下一幀數(shù)據(jù)后,被放入視頻采集輸出隊(duì)列。應(yīng)用程序從視頻采集輸出隊(duì)列中取出含有視頻數(shù)據(jù)的幀緩沖區(qū),取出幀緩沖區(qū)中的視頻數(shù)據(jù),然后開辟兩個(gè)線程,一個(gè)線程通過(guò)TCP/IP協(xié)議將視頻數(shù)據(jù)發(fā)送到PC端,一個(gè)線程將視頻數(shù)據(jù)傳遞給LCD顯示模塊。最后,應(yīng)用程序?qū)⑻幚硗陻?shù)據(jù)的幀緩沖區(qū)重新放入視頻采集輸入隊(duì)列,用于填充新的數(shù)據(jù),這樣可以循環(huán)采集,輸入輸出隊(duì)列如圖4所示。
7)關(guān)閉視頻設(shè)備,首先用VIDIOC_STREAMOFF命令標(biāo)示符停止視頻采集,再用close(fd)關(guān)閉標(biāo)示符。
圖4 視頻采集輸入輸出隊(duì)列
V4L2從攝像頭采集到的數(shù)據(jù)格式是YUV4:2:2類型的,要將其解碼成RGB24以便傳輸顯示。將YUV4:2:2 的 4byte(Y0,U0,Y1,V1)數(shù)據(jù)轉(zhuǎn)換為RGB24 的 6byte(R1,G1,B1,R2,G2,B2)[4]數(shù)據(jù)。
驅(qū)動(dòng)程序采集的原始數(shù)據(jù)格式為YUV4:2:2,存放的碼流為:Y0 U0 Y1 V1 Y2 U2 Y3 V3,映射出像素點(diǎn)為:[Y0 U0 V1][Y1 U0 V1][Y2 U2 V3][Y3 U2 V3],每一個(gè)YUYV占4個(gè)字節(jié)內(nèi)存,用來(lái)映射兩個(gè)像素點(diǎn)。將 (Y0U0V1)轉(zhuǎn)換為(R1G1B1),將(Y1U0V1)轉(zhuǎn)換為(R2G2B2)。
轉(zhuǎn)換核心代碼如下:
R1=(298*Y0+409*V1+128)>>8;
G1=(298* Y0-100*U0-208*V1+128)>>8;
B1=(298*Y0+516*U0+128)>>8;
R2=(298*Y1+409*V1+128)>>8;
G2=(298*Y1-100*U0-208* V1+128)>>8;
B2=(298*Y1+516*U0+128)>>8;
這樣就將一個(gè)YUV4:2:2數(shù)據(jù)轉(zhuǎn)化為兩個(gè)RGB24數(shù)據(jù)。經(jīng)過(guò)編碼的數(shù)據(jù)可以直接在LCD屏上顯示。
本設(shè)計(jì)采用的是TCP/IP協(xié)議的socket來(lái)進(jìn)行視頻數(shù)據(jù)的傳輸,首先調(diào)用socket()函數(shù)建立一個(gè)套接字,然后調(diào)用bind()函數(shù)綁定本地IP地址以及端口號(hào),接著調(diào)用listen()函數(shù)監(jiān)聽監(jiān)控主機(jī)發(fā)來(lái)的連接請(qǐng)求,TCP連接要進(jìn)行3次握手,然后調(diào)用send()函數(shù)將數(shù)據(jù)發(fā)送到監(jiān)控主機(jī)。視頻發(fā)送流程如圖5所示。
本系統(tǒng)中視頻會(huì)在LCD和PC下同時(shí)顯示,本文主要介紹在LCD下的顯示。
在linux下定義了 FrameBuffer設(shè)備,F(xiàn)rame-Buffer設(shè)備提供了一個(gè)圖形硬件抽象層,代表視頻硬件的幀緩沖。
圖5 視頻發(fā)送流程
在應(yīng)用程序中,一般通過(guò)將FrameBuffer設(shè)備映射到進(jìn)程地址空間的方式使用,在本系統(tǒng)中LCD被映射為/dev/fb0,首先打開/dev/fb0設(shè)備,并通過(guò)mmap系統(tǒng)調(diào)用進(jìn)行地址映射,然后將視頻數(shù)據(jù)按順序依次寫入緩沖區(qū),這樣數(shù)據(jù)就可以直接顯示在LCD上了。
開發(fā)板上電,系統(tǒng)加載應(yīng)用程序,在PC機(jī)上打開M-JPEG viewer客戶端,輸入系統(tǒng)正確的IP地址(監(jiān)控服務(wù)器的本地IP地址)及端口號(hào)(監(jiān)控服務(wù)器的通信端口號(hào)),點(diǎn)擊客戶端上的connect按鈕,利用wireshark網(wǎng)絡(luò)抓包程序可以捕捉到PC機(jī)與監(jiān)控開發(fā)板建立網(wǎng)絡(luò)連接的過(guò)程。分析圖例,可以判斷網(wǎng)絡(luò)部分工作正常,其中192.168.1.101 為PC 機(jī)IP 地址192.168.1.103為開發(fā)版IP地址。如圖6所示。
圖6 TCP三次握手
當(dāng)網(wǎng)絡(luò)連接建立后,開始傳輸視頻數(shù)據(jù),圖7為wireshark捕捉到的網(wǎng)絡(luò)發(fā)送的數(shù)據(jù)。
圖7 網(wǎng)絡(luò)傳輸?shù)囊曨l流
客戶端接受開發(fā)板放送來(lái)的數(shù)據(jù),將每一幀圖片顯示在PC機(jī)屏幕上。圖8是客戶端解碼后顯示的視頻截圖。
開發(fā)板可以將視頻數(shù)據(jù)直接顯示在開發(fā)板外接的LCD上,可以在室外觀察監(jiān)控的效果,實(shí)時(shí)性和靈活性更強(qiáng)。圖9為開發(fā)板LCD視頻截圖。
圖8 監(jiān)控主機(jī)視頻截圖
圖9 開發(fā)板上視頻截圖
客戶端可以同時(shí)在多臺(tái)主機(jī)上面運(yùn)行,多名工作人員可以在不同的地方同時(shí)進(jìn)行監(jiān)控,增加了系統(tǒng)的靈活性。
本文介紹了一種基于ARM9來(lái)完成視頻監(jiān)控的設(shè)計(jì)方法,詳細(xì)介紹了視頻采集模塊在linux下的實(shí)現(xiàn)過(guò)程。視頻信號(hào)的采集是視頻監(jiān)控終端設(shè)計(jì)的重要環(huán)節(jié),本設(shè)計(jì)在ARM平臺(tái)上完成各項(xiàng)試驗(yàn)測(cè)試,視頻采集信號(hào)流暢,實(shí)時(shí)性強(qiáng),而且采用的是模塊化設(shè)計(jì),系統(tǒng)升級(jí)時(shí)只需升級(jí)相應(yīng)模塊就可以。實(shí)驗(yàn)證明,在嵌入式操作平臺(tái)上以軟件的方式實(shí)現(xiàn)視頻監(jiān)控具有可操作性強(qiáng)的特點(diǎn),系統(tǒng)應(yīng)用范圍廣,前景廣闊。
[1]潘國(guó)輝.安防天下——智能網(wǎng)絡(luò)視頻監(jiān)控技術(shù)詳解與實(shí)踐[M].北京:清華大學(xué)出版社,2010:21-23.
[2]韋東山.嵌入式 Linux應(yīng)用開發(fā)完全手冊(cè)[M].北京:人民郵電出版社,2011:86-87.
[3]理查德·史蒂文斯.TCP/IP詳解(卷一)[M].陸雪瑩,譯.北京:機(jī)械工業(yè)出版社,2000:147-149.
[4]劉峰.視頻編碼技術(shù)與國(guó)際標(biāo)準(zhǔn)[M].北京:北京郵電出版社,2005:133.