亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問板塊 發(fā)新帖
查看: 2189 | 回復(fù): 0
打印 上一主題 下一主題

音/視頻通訊的嵌入式linux視頻監(jiān)控 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-20 09:44 |只看該作者 |倒序?yàn)g覽
視頻監(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

您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP