Linux嵌入式視頻直播監(jiān)控系統(tǒng)
摘要:本文以嵌入式處理器和Linux為開(kāi)發(fā)平臺(tái),利用嵌入式軟件開(kāi)發(fā)技術(shù),Linux下圖像采集技術(shù),MPEG-4壓縮技術(shù),RTP傳輸技術(shù),Linux幀緩沖機(jī)制等設(shè)計(jì)并實(shí)現(xiàn)了嵌入式視頻直播監(jiān)控系統(tǒng)。
關(guān)鍵詞:視頻監(jiān)控,MPEG-4,RTP/RTCP,幀緩沖
Abstract:This paper described how to design and complete an Embedded Video Living Monitoring System, which depended on embedded software developing, Linux graph collection, MPEG-4 compression, RTP translation, Linux framebuffer and use embedded CPU and Linux as developing platform.
Key words: Video Monitoring,MPEG-4,RTP/RTCP,framebuffer
1 引言
近年來(lái),隨著網(wǎng)絡(luò)帶寬,計(jì)算機(jī)處理能力的極大提高和人們安全防范觀(guān)念的加強(qiáng),視頻監(jiān)控領(lǐng)域進(jìn)入了高速發(fā)展的數(shù)字化的網(wǎng)絡(luò)時(shí)代。但嵌入式處理器具有低功耗、體積小、經(jīng)濟(jì)、穩(wěn)定的特點(diǎn);Linux作為一個(gè)開(kāi)源軟件,具有成本低廉的優(yōu)勢(shì),同時(shí)兼具安全、穩(wěn)定的特點(diǎn)。因此,以嵌入式處理器作為硬件平臺(tái),以L(fǎng)inux作為軟件平臺(tái)的視頻監(jiān)控系統(tǒng)能夠結(jié)合兩者的優(yōu)點(diǎn),必將成為未來(lái)的發(fā)展方向。本文介紹了一種Linux嵌入式視頻直播監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方案。
2 系統(tǒng)概述
圖 1 系統(tǒng)結(jié)構(gòu)圖
系統(tǒng)采用服務(wù)器/客戶(hù)機(jī)架構(gòu),分別使用Intel Xscale PXA270、PXA255作為服務(wù)器、客戶(hù)機(jī)硬件平臺(tái),并基于Linux (kernel version:2.6.12)操作系統(tǒng)進(jìn)行開(kāi)發(fā)。服務(wù)器采集視頻,壓縮后通過(guò)局域網(wǎng)傳遞給客戶(hù)機(jī);客戶(hù)機(jī)接收數(shù)據(jù),解壓縮后播放。
服務(wù)器通過(guò)USB攝像頭采集YUV格式視頻,然后進(jìn)行MPEG-4壓縮,將壓縮后的MPEG-4幀進(jìn)行RTP封裝,并通過(guò)RTP協(xié)議進(jìn)行傳輸??蛻?hù)機(jī)接收RTP數(shù)據(jù)包,將數(shù)據(jù)組成一幀,然后進(jìn)行MPEG-4解壓縮,得到Y(jié)UV格式視頻。然而計(jì)算機(jī)只能顯示RGB格式視頻,因此通過(guò)圖像格式轉(zhuǎn)換成RGB格式。最后,利用Linux下的幀緩沖機(jī)制進(jìn)行寫(xiě)屏,從而實(shí)現(xiàn)了視頻回放。
3系統(tǒng)軟件設(shè)計(jì)與實(shí)現(xiàn)
3.1V4L視頻采集
Video4Linux(簡(jiǎn)稱(chēng)V4L)是Linux中關(guān)于視頻設(shè)備的內(nèi)核驅(qū)動(dòng),它為針對(duì)視頻設(shè)備的應(yīng)用程序編程提供一系列接口函數(shù),這些視頻設(shè)備包括現(xiàn)今市場(chǎng)上流行的TV卡、視頻捕捉卡和USB攝像頭等。對(duì)于USB口攝像頭,其驅(qū)動(dòng)程序中需要提供基本的I/O操作接口函數(shù)open,read,write,close的實(shí)現(xiàn)、對(duì)中斷的處理實(shí)現(xiàn)、內(nèi)存映射功能以及對(duì)I/O通道的控制接口函數(shù)ioctl的實(shí)現(xiàn)等,并把它們定義在結(jié)構(gòu)體file_operations中。這樣當(dāng)應(yīng)用程序?qū)υO(shè)備文件進(jìn)行諸如open,close,read,write等系統(tǒng)調(diào)用操作時(shí),Linux內(nèi)核將通過(guò)file_operations結(jié)構(gòu)訪(fǎng)問(wèn)驅(qū)動(dòng)程序提供的函數(shù)。
具體采集工作通過(guò)操作ioctl和mmap系統(tǒng)調(diào)用進(jìn)行實(shí)現(xiàn)。ioctl實(shí)際上是input/output control的縮寫(xiě)。ioctl系統(tǒng)調(diào)用的功能就是通過(guò)打開(kāi)的文件描述符對(duì)各種文件尤其是字符設(shè)備文件進(jìn)行控制,完成特定的I/O操作。在本系統(tǒng)中,使用ioctl(fd, VIDIOCGCAP, cap)以獲取攝像頭基本信息;使用ioctl(fd, VIDIOCGMBUF, *mbuf)以獲取攝像頭緩沖區(qū)信息;使用ioctl(fd, VIDIOCMCAPTURE, mm)進(jìn)行圖像捕捉;使用ioctl(fd, VIDIOCSYNC, frame)等待捕捉完該幀圖像。mmap調(diào)用的功能是實(shí)現(xiàn)內(nèi)存映射,即將指定文件或?qū)ο蟮囊徊糠钟成涞絻?nèi)存中去。這樣可以通過(guò)訪(fǎng)問(wèn)特定的內(nèi)存區(qū)域來(lái)直接對(duì)文件或?qū)ο筮M(jìn)行存取。與read和write。調(diào)用相比,這種I/O方式的效率要高得多。
3.2MPEG-4壓縮和解壓縮
MPEG是Moving Pictures Experts Group(運(yùn)動(dòng)圖像專(zhuān)家組)的縮寫(xiě)。MPEG-4由MPEG制定,并于1999年2月正式成為ISO/IEC 14496國(guó)際標(biāo)準(zhǔn)。MPEG-4的壓縮方法不同于MPEG1/2或H.263+系列標(biāo)準(zhǔn),它是基于對(duì)象的多媒體數(shù)據(jù)壓縮編碼國(guó)際標(biāo)準(zhǔn),定義的是一種框架、一種格式,而不是一種具體的算法。它在多媒體環(huán)境下提供的基于不同對(duì)象的處理方法對(duì)自然或合成的音頻、視頻進(jìn)行壓縮編碼,由一系列支持在該應(yīng)用領(lǐng)域下的工具組成,能夠針對(duì)不同的應(yīng)用組合使用不同的編碼工具,提供如形狀編碼、運(yùn)動(dòng)估計(jì)和運(yùn)動(dòng)補(bǔ)償編碼、紋理編碼和容錯(cuò)編碼等技術(shù)。
本系統(tǒng)借助于MPEG-4開(kāi)源庫(kù)Xvidcore作為編/解碼庫(kù)。具體選用版本1.1.2。Xvidcore中所有的編碼工作都是通過(guò)編碼函數(shù)xvid_encore執(zhí)行的,xvide_encore函數(shù)定義如下:
int xvid_encore(void * handle, int opt, void * paraml, void * param2);
其中opt為編碼所要做的操作,opt有以下三種操作:(1)XVID_ENC_CREATE:創(chuàng)建一個(gè)新的編碼器,則param1為XVID_ENC_PARAM, handle為新編碼的句柄;(2)XVID_ENC_ENCODE:編碼一幀,則param1為XVID_ENC_FRAME, param2為XVID_ ENC_ STATS或NULL;(3)XVID_DEC_DESTROY:編碼結(jié)束,不返回任何句柄。
Xvidcore的所有解碼工作都是由xvid_decore實(shí)現(xiàn)的,xvid_decore函數(shù)定義如下:
int xvid_decore(void * handle, int opt, void * param1, void * param2);
其中opt為解碼所要做的操作,opt有以下三種操作:(1)XVID_DEC_CREATE:創(chuàng)建一個(gè)新的解碼器,則param1為XVID_DEC_PARAM,handle為新編碼的句柄;(2)XVID_DEC_DECODE: 解碼一幀,則param1為XVID_ENC_FRAME;(3)XVID_DEC_DESTROY: 關(guān)掉解碼器,不返回任何句柄。
系統(tǒng)通過(guò)采集模塊采集得到Y(jié)UV420格式的視頻幀存放在緩沖區(qū)中,Xvidcore取出該緩沖區(qū)存放的原始幀數(shù)據(jù),調(diào)用xvid_encore函數(shù)進(jìn)行編碼。接收端調(diào)用xvid_decore函數(shù)對(duì)收到的幀進(jìn)行解碼。從而實(shí)現(xiàn)了MPEG-4的壓縮和解壓縮。
3.3RTP傳輸
實(shí)時(shí)傳輸協(xié)議(Real-time Transport Protocol,RTP)是在 Internet 上處理多媒體數(shù)據(jù)流的一種網(wǎng)絡(luò)協(xié)議,利用它能夠在一對(duì)一(unicast,單播)或者一對(duì)多(multicast,多播)的網(wǎng)絡(luò)環(huán)境中實(shí)現(xiàn)傳流媒體數(shù)據(jù)的實(shí)時(shí)傳輸。我們采用開(kāi)源代碼Jrtplib提供的RTP協(xié)議棧。最新的Jrtplib對(duì)RFC3550的實(shí)現(xiàn)進(jìn)行了封裝,使用C++語(yǔ)言開(kāi)發(fā),能夠在多種平臺(tái)如Linux和Windows下運(yùn)行。
在網(wǎng)絡(luò)帶寬比較低的情況下,數(shù)據(jù)丟幀現(xiàn)象比較嚴(yán)重,這對(duì)于圖像質(zhì)量有很大的影響。我們采用拆幀以后再發(fā)送的方法,來(lái)降低丟幀率。接收端收到數(shù)據(jù)后,再把屬于同一視頻幀的數(shù)據(jù)組合起來(lái)。由于目前常用網(wǎng)絡(luò)是802.3的10Mb/s系統(tǒng),而該系統(tǒng)最大有效載荷為1500字節(jié),因此設(shè)置1400為RTP包大小上限。網(wǎng)絡(luò)發(fā)送接收程序流程圖如圖2所示。
圖2 網(wǎng)絡(luò)發(fā)送接收程序流程圖
簡(jiǎn)單的說(shuō),發(fā)送端發(fā)送RTP包到Client端,發(fā)送的時(shí)候是分批以數(shù)據(jù)包的形式發(fā)送到Client,就是說(shuō)發(fā)送一個(gè)RTP包需要幾次數(shù)據(jù)包發(fā)送來(lái)完成。發(fā)送成功以后發(fā)送下一個(gè)數(shù)據(jù)包,通過(guò)調(diào)用Jrtplib中函數(shù)SendPacket()實(shí)現(xiàn);
接收端依次循環(huán)調(diào)用函數(shù)GetNextPacket()來(lái)接收某一RTP包的數(shù)據(jù),數(shù)據(jù)包到來(lái)不是按順序到來(lái)的,完全接收到RTP包所用的數(shù)據(jù)包以后,根據(jù)時(shí)間戳對(duì)所接收的數(shù)據(jù)包重新排序重新生成最初的RTP包。接收成功后,調(diào)用函數(shù)GotoNextSourceWithData()開(kāi)始接收下一個(gè)RTP包。
3.4寫(xiě)framebuffer進(jìn)行播放
framebuffer設(shè)備是圖形硬件的抽象概念,意指某些視頻硬件的幀緩沖,使得應(yīng)用軟件可以通過(guò)定義好的接口訪(fǎng)問(wèn)圖形硬件。framebuffer將顯示的象素點(diǎn)看成是內(nèi)存的映射,屏幕上每一個(gè)點(diǎn)對(duì)應(yīng)framebuffer內(nèi)存中相應(yīng)的單元。幀緩沖設(shè)備為標(biāo)準(zhǔn)字符設(shè)備,主設(shè)備號(hào)為29,次設(shè)備號(hào)從0到31,分別對(duì)應(yīng)/dev/fb0-/dev/fb31,默認(rèn)為/dev/fb0。通過(guò)/dev/fb0,應(yīng)用程序主要完成以下幾種操作:
1. I/O控制(ioctl)操作:對(duì)于幀緩沖設(shè)備,對(duì)設(shè)備文件的ioctl操作可讀取(FBIOGET_SCREElVINFO,F(xiàn)BIOGET_SCREElVINFO)和設(shè)置(FBIOPUT_VSCREElVINFO, FBIOPUT_FSCREElVINFO)顯示設(shè)備及屏幕的參數(shù),如分辨率、顯示顏色數(shù)、屏幕大小等。
2. 映射(mmap)操作:工作在保護(hù)模式的應(yīng)用程序有自己的虛擬地址空間,但不能直接訪(fǎng)問(wèn)物理緩沖區(qū)地址,為此可以使用mmap函數(shù)將文件的內(nèi)容映射到用戶(hù)空間。之后用戶(hù)就可以通過(guò)讀寫(xiě)這段虛擬地址訪(fǎng)問(wèn)屏幕緩沖區(qū)在屏幕上繪圖了。
4結(jié)束語(yǔ)
本文提出了一種Linux視頻直播監(jiān)控系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn)方案。經(jīng)過(guò)對(duì)系統(tǒng)的測(cè)試表明:當(dāng)客戶(hù)端向服務(wù)器請(qǐng)求現(xiàn)場(chǎng)音視頻流時(shí),服務(wù)器端立刻向通過(guò)客戶(hù)端發(fā)送音視頻流,客戶(hù)端軟件實(shí)時(shí)接收、實(shí)時(shí)解碼、實(shí)時(shí)播放,都能流暢的播放出清晰畫(huà)面,無(wú)明顯抖動(dòng)和延時(shí)。服務(wù)器和客戶(hù)機(jī)可以穩(wěn)定運(yùn)行。服務(wù)器穩(wěn)定后,CPU利用率達(dá)60%-70%,客戶(hù)機(jī)穩(wěn)定后,CPU利用率達(dá)70%-80%。系統(tǒng)穩(wěn)定后,占用帶寬約400kbit/s-500kbit/s,播放幀率約14f/s,能夠滿(mǎn)足一般情況下視頻監(jiān)控要求。
本論文的新見(jiàn)解主要體現(xiàn)在:
(1)提出了一套簡(jiǎn)單易行的流媒體直播系統(tǒng)解決方案,并將其應(yīng)用于嵌入式平臺(tái)。
(2)傳輸過(guò)程中對(duì)RTP數(shù)據(jù)包的大小進(jìn)行控制,大大降低了丟幀率。
參考文獻(xiàn):
[1] 陳章龍等. 嵌入式技術(shù)與系統(tǒng)――Intel XScale結(jié)構(gòu)與開(kāi)發(fā). [M]北京 北京航空航天大學(xué)出版社,2004
[2] 魯比尼. Linux設(shè)備驅(qū)動(dòng)程序(第二版) [M] 北京:電力出版社,2002
[3] 鐘玉琢. 流媒體和視頻服務(wù)器. [M] 北京:清華大學(xué)出版社.2003. 6
[4] 吳昱軍. 媒體實(shí)時(shí)傳輸協(xié)議及其在視頻傳輸系統(tǒng)中的運(yùn)用.微計(jì)算機(jī)信息.2003.19
linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)
評(píng)論