嵌入式遠(yuǎn)程視頻采集系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
多媒體通信技術(shù)的發(fā)展為信息的獲取和傳輸提供了豐富的手段,視頻采集是其中不可缺少的重要組成部分,該系統(tǒng)基于s3c2410的arm9芯片和嵌入式linux操作系統(tǒng),采用usb攝像頭捕捉視頻,經(jīng)mpeg-4算法壓縮編碼,系統(tǒng)直接與網(wǎng)絡(luò)相連,用戶使用標(biāo)準(zhǔn)的網(wǎng)絡(luò)瀏覽器和流媒體播放程序即可查看遠(yuǎn)程視頻影像。
1 硬件系統(tǒng)
系統(tǒng)硬件平臺(tái)選用北京博創(chuàng)公司的up-netarm2410開(kāi)發(fā)板,該系統(tǒng)基于arm9架構(gòu)嵌入式芯片s3c2410,穩(wěn)定工作在202mhz主頻,板載64mb sdram 64mb flash,主板資源包括:主usb口、從usb口、10m/100m以太網(wǎng)口,觸摸屏、彩色lcd、鍵盤(pán)、8個(gè)用戶自定義led數(shù)碼管, a/d,rtc電路,2個(gè)串口、1個(gè)jtag通用接口,音頻模塊,支持mpeg4,mp3編解碼,3個(gè)168pin的擴(kuò)展插座,32位的數(shù)據(jù)總線,保留充分?jǐn)U展空間。
其中標(biāo)配模塊包括:ic卡+ps2模塊、ide硬盤(pán)+cf卡模塊、pcmcia+sd/mmc模塊。另外可選配模塊有:gps模塊,gprs模塊,fpga模塊,can+ad+da模塊、紅外模塊、藍(lán)牙模塊、攝像頭模塊。
2 軟件系統(tǒng)
2.1 內(nèi)核配置與usb攝像頭驅(qū)動(dòng)
假定已經(jīng)搭建好嵌入式linux的開(kāi)發(fā)環(huán)境,下面第一步工作就是usb攝像頭的安裝與驅(qū)動(dòng)。
首先檢查linux kernel中是否已經(jīng)添加了usb模塊的支持,并且加入video4linux支持。
multimedia devices→<m>video for linux
video for linux→[*]v4l information in proc filesystem
在主菜單的usb support下還有各種攝像頭的驅(qū)動(dòng),選中將要使用的攝像頭芯片類型。
<>usb ibm (xirlink)c-it camera support<*>usb ov511 camera support<>usb philips cameras
<>usb se401 camera support<>usb stv680(pencam)camera support<>usb 3com homeconnect(akavicam)support
在usb攝像頭選購(gòu)時(shí),優(yōu)先考慮linux內(nèi)核公開(kāi)支持的攝像頭芯片,不然要額外編寫(xiě)相應(yīng)的usb攝像頭驅(qū)動(dòng)程序,然后進(jìn)行編譯、安裝。在此選用網(wǎng)眼公司的v3000產(chǎn)品,他采用了ov511的芯片。
確定usb攝像頭被正常驅(qū)動(dòng)后,下一步就是使用video4linux提供的api函數(shù)集來(lái)編寫(xiě)視頻采集程序。
2.2 基于v4l設(shè)計(jì)的視頻采集模塊
在linux下,所有外設(shè)都被看成是一種特殊的文件,稱為設(shè)備文件。系統(tǒng)調(diào)用是內(nèi)核和應(yīng)用程序之間的接口,而設(shè)備驅(qū)動(dòng)程序則是內(nèi)核和外設(shè)之間的接口。他完成設(shè)備的初始化和釋放、對(duì)設(shè)備文件的各種操作和中斷處理等功能,為應(yīng)用程序屏蔽了外設(shè)硬件的細(xì)節(jié),使得應(yīng)用程序可以像普通文件一樣對(duì)外設(shè)進(jìn)行操作。
linux系統(tǒng)中的視頻子系統(tǒng)video4linux為視頻應(yīng)用程序提供了一套統(tǒng)一的api,視頻應(yīng)用程序通過(guò)標(biāo)準(zhǔn)的系統(tǒng)調(diào)用即可操作各種不同的視頻捕獲設(shè)備。video4linux向虛擬文件系統(tǒng)注冊(cè)視頻設(shè)備文件,應(yīng)用程序通過(guò)操作視頻設(shè)備文件實(shí)現(xiàn)對(duì)視頻設(shè)備的訪問(wèn)。
linux下與video4linux相關(guān)設(shè)備及用途如表1所示。
這里主要針對(duì)設(shè)備文件/dev/video進(jìn)行視頻捕捉方面的程序設(shè)計(jì)。
linux下視頻采集流程如圖2所示。
其中用到的主要函數(shù)有:
camera_open():用來(lái)開(kāi)啟視頻設(shè)備文件,使用前需要首先聲明一個(gè)video_device類型的設(shè)備文件。
camera_get_capability():通過(guò)調(diào)用ioctl()函數(shù)取得設(shè)備文件的相關(guān)信息,并存放到video_capability結(jié)構(gòu)里。
camera_get_picture():通過(guò)調(diào)用ioctl()函數(shù)取得圖像的相關(guān)信息,并且存放到video_picture結(jié)構(gòu)里。
camera_close():用來(lái)關(guān)閉設(shè)備文件。
camera_grab_image():用來(lái)抓取圖像,采用mmap方式,直接將設(shè)備文件/dev/video0映射到內(nèi)存,加速文件i/o操作,還可以使多個(gè)線程共享數(shù)據(jù)。
剩下的還有設(shè)備初始化、參數(shù)設(shè)備等相關(guān)函數(shù),不再詳述。
2.3 視頻壓縮編碼模塊
獲取圖像數(shù)據(jù)后,可以直接輸出到framebuffer進(jìn)行顯示,由于本系統(tǒng)要將采集到的視頻影響通過(guò)網(wǎng)絡(luò)傳輸出去,所以在傳輸之前要對(duì)原始的圖像數(shù)據(jù)進(jìn)行壓縮編碼,在此選用mpeg-4視頻編解碼方案。和其他標(biāo)準(zhǔn)相比,mpeg-4壓縮比更高,節(jié)省存儲(chǔ)空間,圖像質(zhì)量更好,特別適合在低帶寬條件下傳輸視頻,并能保持圖像的質(zhì)量。
mpeg-4中基于對(duì)象的視頻編碼過(guò)程可以分為3步進(jìn)行:
(1)從原始視頻流中分割視頻對(duì)象。
(2)對(duì)視頻對(duì)象進(jìn)行編碼,對(duì)不同視頻對(duì)象的運(yùn)動(dòng)信息、形狀信息、紋理信息分配不同的碼字。對(duì)輸入的任意形狀的vop序列,用基于塊的混合編碼技術(shù)編碼,處理順序是先ivop后pvop,bvop。在對(duì)vop的形狀信息編碼后,取得任意形狀vop的采樣,每個(gè)vop劃分為不相交的宏塊,每個(gè)宏塊含有4個(gè)8×8象素塊進(jìn)行運(yùn)動(dòng)補(bǔ)償以及紋理編碼,已編碼的vop幀保存在幀存中,在當(dāng)前vop幀和已編碼vop幀之間的計(jì)算運(yùn)動(dòng)矢量;對(duì)將編碼的塊和宏塊,計(jì)算他們的運(yùn)動(dòng)補(bǔ)償預(yù)測(cè)誤差;運(yùn)動(dòng)補(bǔ)償預(yù)測(cè)后的ivop及誤差用8×8塊dct變換,并進(jìn)行dct系數(shù)的量化,然后是游程編碼和熵編碼。
(3)對(duì)各個(gè)視頻對(duì)象的碼流進(jìn)行復(fù)合,每個(gè)視頻對(duì)象的形狀、運(yùn)動(dòng)紋理信息復(fù)合成vol比特流,各視頻對(duì)象視頻流復(fù)合成統(tǒng)一的碼流輸出。對(duì)視頻流進(jìn)行壓縮編碼以后,接下來(lái)就要實(shí)現(xiàn)網(wǎng)絡(luò)傳輸部分的功能。
2.4 jrtplib網(wǎng)絡(luò)傳輸模塊
流媒體指的是在網(wǎng)絡(luò)中使用流技術(shù)傳輸?shù)倪B續(xù)時(shí)基媒體,rtp是目前解決流媒體實(shí)時(shí)傳輸問(wèn)題的好辦法,jrtplib是一個(gè)面向?qū)ο蟮膔tp庫(kù),他完全遵循rfc1889設(shè)計(jì),下面講述如何在linux平臺(tái)上運(yùn)用rtp協(xié)議進(jìn)行實(shí)時(shí)流媒體編程。
2.4.1 初始化
在使用jrtplib進(jìn)行實(shí)時(shí)流媒體數(shù)據(jù)傳輸之前,首先應(yīng)該生成rtpsession類的一個(gè)實(shí)例來(lái)表示此次rtp會(huì)話,然后調(diào)用create()方法來(lái)對(duì)其進(jìn)行初始化操作。rtpsession類的create()方法只有一個(gè)參數(shù),用來(lái)指明此次rtp會(huì)話所采用的端口號(hào)。
2.4.2 數(shù)據(jù)發(fā)送
當(dāng)rtp會(huì)話成功建立起來(lái)之后,接下來(lái)就可以開(kāi)始進(jìn)行流媒體數(shù)據(jù)的實(shí)時(shí)傳輸了。首先需要設(shè)置好數(shù)據(jù)發(fā)送的目標(biāo)地址,rtp協(xié)議允許同一會(huì)話存在多個(gè)目標(biāo)地址,這可以通過(guò)調(diào)用rtpsession類的adddestination()、deletedestination()和cleardestinations()方法來(lái)完成。目標(biāo)地址全部指定之后,接著就可以調(diào)用rtpsession類的sendpacket()方法,向所有的目標(biāo)地址發(fā)送流媒體數(shù)據(jù)。
2.4.3 數(shù)據(jù)接收
對(duì)于流媒體數(shù)據(jù)的接收端,首先需要調(diào)用polldata()方法來(lái)接收發(fā)送過(guò)來(lái)的rtp或者rtcp數(shù)據(jù)報(bào)。由于同一個(gè)rtp會(huì)話中允許有多個(gè)參與者(源),因此既可以通過(guò)調(diào)用gotofirstsource()和gotonextsource()方法來(lái)遍歷所有的源,也可以通過(guò)調(diào)用gotofisstsourcewithdat()和gotonextsourcewithdata()方法來(lái)遍歷那些攜帶有數(shù)據(jù)的源。在從rtp會(huì)話中檢測(cè)出有效的數(shù)據(jù)源之后,接下去就可以調(diào)用rtpsession類的getnextpacket()方法從中抽取rtp數(shù)據(jù)報(bào),當(dāng)接收到的rtp數(shù)據(jù)報(bào)處理完之后,要及時(shí)釋放。
jrtplib為rtp數(shù)據(jù)報(bào)定義了3種接收模塊,通過(guò)調(diào)用rtpsession類的setreceivemode()方法可以設(shè)置下列這些接收模式:
receivemode_all:缺省的接收模式,所有到達(dá)的rtp數(shù)據(jù)報(bào)都將被接受;
receivemode_ignoresome:除了某些特定的發(fā)送者之外,所有到達(dá)的rtp數(shù)據(jù)報(bào)都將被接受,而被拒絕的發(fā)送者列表可以通過(guò)調(diào)用addtoignorelist(),deletefromignorelist()和clearignorelist()方法來(lái)進(jìn)行設(shè)置;
receivemode_acceptsome:除了某些特定的發(fā)送者之外,所有到達(dá)的rtp數(shù)據(jù)報(bào)都將被拒絕,而被接受的發(fā)送者列表可以通過(guò)調(diào)用addtoacceptlist(),deletefromacceptlist和clearacceptlist()方法來(lái)進(jìn)行設(shè)置。
2.4.4 控制信息
jrtplib是一個(gè)高度封裝后的rtp庫(kù),只要polldata()或者sendpacket()方法被成功調(diào)用,jrtplib就能夠自動(dòng)對(duì)達(dá)到的rtcp數(shù)據(jù)報(bào)進(jìn)行處理,并且還會(huì)需在要的時(shí)候發(fā)送rtcp數(shù)據(jù)報(bào),從而能夠確保整個(gè)rtp會(huì)話過(guò)程的正確性。
在本系統(tǒng)中,使用rtpsession jrtplib類庫(kù)提供的方法來(lái)實(shí)現(xiàn)底層的rtp/rtcp操作,并且把他封裝在crtptransmitter類中,該類從media sink類繼承而來(lái),接收到相應(yīng)的媒體幀數(shù)據(jù),使用rtpsession類庫(kù)的操作把數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上。
3 結(jié)語(yǔ)
本系統(tǒng)基于s3c2410平臺(tái)和linux操作系統(tǒng),利用video4linux設(shè)計(jì)采集程序,使用mpeg-4壓縮編碼算法,通過(guò)實(shí)時(shí)流媒體傳輸技術(shù)實(shí)現(xiàn)了網(wǎng)絡(luò)傳輸,整個(gè)系統(tǒng)具有穩(wěn)定可靠、安裝簡(jiǎn)便、成本低廉等特點(diǎn),可擴(kuò)展應(yīng)用在工業(yè)控制、視頻會(huì)議系統(tǒng)、可視電話、遠(yuǎn)程監(jiān)控系統(tǒng)等諸多領(lǐng)域。
評(píng)論