周錦陽 吳 哲 宋 廣
(1.92785部隊 葫蘆島 125200)(2.中國電子科技集團(tuán)公司第三十研究所 成都 610000)
隨著移動互聯(lián)網(wǎng)技術(shù)的迅猛發(fā)展,WIFI 網(wǎng)絡(luò)覆蓋率不斷增加,4G網(wǎng)絡(luò)已遍布全國各地[1]。信息科技的高速發(fā)展,在豐富人們生活的同時,帶來了前所未有的機(jī)遇與挑戰(zhàn)。視頻通信技術(shù)不斷走向成熟,隨著IP 網(wǎng)絡(luò)帶寬的不斷提高,視頻通信進(jìn)入了一個新的發(fā)展和應(yīng)用時期,其在視頻會議、遠(yuǎn)程視頻醫(yī)療、遠(yuǎn)程視頻教育等方面得到越來越廣泛的應(yīng)用[2~3]。
嵌入式系統(tǒng)作為一種實用、高效的計算機(jī)系統(tǒng),以其低成本、低能耗、高性能及可配置等優(yōu)點[4],逐漸成為電子產(chǎn)品設(shè)計開發(fā)的研究發(fā)展方向,其廣泛應(yīng)用于信息通信、工業(yè)控制、交通管理和智能家居等領(lǐng)域[5~6]。
本文以嵌入式ARM 為載體,利用Linux系統(tǒng)的V4L2內(nèi)核驅(qū)動,設(shè)計了一種支持視頻圖像采集、壓縮、傳輸、顯示的移動視頻通信系統(tǒng)。通過系統(tǒng)功能測試,驗證了系統(tǒng)通信的穩(wěn)定性和連續(xù)性,為進(jìn)一步探索和研究相關(guān)內(nèi)容提供有益參考。
視頻通信系統(tǒng)組成包括通信節(jié)點、視頻服務(wù)器和有線網(wǎng)絡(luò)等,總體框架如圖1 所示,視頻通信節(jié)點間可通過無線通信實現(xiàn)節(jié)點間點對點的視頻通信,也可依托已有無線局域網(wǎng)或電信網(wǎng)絡(luò),通過WLAN/4G 基站接入現(xiàn)有有線網(wǎng)絡(luò),利用視頻服務(wù)器的路由、轉(zhuǎn)發(fā)功能,實現(xiàn)節(jié)點間的視頻通信。
圖1 頻通信系統(tǒng)總體框架
系統(tǒng)硬件主要由處理單元、無線通信模塊、視頻采集模塊、LCD和電源模塊等組成。系統(tǒng)硬件組成如圖2所示,節(jié)點實物如圖3所示。
圖2 節(jié)點硬件組成框圖
圖3 節(jié)點硬件實物圖
處理單元主要負(fù)責(zé)視頻信息的視頻的壓縮、處理、傳輸以及自組織網(wǎng)絡(luò)的建立和維護(hù),其硬件采用深圳天漠科技有限公司的Devkit8500D嵌入式開發(fā)系統(tǒng),該系統(tǒng)采用采用DM3730 處理器,集成了高達(dá)1GHz 的ARM Cortex-A8 內(nèi)核以及高達(dá)800MHz 的具有高級數(shù)字信號處理的DSP 內(nèi)核,支持高清720p 視頻編解碼,并提供了豐富的外設(shè)接口,可以有效滿足開發(fā)需求。
無線通信單元主要負(fù)責(zé)實現(xiàn)單跳節(jié)點間的無線通信,其硬件采用TOTOLINK-N200UP 大功率無線網(wǎng)卡,該網(wǎng)卡采用MIMO 技術(shù),內(nèi)置信號增強芯片,外置1根可拆卸智能天線,支持IEEE 802.11b/g/n協(xié)議標(biāo)準(zhǔn),無線傳輸速率高達(dá)150Mbps。
視頻采集單元主要負(fù)責(zé)采集節(jié)點周圍視頻圖像信息,進(jìn)行環(huán)境狀態(tài)感知,其硬件采用英蓓特科技有限公司生產(chǎn)的CAM8100-U 數(shù)字?jǐn)z像頭,該攝像頭高達(dá)130W 像素,可支持多種分辨率,該模塊通過高速USB2.0 接口連接到ARM 開發(fā)板,可實現(xiàn)圖像預(yù)覽等功能。
視頻通信過程中,采集端為視頻傳輸?shù)脑垂?jié)點,實現(xiàn)視頻的采集、壓縮、傳輸和顯示;接收端為視頻傳輸?shù)哪康墓?jié)點,實現(xiàn)視頻的接收和顯示。采集端和接收端相互協(xié)作實現(xiàn)源節(jié)點和目的節(jié)點間的視頻通信。如圖4所示。
圖4 采集端和接收端間的視頻交互流程
采集端和接收端的相關(guān)功能是通過V4L2、libjpeg 和socket 的相關(guān)編程接口函數(shù)實現(xiàn)的。其中,攝像頭對視頻圖像的采集,是通過V4L2 的相關(guān)接口函數(shù)實現(xiàn)的;視頻圖像的壓縮和本地顯示,是通過jpeg 的相關(guān)編程接口實現(xiàn)的;視頻的發(fā)送和接收,是通過socket的接口函數(shù)實現(xiàn)的。
視頻圖像采集是通過USB 攝像頭完成的[7]。在嵌入式Linux系統(tǒng)中可以通過讀寫設(shè)備文件的方式訪問和控制USB 攝像頭,同時V4L2 模塊為USB攝像頭提供編程接口,通過編程接口函數(shù),實現(xiàn)視頻圖像的采集?;赨SB 攝像頭的視頻圖像采集流程如圖5所示。
圖5 視頻采集流程
1)開啟USB攝像頭
USB 攝像頭作為嵌入式Linux 系統(tǒng)的視頻外設(shè),會在內(nèi)核中自動生成設(shè)備文件名(/dev/video2),并添加到內(nèi)核注冊表中[8],系統(tǒng)通過函數(shù)調(diào)用開啟USB攝像頭。
2)獲取攝像頭的設(shè)備信息
獲取攝像頭的設(shè)備信息主要是獲取攝像頭的驅(qū)動名、設(shè)備名、設(shè)備在系統(tǒng)中的位置、驅(qū)動版本號等信息。在嵌入式Linux系統(tǒng)中,V4L2模塊提供結(jié)構(gòu)體“struct v4l2_capability”存放設(shè)備信息。內(nèi)核根據(jù)獲取的攝像頭信息,判斷該設(shè)備是否是V4L2 的視頻采集設(shè)備。
3)設(shè)置采集圖像的參數(shù)
視頻圖像采集之前,需要對視頻圖像的采集參數(shù)進(jìn)行設(shè)置,主要包括圖像的大小、格式和來源。在嵌入式Linux 系統(tǒng)中,V4L2 模塊提供結(jié)構(gòu)體“struct v4l2_format”存放所設(shè)置參數(shù)。設(shè)置的參數(shù)包括視頻的來源(V4L2_BUF_TYPE_VIDEO_CAPTURE),視頻的高度(480)、寬度(320)以及視頻的格式(V4L2_PIX_FMT_YUYV)。
4)內(nèi)存映射
視頻采集后存儲在內(nèi)核空間,然而應(yīng)用程序不能直接訪問內(nèi)核空間,需要建立內(nèi)核空間和用戶空間的聯(lián)系,以便應(yīng)用程序調(diào)用內(nèi)核空間的視頻數(shù)據(jù)。由于內(nèi)存映射具有速度快、占用內(nèi)存空間小,操作簡單等優(yōu)點,因此本章所設(shè)計的系統(tǒng)采用內(nèi)存映射的方法,建立內(nèi)核空間和用戶空間的地址對應(yīng)關(guān)系,將圖像數(shù)據(jù)從內(nèi)核空間映射到用戶空間中。
5)視頻數(shù)據(jù)采集
視頻采集后是以先進(jìn)先出(First in first out,F(xiàn)IFO)存儲在緩存中的。當(dāng)應(yīng)用程序讀取緩存中的視頻數(shù)據(jù)時,視頻數(shù)據(jù)按照先進(jìn)先出的順序從緩存發(fā)出,之后該緩沖區(qū)重新獲取圖像數(shù)據(jù)。
6)取消內(nèi)存映射和關(guān)閉攝像頭
解除內(nèi)存映射,釋放內(nèi)存,調(diào)用函數(shù)關(guān)閉設(shè)備,通知程序停止視頻采集。
對視頻圖像的壓縮,是從時間、空間兩方面去除圖像的冗余信息的。常用的圖像壓縮方式有無損壓縮和有損壓縮兩種[9]。無損壓縮是指,只去除圖像冗余信息的壓縮,圖像質(zhì)量在壓縮前后基本保持不變,無明顯的失真。有損壓縮是指去除圖像的冗余信息和不相干信息的壓縮,壓縮前后存在一定差異,但是不影響觀看效果[10]。無損壓縮的特點是壓縮后圖像質(zhì)量髙,然而壓縮率很低,不能有效降低圖像所占存儲空間的大小。有損壓縮的特點是壓縮率髙,壓縮后的圖像占用的存儲空間較小,會有一定程度的失真但是不影響圖像的視覺效果。由于無線信道資源的有限性,為實現(xiàn)視頻的有效傳輸,采用有損壓縮的方式對視頻圖像進(jìn)行壓縮。YUV的jpeg壓縮流程如圖6所示。
圖6 YUV壓縮JPEG流程
1)初始化壓縮對象,申請存儲空間
USB 攝像頭采集的視頻格式為YUYV,對采集的YUYV 格式的視頻進(jìn)行初始化,并向內(nèi)存申請一段用于存儲jpeg圖片的空間。
2)設(shè)置壓縮參數(shù),開始壓縮
視頻的有損壓縮是依據(jù)所設(shè)定的參數(shù)進(jìn)行的,將壓縮參數(shù)設(shè)置為80%的壓縮率,壓縮后的jpeg圖片像素為320×480。設(shè)置完壓縮參數(shù)后,開始對YUYV格式的視頻圖像進(jìn)行壓縮。
3)結(jié)束壓縮,釋放jpeg圖片。
視頻傳輸采用基于UDP 的socket 視頻通信。socket[11]作為Unix/Linux 系統(tǒng)下實現(xiàn)TCP/IP 通信的接口,是一種用于描述IP 端口和地址的進(jìn)程通信機(jī)制。如圖7 所示,服務(wù)端初始化socket 創(chuàng)建套接字,調(diào)用bind()綁定服務(wù)端端口號;客服端初始化socket創(chuàng)建套接字,并調(diào)用sendto()發(fā)送請求,建立和服務(wù)端的連接。
圖7 UDP的socket通信流程
1)創(chuàng)建UDP套接字
創(chuàng)建UDP 套接字,建立socket 通信。socket()函數(shù)在系統(tǒng)中注冊一個未綁定的套接字,通知系統(tǒng)建立一個通信端點。
2)設(shè)置IP地址和綁定端口號
設(shè)置網(wǎng)絡(luò)通信協(xié)議采用IPV4,綁定服務(wù)端和接收端的IP 地址,指定端口號,服務(wù)端調(diào)用函數(shù)bind()綁定端口號。
3)服務(wù)端接收客戶端的“Hello”數(shù)據(jù)
服務(wù)端調(diào)用函數(shù)recvfrom(),接受來自客戶端的數(shù)據(jù)請求“Hello”,建立和客戶端的連接。
4)向客戶端發(fā)送圖像數(shù)據(jù)
服務(wù)端調(diào)用函數(shù)sendto(),向客戶端發(fā)送視頻圖像,將發(fā)送緩存區(qū)的視頻數(shù)據(jù)發(fā)送到指定客戶端的地址空間。
5)關(guān)閉套接字,切斷服務(wù)端和客戶端之間的連接
調(diào)用函數(shù)closesocket()關(guān)閉套接字,調(diào)用函數(shù)close()切斷服務(wù)端和客戶端的連接。
視頻顯示采用基于FrameBuffer的圖象顯示[12]。FrameBuffer 是運行在Linux 上的優(yōu)秀圖形接口,為所有的硬件提供編程接口,具有硬件無關(guān)性,可直接對顯存操作,實現(xiàn)視頻的顯示?;贔rameBuffer視頻顯示的流程如圖8所示。
圖8 視頻顯示流程
1)初始化framebuffer
打開設(shè)備FrameBuffer,在嵌入式Linux 系統(tǒng)中,F(xiàn)rameBuffer 所對應(yīng)的設(shè)備文件為“/dev/fb0”,調(diào)用函數(shù)開啟。
2)獲取FrameBuffer的固定信息
獲取設(shè)備FrameBuffer 的固定信息主要是獲取屏幕緩沖區(qū)的物理地址和屏幕的寬度等的固定信息。
3)獲取FrameBuffer的可變信息
獲取設(shè)備FrameBuffer 的可變信息主要是獲取屏幕的分辨率、顏色深度等可變信息。
4)內(nèi)存映射
屏幕緩沖區(qū)到用戶地址空間的映射是通過函數(shù)調(diào)用實現(xiàn)的。
5)視頻顯示
視頻圖像的顯示是通過函數(shù)“jpeg_read_scanliness()”、“jpeg_to_frambuffer()”和“jpeg_finish_decompress()”實現(xiàn)的。
本文針對視頻通信系統(tǒng),進(jìn)行了平臺間點對點的無線視頻通信測試。兩個視頻通信節(jié)點通過無線網(wǎng)卡實現(xiàn)節(jié)點間的互聯(lián)互通,視頻采集端將數(shù)字?jǐn)z像頭采集的視頻數(shù)據(jù)無線傳輸給視頻接收端,實現(xiàn)視頻信息的異地實時、動態(tài)顯示。視頻采集端視頻采集如圖9(a)所示,視頻接收端視頻顯示如圖9(b)所示。
圖9 視頻通信測試圖
本文采用嵌入式ARM 系統(tǒng),結(jié)合WIFI 無線通信和數(shù)字?jǐn)z像頭視頻感知,設(shè)計并實現(xiàn)了一種支持視頻圖像采集、傳輸、顯示的移動視頻通信系統(tǒng)。測試結(jié)果表明,移動自組織通信系統(tǒng)功能實用可靠、性能良好。隨著嵌入式技術(shù)的發(fā)展和視頻通信的廣泛應(yīng)用,未來還需要對嵌入式Linux 系統(tǒng)的工程應(yīng)用進(jìn)一步研究,使之更廣泛應(yīng)用于人們的生活和工作。