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