基于RTP 協(xié)議的嵌入式網(wǎng)絡(luò)視頻傳輸系統(tǒng)
【文章摘要】
本文對(duì)RTP 協(xié)議的相關(guān)概念和特性進(jìn)行了簡(jiǎn)述,給出了在嵌入式系統(tǒng)中通過(guò)RTP 協(xié)議進(jìn)行網(wǎng)絡(luò)視頻傳輸?shù)脑O(shè)計(jì)方案。在該方案中,引入了Session 對(duì)象用于實(shí)現(xiàn)嵌入式系統(tǒng)之間的通信,同時(shí)給出了基于RTP 協(xié)議的程序流程圖及重要偽代碼。并在嵌入式Linux 平臺(tái)上成功實(shí)現(xiàn)了基于RTP 協(xié)議的網(wǎng)絡(luò)視頻傳輸系統(tǒng),該系統(tǒng)具有傳輸速度快,視頻清晰度高等優(yōu)點(diǎn)。
【關(guān)鍵詞】
ARM ;RTP 協(xié)議;Linux ;視頻傳輸
0 引言
隨著科學(xué)技術(shù)的發(fā)展以及社會(huì)的進(jìn)步,數(shù)字化、網(wǎng)絡(luò)化正在形成一股席卷世界的浪潮。嵌入式網(wǎng)絡(luò)視頻傳輸系統(tǒng)已經(jīng)不僅僅局限于數(shù)字媒體技術(shù)領(lǐng)域,而是成為當(dāng)前一種重要的媒體工具充斥在社會(huì)的各個(gè)角落。具有更穩(wěn)定的可靠性、更高的傳輸速率以及更加清晰的畫面成為當(dāng)前嵌入式網(wǎng)絡(luò)視頻傳輸系統(tǒng)所追求的目標(biāo)。
本文在嵌入式平臺(tái)上設(shè)計(jì)并實(shí)現(xiàn)了基于RTP 協(xié)議的網(wǎng)絡(luò)視頻傳輸系統(tǒng)。該設(shè)計(jì)采用了RTP 協(xié)議,并且在順序傳輸數(shù)據(jù)包的過(guò)程中,可以利用RTCP 協(xié)議提供的擁塞控制與流量控制來(lái)保障可靠的傳輸機(jī)制。該方案兼顧了系統(tǒng)的穩(wěn)定性、可靠性、可擴(kuò)展性以及成本等多種因素。在視頻監(jiān)控、極端環(huán)境下的視頻傳輸?shù)阮I(lǐng)域有著廣闊的應(yīng)用前景。
1 軟硬件開發(fā)環(huán)境
1.1 硬件開發(fā)環(huán)境
硬件平臺(tái)采用韓國(guó)三星公司的S5PV210 處理器,內(nèi)核采用ARM Cortex-A8 架構(gòu),指令集為ARM v7,運(yùn)行頻率為1GHZ,提供了高達(dá)2000DMIPS 的高性能運(yùn)算能力。同時(shí),該硬件平臺(tái)板載了一個(gè)DM9000 以太網(wǎng)控制芯片,通過(guò)這個(gè)芯片擴(kuò)展了一個(gè)網(wǎng)絡(luò)接口,另外還集成了四個(gè)USB 接口,用于連接USB 設(shè)備。將USB 攝像頭連接到其中任意一個(gè)USB 接口上,并在程序中定義相應(yīng)的緩沖區(qū)用于存放視頻圖像數(shù)據(jù),然后對(duì)數(shù)據(jù)進(jìn)行編碼并打包成UDP 包發(fā)送出去。下圖所示是系統(tǒng)的硬件開發(fā)環(huán)境。
1.2 軟件開發(fā)環(huán)境
軟件開發(fā)環(huán)境選用了為該硬件平臺(tái)定制的Linux 系統(tǒng),該系統(tǒng)在內(nèi)核中添加了USB 攝像頭以及網(wǎng)絡(luò)接口的驅(qū)動(dòng)模塊,并預(yù)裝了Qt/Embedded 系統(tǒng)完成本次設(shè)計(jì)。同時(shí),在該Linux 平臺(tái)上移植了JRTPLIB。JRTPLIB 是一種面向?qū)ο蟮腞TP 庫(kù)。本文所做的工作就是完成RTP 部分的程序編寫。
2 RTP 協(xié)議簡(jiǎn)析
RTP 中文全名是實(shí)時(shí)傳輸協(xié)議, 工作于面向無(wú)連接或連接的下層協(xié)議上,通常與UDP 協(xié)議共同使用。其包含了RTP 及RTCP 協(xié)議。RTP 協(xié)議主要用于對(duì)流媒體數(shù)據(jù)進(jìn)行封包處理,然后進(jìn)行實(shí)時(shí)傳輸。其功能是提供數(shù)據(jù)類型和編碼方式、時(shí)間戳、序列號(hào)和同步源標(biāo)識(shí),接收端根據(jù)這些信息就可以將原始信息正確的還原出來(lái)。RTCP 協(xié)議用來(lái)傳輸實(shí)時(shí)信號(hào)的質(zhì)量參數(shù),它需要與RTP 數(shù)據(jù)協(xié)議配合使用, 并提供了QoS 監(jiān)控機(jī)制。在順序傳輸數(shù)據(jù)包的過(guò)程中,可以利用RTCP 提供的擁塞控制與流量控制提供可靠的傳輸機(jī)制。這樣,就不會(huì)因?yàn)閬G失數(shù)據(jù)包進(jìn)行超時(shí)檢測(cè)而帶來(lái)延遲。同時(shí),可以由上層根據(jù)這些數(shù)據(jù)包的重要性來(lái)判斷是否對(duì)丟失的數(shù)據(jù)包進(jìn)行重傳。在客戶端方面,雖然有時(shí)會(huì)造成畫面模糊,清晰度降低,但卻保證了用戶體驗(yàn)和實(shí)時(shí)性的要求。
3 網(wǎng)絡(luò)視頻傳輸設(shè)計(jì)與實(shí)現(xiàn)
3.1 RTP 程序設(shè)計(jì)流程圖( 圖2)
3.2 RTP 程序的實(shí)現(xiàn)
3.2.1 初始化會(huì)話
在TCP/IP 協(xié)議中,使用Socket 套接字來(lái)完成系統(tǒng)之間的通信,而RTP 協(xié)議則需要用Session 對(duì)象來(lái)實(shí)現(xiàn)相應(yīng)的功能。首先,應(yīng)對(duì)本次RTP 會(huì)話進(jìn)行表示,這就需要生成RTPSession 類的一個(gè)實(shí)例并通過(guò)調(diào)用Create() 方法對(duì)該實(shí)例進(jìn)行初始化, 然后再使用JRTPLIB 實(shí)時(shí)傳輸流媒體數(shù)據(jù)。這里需要指明本次RTP 會(huì)話的端口號(hào)以及初始化參數(shù),即提供給客戶服務(wù)端口號(hào)的數(shù)據(jù)結(jié)構(gòu)和會(huì)話參數(shù)的數(shù)據(jù)結(jié)構(gòu)。下面給出的程序框架用于對(duì)RTP 會(huì)話進(jìn)行初始化,并不具有任何實(shí)質(zhì)的功能。
設(shè)定時(shí)間戳參數(shù):
sessionparams.SetOwnTimestampUn it(1/90000);
設(shè)定參數(shù)為true,用于流媒體數(shù)據(jù)的接收:
sessionparams.
SetAcceptOwnPackets(true);
對(duì)傳輸數(shù)據(jù)包的最大字節(jié)數(shù)進(jìn)行設(shè)置:
sessionparams.
SetMaximumPacketSize(8000);
設(shè)定端口參數(shù):
transparams.SetPortbase(8800);
對(duì)會(huì)話進(jìn)行Create 操作:
status = session.Create(sessionparams,& transparams);
3.2.2 設(shè)定發(fā)送的參數(shù)和數(shù)據(jù)
在RTP 會(huì)話執(zhí)行完Create 操作之后就可以進(jìn)行流媒體數(shù)據(jù)的實(shí)時(shí)傳輸了。因?yàn)镽TP 協(xié)議中規(guī)定了可以有多個(gè)目標(biāo)IP 地址存在于同一個(gè)RTP 會(huì)話中,所以需通過(guò)調(diào)用RTPSession 類中DeleteDestination(),AddDestination() 和ClearDestinations() 方法來(lái)設(shè)置數(shù)據(jù)包發(fā)送的目標(biāo)IP 地址。如下的程序片段完成的功能是在本機(jī)的8000 端口上接收RTP 會(huì)話發(fā)來(lái)的數(shù)據(jù)包:
對(duì)客戶端IP 地址進(jìn)行設(shè)置:
unsigned long clientip = ntohl(inet_addr( "192.168.0.1" ));
添加客戶端IP 地址和端口號(hào)到發(fā)送列表:
RTPIPv4Address addr (clientip, 8000);
對(duì)RTPv4Address 中的對(duì)象addr 進(jìn)行聲明,然后對(duì)目標(biāo)地址進(jìn)行設(shè)定:
status = session.AddDestination(addr);
在全部的目標(biāo) IP 地址都被指定之
圖 1 硬件開發(fā)環(huán)境
后,就能發(fā)送流媒體數(shù)據(jù)了,一般通過(guò)調(diào)用RTPSession 類的SendPacket() 方法來(lái)實(shí)現(xiàn)。SendPacket() 具有多種形式,是一個(gè)由RTPSession 類提供的重載函數(shù),如下所示的程序語(yǔ)句是其最典型的用法,其中包含五個(gè)參數(shù),第一個(gè)是待發(fā)送的數(shù)據(jù),第二個(gè)是待發(fā)送數(shù)據(jù)的長(zhǎng)度,接下來(lái)的參數(shù)分別是負(fù)載類型、標(biāo)識(shí)和時(shí)戳增量。
sess.SendPacket(buffer,5,0,false,10);
通常來(lái)講,在同一個(gè)RTP 會(huì)話中括號(hào)后面的這三個(gè)參數(shù)都是相同的。通過(guò)調(diào)用如下所示的 RTPSession 類中的一些方法, 可以把它們?cè)O(shè)定為整個(gè)會(huì)話過(guò)程中的默認(rèn)參數(shù)。這樣能夠使數(shù)據(jù)的發(fā)送過(guò)程大大簡(jiǎn)化。
sess.SetDefaultPayloadType(0);
sess.SetDefaultMark(false);
sess.SetDefaultTimeStampIncreme nt(10);
這樣,再發(fā)送數(shù)據(jù)時(shí)只需要指明數(shù)據(jù)的前兩個(gè)參數(shù)即可:
sess.SendPacket(buffer,5);
3.2.3 數(shù)據(jù)包的接收
首先,需要在數(shù)據(jù)的接收端接收RTP 或RTCP 數(shù)據(jù)報(bào),可以通過(guò)調(diào)用RTPSession 類的PollData() 方法來(lái)實(shí)現(xiàn)。因?yàn)榭梢杂卸鄠(gè)源存在于同一個(gè)RTP 會(huì)話中,所以可以通過(guò)調(diào)用RTPSession 類中的一些方法來(lái)遍歷所有的源或者僅遍歷攜帶有數(shù)據(jù)的源。接著,在RTP 會(huì)話過(guò)程中還需要對(duì)有效的RTP 數(shù)據(jù)報(bào)進(jìn)行抽取,可以通過(guò)調(diào)用RTPSession 類的GetNextPacket() 方法來(lái)實(shí)現(xiàn)。最后,在處理好RTP 數(shù)據(jù)報(bào)之后,還要及時(shí)進(jìn)行釋放。如下的程序段是對(duì)該過(guò)程的描述:
if (sess.GotoFirstSourceWithData())
{
do
{
RTPPacket *pack;
pack = sess.GetNextPacket();
delete pack;
}
while (sess.GotoNextSourceWithData());
}
3.2.4 控制信息
在使用JRTPLIB 時(shí)不需要了解數(shù)據(jù)的發(fā)送與接收過(guò)程,只要保證SendPacket() 或PollData() 方法其中之一被成功調(diào)用, RTCP 數(shù)據(jù)報(bào)就能被JRTPLIB 自動(dòng)處理, 并且為了保障整個(gè)RTP 會(huì)話過(guò)程中的正確性,它還會(huì)在適當(dāng)?shù)臅r(shí)候發(fā)送RTCP 數(shù)據(jù)報(bào)。除此之外,JRTPLIB 允許通過(guò)RTPSession 類中的方法設(shè)定RTP 會(huì)話中的控制信息。在調(diào)用所有的這些方法時(shí)都需要兩個(gè)重要的參數(shù),一個(gè)是將要發(fā)送的數(shù)據(jù),其類型為char 型指針,另外一個(gè)是數(shù)據(jù)中要被使用的字符數(shù),其類型為int 型數(shù)值。下列語(yǔ)句是對(duì)控制信息中的E-mail Address 進(jìn)行設(shè)置:
s e s s . S e t L o c a l E M a i l ( " 6 8 8 3 1 6 0 @ qq.com",20);
一般只需要對(duì)RTP 會(huì)話過(guò)程中的部分控制信息進(jìn)行發(fā)送。這里可以通過(guò)調(diào)用RTPSession 類提供的EnableSendName()、EnableSendEMail() 等方法,選擇需要發(fā)送的控制信息。
4 結(jié)語(yǔ)與展望
本文簡(jiǎn)述了RTP 協(xié)議的基本內(nèi)容,給出了Linux 下進(jìn)行RTP 通信的流程圖,對(duì)Linux 下RTP 通信的編程方式進(jìn)行了詳細(xì)的描述,并給出了部分重要的核心代碼。
本設(shè)計(jì)采用了USB 攝像頭進(jìn)行圖像的采集工作,在后續(xù)的開發(fā)過(guò)程中,我們可以選用更具有應(yīng)用前景的GigE 工業(yè)相機(jī)。這樣,我們就可以將其大規(guī)模的應(yīng)用于工業(yè)、學(xué)校、銀行等全天候監(jiān)控系統(tǒng)中, 使其具有更加廣闊的應(yīng)用前景。
【參考文獻(xiàn)】
[1] 金美光, 何偉賓, 王鵬杰等. 基于流媒體RTP/RTCP 協(xié)議的視頻數(shù)據(jù)傳輸[J]. 電子技術(shù),2010,37(11):57-59.
[2] 陳小平, 王皖陵.Linux 下實(shí)時(shí)流媒體的編程實(shí)現(xiàn)[J]. 安徽工業(yè)大學(xué)學(xué)報(bào): 自然科學(xué)版, 2005, 22(3): 293-297.
[3] 楊英潔. 流媒體編程[J]. 計(jì)算機(jī)應(yīng)用與軟件,2007,24(9):213-214.
[4] 毛韻楠. 基于DSP 的視頻流媒體嵌入式web 服務(wù)器[J]. 科協(xié)論壇: 下半月,2008 (1): 5-5.
[5] 李慧彬. 基于QoS 組播的RTP 協(xié)議的研究與實(shí)現(xiàn)[D]. 中北大學(xué),2007.
[6] 王憲, 劉井權(quán), 戴旻. 基于ARM 平臺(tái)的遠(yuǎn)程視頻監(jiān)控系統(tǒng)的研究[J]. 微計(jì)算機(jī)信息,2007 (01Z): 178-180.
[7] 歐陽(yáng)普勇. 基于Linux 平臺(tái)下實(shí)時(shí)流媒體傳輸在遠(yuǎn)程教育系統(tǒng)中的應(yīng)用[J]. 科技廣場(chǎng), 2008 (12): 144-146.
[8] 鹿寶生, 陳啟美. 基于嵌入式網(wǎng)絡(luò)視頻服務(wù)器的遠(yuǎn)程監(jiān)控系統(tǒng)[J]. 武漢理工大學(xué)學(xué)報(bào): 信息與管理工程版,2006, 28(5): 9-11.
[9] 王文亮.P2P 多媒體群組通信平臺(tái)多媒體技術(shù)的研究與實(shí)現(xiàn)[D]. 西安電子科技大學(xué), 2009.
[10] 徐光遠(yuǎn). 基于liunx 平臺(tái)的視頻數(shù)據(jù)傳輸優(yōu)化及性能分析[D]. 華中科技大學(xué),2006.
[11]Corbet J,Rubini A, Kroah-Hartman G. Linux Device Drivers,Third Edition[M]. 北京:中國(guó)電力出版社 O'REILLY 2006.1.
本站論文資源均為來(lái)自網(wǎng)絡(luò)轉(zhuǎn)載,免費(fèi)提供給廣大作者參考,不進(jìn)行任何贏利,如有版權(quán)問(wèn)題,請(qǐng)聯(lián)系管理員刪除! 快速論文發(fā)表網(wǎng)(www.6scc.cn)本中心和國(guó)內(nèi)數(shù)百家期刊雜志社有良好的合作關(guān)系,可以幫客戶代發(fā)論文投稿.
投稿郵箱:ksfbw@126.com
客服Q Q:
82702382
聯(lián)系電話:15295038833
本站論文資源均為來(lái)自網(wǎng)絡(luò)轉(zhuǎn)載,免費(fèi)提供給廣大作者參考,不進(jìn)行任何贏利,如有版權(quán)問(wèn)題,請(qǐng)聯(lián)系管理員刪除!