視頻監(jiān)控它是一種防范能力較強(qiáng)的綜合系統(tǒng)。視頻監(jiān)控以其直觀、準(zhǔn)確、及時(shí)和信息內(nèi)容豐富而廣泛應(yīng)用于許多場(chǎng)合。近年來,隨著計(jì)算機(jī)、網(wǎng)絡(luò)以及圖像處理、傳輸技術(shù)的飛速發(fā)展,視頻監(jiān)控技術(shù)也有了長(zhǎng)足的發(fā)展。如今視頻監(jiān)控已遍布城市的角落,生活更是因?yàn)橛辛怂岣吡速|(zhì)量,下面跟大家分享一篇在網(wǎng)上下載的論文。結(jié)合佰銳科技音視頻的相關(guān)知識(shí)進(jìn)行闡述。
1 引 言
目前,基于PC 的傳統(tǒng)視頻監(jiān)控系統(tǒng)在安防領(lǐng)域使用仍較廣泛,這種系統(tǒng)雖然功能較強(qiáng),但穩(wěn)定性不好、視頻前端較為復(fù)雜、可靠性較差、功耗高。近年來,隨著高性能嵌入式處理器和網(wǎng)絡(luò)技術(shù)的快速發(fā)展,數(shù)字化、小型化、網(wǎng)絡(luò)化的嵌入式網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng)將會(huì)得到廣泛應(yīng)用,這種系統(tǒng)把圖像采集、視頻壓縮和網(wǎng)絡(luò)功能集中在一起,可以直接連入以太網(wǎng), 具有體積小、功耗低、穩(wěn)定性高、成本低等優(yōu)點(diǎn)。視頻編碼有兩種實(shí)現(xiàn)方式:一種是通過專用芯片實(shí)現(xiàn)視頻圖像的硬件壓縮,另一種是在通用處理器基礎(chǔ)上利用軟件方式實(shí)現(xiàn)壓縮, 相對(duì)于硬件壓縮方式,軟件壓縮具有可擴(kuò)展性好、算法靈活等特點(diǎn)。
本文設(shè)計(jì)和實(shí)現(xiàn)了一個(gè)嵌入式視頻監(jiān)控系統(tǒng),該系統(tǒng)基于嵌入式Linux操作系統(tǒng)和 ARM9 微處理器平臺(tái),通過軟件壓縮方式利用Xvid 編碼器實(shí)現(xiàn)視頻壓縮編碼,通過RTP將視頻數(shù)據(jù)發(fā)送到網(wǎng)絡(luò)上進(jìn)行傳輸,遠(yuǎn)程客戶端可通過終端軟件接收并解碼視頻流以實(shí)現(xiàn)視頻監(jiān)控。
2 系統(tǒng)硬件設(shè)計(jì)
系統(tǒng)硬件系統(tǒng)采用的ARM9內(nèi)核芯片S3C2440[3]作為硬件平臺(tái)的中央處理器,該處理器主頻可達(dá) 400MHz,硬件接口和資源豐富,存儲(chǔ)單元包括Flash 和 SDRAM,F(xiàn)lash 具有掉電保持?jǐn)?shù)據(jù)的特性,用于存儲(chǔ)Bootloader 啟動(dòng)程序、Linux 內(nèi)核映像、文件系統(tǒng)以及用戶應(yīng)用程序等。SDRAM 數(shù)據(jù)存取速度大大高于 Flash 存儲(chǔ)器,用于為操作系統(tǒng)和應(yīng)用程序提供運(yùn)行空間。平臺(tái)利用RS232 接口輸出調(diào)試信息,通過以太網(wǎng)控制器芯片 DM9000 擴(kuò)展了一個(gè)網(wǎng)口,用于與外部網(wǎng)絡(luò)進(jìn)行通信,通過 USB HOST 接口連接USB 攝像頭采集圖像數(shù)據(jù),經(jīng)處理器壓縮并打包成視頻流后經(jīng)以太網(wǎng)進(jìn)行傳輸,終端用戶接收到視頻流,解碼后即可把視頻圖像顯示出來。
3 系統(tǒng)軟件設(shè)計(jì)
軟件平臺(tái)采用的嵌入式操作系統(tǒng)為L(zhǎng)inux 2.6.13,Linux 具有內(nèi)核小、效率高、源碼開放、內(nèi)核直接提供網(wǎng)絡(luò)支持等優(yōu)點(diǎn),但嵌入式系統(tǒng)的硬件資源有限,因此需根據(jù)實(shí)際需求對(duì)內(nèi)核進(jìn)行裁剪,配置所需的功能模塊,然后再移植到硬件平臺(tái)上。
嵌入式系統(tǒng)的軟件開發(fā)采用交叉編譯調(diào)試的方式,在宿主機(jī)上安裝Linux 系統(tǒng),建立交叉編譯環(huán)境,在宿主機(jī)編寫程序代碼,再利用交叉編譯工具生成目標(biāo)機(jī)上可用的可執(zhí)行文件,最后向目標(biāo)機(jī)平臺(tái)移植。
3.1 視頻采集模塊
視頻采集模塊通過嵌入式 Linux 操作系統(tǒng)調(diào)用 Video4Linux(V4L)和底層設(shè)備驅(qū)動(dòng)程序來完成視頻捕獲。V4L 是Linux 中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng),它為L(zhǎng)inux 下的各種視頻設(shè)備提供了統(tǒng)一的編程接口,應(yīng)用程序通過這些接口函數(shù)就可以操縱各種不同的設(shè)備。
(1)打開視頻設(shè)備。Linux下的視頻設(shè)備文件一般為“/dev/video0 ”,通過調(diào)用函數(shù) v4l_open( ) ,利用 vd->fd=open(“/dev/video0”,O_RDWR)打開設(shè)備并獲得設(shè)備文件描述符vd->fd。
(2) 獲取設(shè)備和圖像信息。通過 v4l_get_capability( ) 函數(shù)獲取設(shè)備信息,通過v4l_get_picture( )函數(shù)獲取圖像信息。
(3) 內(nèi)存映射。獲取圖像的方式有兩種:read( )直接讀取和mmap( ) 內(nèi)存映射。直接讀取方式通過內(nèi)核緩沖區(qū)來讀取圖像數(shù)據(jù),而本文使用內(nèi)存映射方式mmap( ),內(nèi)存映射方式可以直接把設(shè)備文件映射到內(nèi)存中,進(jìn)程可以像訪問普通內(nèi)存一樣對(duì)文件進(jìn)行訪問,讀取效率 更高。初始化內(nèi)存映射時(shí),需在內(nèi)存中開辟一塊空間,利用 ioctl(vd->fd,VIDIOCGMBUF, &(vd->mbuf))操作取得需要映射的內(nèi)存空間大小 vd->mbuf.size ,利用 mmap( ) 函數(shù),即vd->map=(unsigned char*) mmap(0, vd->mbuf.size, PROT_READ | PROT_WRITE, MAP_SHARED, vd->fd, 0)操作,把設(shè)備文件的內(nèi)容映射到內(nèi)存,vd->map 指針?biāo)赶虻膬?nèi)存區(qū)即為采集的圖像數(shù)據(jù),且此內(nèi)存區(qū)具有可讀寫和共享屬性。
(4)初始化采集參數(shù)。設(shè)置采集視頻圖像的寬度、高度、格式等信息。
(5)采集視頻數(shù)據(jù)。利用ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap))操作采集一幀圖 像并存放到內(nèi)存映射區(qū),采集一幀圖像后要進(jìn)行同步操作,利用ioctl(vd->fd, VIDIOCSYNC, &(vd-> frame_current))操作判斷該幀圖像是否獲取完畢。對(duì)于獲取到的視頻圖像,通過視頻 壓縮模塊壓縮成MPEG-4 視頻流,再通過視頻傳輸模塊把數(shù)據(jù)發(fā)送到以太網(wǎng)進(jìn)行傳輸。
3.2 視頻壓縮模塊
從攝像頭直接采集過來的圖像由于數(shù)據(jù)量較大,不利于進(jìn)行網(wǎng)絡(luò)傳輸,因此需先對(duì)其進(jìn) 行壓縮編碼。MPEG-4 是目前網(wǎng)絡(luò)多媒體傳輸?shù)闹饕袷,具有高效的壓縮率,它利用很窄的帶寬,通過幀重建技術(shù)來壓縮圖像數(shù)據(jù),以求利用最少的數(shù)據(jù)獲得最佳的圖像質(zhì)量 ,可滿足實(shí)時(shí)視頻傳輸?shù)囊蟆1疚挠密浖绞竭M(jìn)行視頻編碼,選擇開源高效的 Xvid 視頻編碼器對(duì)采集的視頻圖像數(shù)據(jù)進(jìn)行MPEG-4 壓縮編碼。
Xvid 視頻編碼器選用0.9.2 版本,因?yàn)樵摪姹疽呀?jīng)實(shí)現(xiàn)了MPEG-4 的Simple Profile (SP) 特性,而 1.0 以后的版本增加了很多Advanced SP (ASP )特性及其他功能,ASP 特性的加入會(huì)增加運(yùn)算復(fù)雜度,降低編碼速度,由于嵌入式系統(tǒng)的處理能力有限,一般只使用 Xvid的SP 特性,因此實(shí)驗(yàn)選用Xvid0.9.2 編碼器,交叉編譯并移植到嵌入式系統(tǒng)內(nèi)。
在宿主機(jī)Linux 操作系統(tǒng)中對(duì)Xvid0.9.2 進(jìn)行交叉編譯的步驟如下:
(1) 解壓縮Xvid 源碼: tar –xzvf xvidcore- 0.9.2.tar.gz
(2) 進(jìn)入build/generic 目錄,創(chuàng)建編譯配置文件。由于Xvid 沒有針對(duì)ARM 的匯編優(yōu)化, 因此編譯時(shí)需將匯編關(guān)閉;還需指定程序所運(yùn)行的平臺(tái)為arm-linux。
執(zhí)行命令: ./configure --disable-assembly --host=arm-linux
(3) 編譯:make; make install 。
(4) 交叉編譯完成后會(huì)生成靜態(tài)庫(kù)libxvidcore.a 和動(dòng)態(tài)庫(kù)libxvidcore.so.*,用戶程序可利用庫(kù)文件所提供的編程接口調(diào)用Xvid 里面的函數(shù)。
攝像頭采集的視頻幀為 YUV420 格式,通過 Xvid 編碼器的 encoder_encode 函數(shù)實(shí)現(xiàn)視頻壓縮,該函數(shù)定義如下: int encoder_encode(Encoder * pEnc, XVID_ENC_FRAME * pFrame, XVID_ENC_STATS * pResult); 其中,pEnc 為編碼器實(shí)例的句柄;pFrame 是XVID_ENC_FRAME 類型的結(jié)構(gòu)體變量,負(fù)責(zé)傳遞參數(shù)信息給編碼器,這些信息包含色彩空間、編碼質(zhì)量、輸入輸出數(shù)據(jù)緩沖區(qū)指針等;pResult 是XVID_ENC_STATS 類型的結(jié)構(gòu)體變量,可以返回編碼操作執(zhí)行的狀態(tài)信息。
3.3 視頻傳輸模塊
視頻傳輸模塊負(fù)責(zé)把壓縮后的視頻流傳輸?shù)揭蕴W(wǎng),對(duì)實(shí)時(shí)性要求較高,本文使用實(shí)時(shí)傳輸協(xié)議(Real-time Transport Protocol,RTP),它可以在一對(duì)一或者一對(duì)多的網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)流媒體數(shù)據(jù)的實(shí)時(shí)傳輸。JRTPLIB[7]是一個(gè)利用C++語言實(shí)現(xiàn)的開源RTP 庫(kù),它完全遵循RFC 1889 設(shè)計(jì),使用 SOCKET 機(jī)制實(shí)現(xiàn)網(wǎng)絡(luò)通訊,可運(yùn)行于包括Linux 和Windows 在內(nèi)的多種不同操作系統(tǒng)上。
本文使用JRTPLIB 進(jìn)行實(shí)時(shí)流媒體編程,發(fā)送端操作系統(tǒng)為L(zhǎng)inux,接收端為Windows。在Linux 平臺(tái)上用JRTPLIB 進(jìn)行實(shí)時(shí)多媒體編程前,需先對(duì)JRTPLIB 進(jìn)行交叉編譯。
(1) JRTPLIB 初始化
通過調(diào)用RTPSessionParams 類的 SetOwnTimestampUnit( )方法設(shè)置一個(gè)恰當(dāng)?shù)臅r(shí)間戳,調(diào)用 SetMaximumPacketSize( )方法設(shè)置允許傳輸?shù)淖畲驲TP 包字節(jié)數(shù)(默認(rèn)為 1400 字節(jié));通過調(diào)用RTPUDPv4TransmissionParams 類的 SetPortbase( )方法設(shè)置發(fā)送端數(shù)據(jù)傳輸所用的端口號(hào)(需為偶數(shù))。初始化完這兩個(gè)變量后,通過 RTPSession 類的 Create( )方法創(chuàng)建一個(gè)RTP會(huì)話。
(2) JRTPLIB 數(shù)據(jù)傳輸
RTP 會(huì)話創(chuàng)建完成后,還需指定數(shù)據(jù)發(fā)送的目標(biāo)地址,RTP 協(xié)議允許一個(gè)會(huì)話包含多個(gè)目標(biāo)地址,增加或刪除目標(biāo)地址可通過RTPSession 類的AddDestination( ) 、DeleteDestination( )、ClearDestinations( )方法來實(shí)現(xiàn)。
目標(biāo)地址指定之后,通過RTPSession 類的 SendPacket( )方法即可向指定的目標(biāo)地址發(fā)送流媒體數(shù)據(jù)。SendPacket( )是一個(gè)重載函數(shù),具有多種形式,本文使用的形式為: int SendPacket(const void *data, size_t len, uint8_t pt, bool mark, uint32_t timestampinc); 當(dāng)一幀數(shù)據(jù)所占字節(jié)數(shù)大于允許傳輸?shù)淖畲驲TP 包字節(jié)數(shù)MaxPacketSize 時(shí),需對(duì)一幀數(shù)據(jù)進(jìn)行分割傳輸,使每次發(fā)送的字節(jié)數(shù)不大于MaxPacketSize,可使用 SendPacket( )的mark參數(shù)來標(biāo)識(shí)傳輸?shù)?RTP 包是否屬于同一幀數(shù)據(jù),若一幀數(shù)據(jù)需分成N 次發(fā)送,則前N-1 次發(fā)送的RTP 包的mark 標(biāo)志設(shè)為0,第N 次發(fā)送的RTP 包的mark 標(biāo)志設(shè)為1,即以mark=1 來判斷分割傳輸?shù)臄?shù)據(jù)是否發(fā)送完成。實(shí)現(xiàn)過程如下: do{ if(length>MaxPacketSize){ mark=0;
發(fā)送長(zhǎng)度為MaxPacketSize 的RTP 包; length=length-MaxPacketSize; } else{ mark=1;
發(fā)送長(zhǎng)度為length 的RTP 包;
break; //一幀數(shù)據(jù)發(fā)送完成 } }while(1);
(3) JRTPLIB 數(shù)據(jù)接收
接收數(shù)據(jù)時(shí),以BeginDataAccess( )函數(shù)開始,以EndDataAccess( )函數(shù)結(jié)束。為了能正確接收同一數(shù)據(jù)源的數(shù)據(jù)報(bào),必須先對(duì)數(shù)據(jù)源表(source table)加鎖,BeginDataAccess( )函數(shù)可實(shí)現(xiàn)這一加鎖操作,確保在使用數(shù)據(jù)源表的同時(shí)輪詢(poll)線程不能訪問它,此時(shí)可進(jìn)行數(shù)據(jù)接收操作,當(dāng)正確接收一個(gè)數(shù)據(jù)報(bào)后,調(diào)用EndDataAccess( )函數(shù)即可實(shí)現(xiàn)對(duì)數(shù)據(jù)源表 的解鎖。
對(duì)于分割傳輸?shù)?RTP 包,根據(jù) RTP 包的 mark 標(biāo)志來判斷一幀數(shù)據(jù)是否接收完成,若mark=0,則表示此RTP 包為分割傳輸?shù)臄?shù)據(jù)包,需循環(huán)接收直到mark=1為止,然后把這些RTP包重新組合成完整的一幀數(shù)據(jù)。
3.4 視頻解碼與回放
接收到的視頻流數(shù)據(jù)經(jīng)過 Xvid 解碼器的 decoder_decode 函數(shù)進(jìn)行解碼,該函數(shù)定義如下: int decoder_decode(DECODER * dec, XVID_DEC_FRAME * frame); 其中,dec 為解碼器實(shí)例的句柄,frame 為 XVID_DEC_FRAME 結(jié)構(gòu)體變量,包含解碼前后圖像數(shù)據(jù)的緩沖區(qū)指針、碼流長(zhǎng)度等信息。
4 結(jié) 語
嵌入式Linux 和ARM9 處理器平臺(tái)的網(wǎng)絡(luò)視頻監(jiān)控系統(tǒng),測(cè) 試表明該系統(tǒng)性能穩(wěn)定,除可查看監(jiān)控圖像外,還可實(shí)現(xiàn)抓圖和錄像等功能。這種嵌入式視頻監(jiān)控系統(tǒng)與傳統(tǒng)視頻監(jiān)控系統(tǒng)相比,更適合于遠(yuǎn)距離傳輸,且抗干擾能力強(qiáng)、靈活性更好、易安裝和維護(hù),可用于家庭、小區(qū)、工廠、商店等監(jiān)控場(chǎng)合,應(yīng)用前景廣闊。 如果要自己完全開發(fā)一套可用的系統(tǒng),還是需要花費(fèi)大量的時(shí)間及精力,如果是公司商用的話,可以考慮一些商用的開發(fā)包,如(Anychat ) http://www.anychat.cn/ 可以節(jié)約開發(fā)時(shí)間,縮短項(xiàng)目開發(fā)周期;節(jié)省開發(fā)費(fèi)用;減少人力資源投入平臺(tái)自主開發(fā),提升企業(yè)綜合競(jìng)爭(zhēng)力;產(chǎn)品跨平臺(tái),應(yīng)用領(lǐng)域廣闊;API接口豐富,方便與第三方業(yè)務(wù)集成;專業(yè)技術(shù)支持,性能穩(wěn)定可靠。是即時(shí)通訊的重重之選!
測(cè)試下載地址:http://www2.bairuitech.com/downloads/bairuisoft/AnyChatCoreSDK_V3.0.rar |