實現RTP協議的H.264視頻傳輸系統

1.? 引言
?????? 隨著信息產業的發展,人們對信息資源的要求已經逐漸由文字和圖片過渡到音頻和視頻,并越來越強調獲取資源的實時性和互動性。但人們又面臨著另外一種不可避免的尷尬,就是在網絡上看到生動清晰的媒體演示的同時,不得不為等待傳輸文件而花費大量時間。為了解決這個矛盾,一種新的媒體技術應運而生,這就是流媒體技術。流媒體由于具有啟動時延小、節省客戶端存儲空間等優勢,逐漸成為人們的首選,流媒體網絡應用也在全球范圍內得到不斷的發展。其中實時流傳輸協議 RTP?詳細說明了在互聯網上傳遞音頻和視頻的標準數據包格式,它與傳輸控制協議 RTCP 配合使用,成為流媒體技術最普遍采用的協議之一。?
?????? ?H.264/AVC 是ITU-T 視頻編碼專家組(VCEG)和ISO/IEC 動態圖像專家組(MPEG )聯合組成的聯合視頻組(JVT)共同努力制訂的新一代視頻編碼標準,它最大的優勢是具有很高的數據壓縮比率,在同等圖像質量的條件下,H.264 的壓縮比是MPEG-2 的2 倍以上,是 MPEG-4的1.5~2 倍。同時,采用視頻編碼層(VCL)和網絡提取層(NAL )的分層設計,非常適用于流媒體技術進行實時傳輸。本文就是基于 RTP 協議,對 H.264 視頻進行流式打包傳輸,實現了一個基本的流媒體服務器功能,同時利用開源播放器VLC 作為接收端,構成一個完整的H.264 視頻傳輸系統。

2.? RTP 協議關鍵參數的設置
???????? RTP 協議是 IETF 在 1996 年提出的適合實時數據傳輸的新型協議。RTP 協議實際上是由實時傳輸協議RTP(Real-time Transport Protocol)和實時傳輸控制協議RTCP(Real-time Transport Control Protocol)兩部分組成。RTP 協議基于多播或單播網絡為用戶提供連續媒體數據的實時傳輸服務;RTCP?協議是 RTP?協議的控制部分,用于實時監控數據傳輸質量,為系統提供擁塞控制和流控制。RTP 協議在RFC3550 中有詳細介紹。每一個 RTP 數據包都由固定包頭(Header )和載荷(Payload)兩個部分組成,其中包頭前12個字節的含義是固定的,而載荷則可以是音頻或視頻數據。RTP 固定包頭的格式如圖1所示:?
??


???????
?其中比較關鍵的參數設置解釋如下:
????? (1)標示位(M ):1 位,該標示位的含義一般由具體的媒體應用框架(profile )定義, 目的在于標記處RTP 流中的重要事件。
?????(2)載荷類型(PT):7 位,用來指出RTP負載的具體格式。在RFC3551中,對常用的音視頻格式的RTP 傳輸載荷類型做了默認的取值規定,例如,類型2 表明該RTP數據包中承載的是用ITU G.721 算法編碼的語音數據,采用頻率為 8000HZ,并且采用單聲道。
??? (3)序號:16 位,每發送一個 RTP?數據包,序號加 1。接受者可以用它來檢測分組丟失和恢復分組順序。
???(4)時間戳:32?位,時間戳表示了 RTP?數據分組中第一個字節的采樣時間,反映出各RTP 包相對于時間戳初始值的偏差。對于RTP 發送端而言,采樣時間必須來源于一個線性單調遞增的時鐘。
?????? 從 RTP?數據包的格式不難看出,它包含了傳輸媒體的類型、格式、序列號、時間戳以及是否有附加數據等信息。這些都為實時的流媒體傳輸提供了相應的基礎。而傳輸控制協議RTCP為 RTP傳輸提供了擁塞控制和流控制,它的具體包結構和各字段的含義可參考RFC3550,此處不再贅述。
3.? H.264 基本流結構及其傳輸機制
3.1 ?H.264 基本流的結構
H.264 的基本流(elementary stream,ES)的結構分為兩層,包括視頻編碼層(VCL)和網絡適配層(NAL)。視頻編碼層負責高效的視頻內容表示,而網絡適配層負責以網絡所要求的恰當的方式對數據進行打包和傳送。引入NAL并使之與VCL分離帶來的好處包括兩方面:其一、使信號處理和網絡傳輸分離,VCL 和NAL 可以在不同的處理平臺上實現;其二、VCL 和NAL 分離設計,使得在不同的網絡環境內,網關不需要因為網絡環境不同而對VCL比特流進行重構和重編碼。
?????? H.264 的基本流由一系列NALU?(Network Abstraction Layer Unit )組成,不同的NALU數據量各不相同。H.264 草案指出[2],當數據流是儲存在介質上時,在每個NALU 前添加起始碼:0x000001,用來指示一個 NALU的起始和終止位置。在這樣的機制下,*在碼流中檢測起始碼,作為一個NALU得起始標識,當檢測到下一個起始碼時,當前NALU結束。每個NALU單元由一個字節的 NALU頭(NALU Header)和若干個字節的載荷數據(RBSP)組成。其中NALU 頭的格式如圖2 所示:


??????? F:forbidden_zero_bit.1 位,如果有語法沖突,則為 1。當網絡識別此單元存在比特錯誤時,可將其設為 1,以便接收方丟掉該單元。?
??????? NRI:nal_ref_idc.2 位,用來指示該NALU 的重要性等級。值越大,表示當前NALU越重要。具體大于0 時取何值,沒有具體規定。
?Type:5 位,指出NALU 的類型。具體如表1 所示:


????? 需要特別指出的是,NRI 值為 7 和 8 的NALU 分別為序列參數集(sps)和圖像參數集(pps)。參數集是一組很少改變的,為大量VCL NALU 提供解碼信息的數據。其中序列參數集作用于一系列連續的編碼圖像,而圖像參數集作用于編碼視頻序列中一個或多個獨立的圖像。如果*沒能正確接收到這兩個參數集,那么其他NALU?也是無法解碼的。因此它們一般在發送其它 NALU?之前發送,并且使用不同的信道或者更加可靠的傳輸協議(如TCP)進行傳輸,也可以重復傳輸。
3.2? 適用于 H.264 視頻的傳輸機制
?????? 前面分別討論了RTP 協議及H.264基本流的結構,那么如何使用RTP協議來傳輸H.264視頻了?一個有效的辦法就是從H.264視頻中剝離出每個NALU,在每個NALU前添加相應的RTP包頭,然后將包含RTP 包頭和NALU 的數據包發送出去。下面就從RTP包頭和NALU兩方面分別闡述。
????? 完整的 RTP?固定包頭的格式在前面圖 1 中已經指出,根據RFC3984[3],這里詳細給出各個位的具體設置。
????? V:版本號,2 位。根據RFC3984,目前使用的RTP 版本號應設為0x10。
????? P:填充位,1 位。當前不使用特殊的加密算法,因此該位設為 0。
????? X:擴展位,1 位。當前固定頭后面不跟隨頭擴展,因此該位也為 0。
??? ? CC:CSRC 計數,4 位。表示跟在 RTP?固定包頭后面CSRC 的數目,對于本文所要實現的基本的流媒體服務器來說,沒有用到混合器,該位也設為 0x0。
?? ??? M:標示位,1 位。如果當前 NALU為一個接入單元最后的那個NALU,那么將M位置 1;或者當前RTP 數據包為一個NALU 的最后的那個分片時(NALU 的分片在后面講述),M位置 1。其余情況下M 位保持為 0。?
????? ?PT:載荷類型,7 位。對于H.264 視頻格式,當前并沒有規定一個默認的PT 值。因此選用大于 95 的值可以。此處設為0x60(十進制96)。
????? SQ:序號,16 位。序號的起始值為隨機值,此處設為 0,每發送一個RTP 數據包,序號值加 1。
????? TS:時間戳,32 位。同序號一樣,時間戳的起始值也為隨機值,此處設為0。根據RFC3984, 與時間戳相應的時鐘頻率必須為90000HZ。
?? ?? SSRC:同步源標示,32 位。SSRC應該被隨機生成,以使在同一個RTP會話期中沒有任何兩個同步源具有相同的SSRC 識別符。此處僅有一個同步源,因此將其設為0x12345678。
????? 對于每一個NALU,根據其包含的數據量的不同,其大小也有差異。在IP網絡中,當要傳輸的IP 報文大小超過最大傳輸單元MTU(Maximum Transmission Unit )時就會產生IP分片情況。在以太網環境中可傳輸的最大 IP 報文(MTU)的大小為 1500 字節。如果發送的IP數據包大于MTU,數據包就會被拆開來傳送,這樣就會產生很多數據包碎片,增加丟包率,降低網絡速度。對于視頻傳輸而言,若RTP 包大于MTU 而由底層協議任意拆包,可能會導致接收端播放器的延時播放甚至無法正常播放。因此對于大于MTU 的NALU 單元,必須進行拆包處理。
RFC3984 給出了3 中不同的RTP 打包方案:
(1)Single NALU Packet:在一個RTP 包中只封裝一個NALU,在本文中對于小于 1400字節的NALU 便采用這種打包方案。
?????? (2)Aggregation Packet:在一個RTP 包中封裝多個NALU,對于較小的NALU 可以采用這種打包方案,從而提高傳輸效率。
????? ?(3)Fragmentation Unit:一個NALU 封裝在多個RTP包中,在本文中,對于大于1400字節的NALU 便采用這種方案進行拆包處理。
4.? H.264 流媒體傳輸系統的實現
?????? 一個完整的流媒體傳輸系統包含服務器端和客戶端兩個部分[5][6]。對于服務器端,其主要任務是讀取H.264 視頻,從碼流中分離出每個NALU 單元,分析NALU 的類型,設置相應的 RTP?包頭,封裝 RTP?數據包并發送。而對于客戶端來說,其主要任務則是接收 RTP數據包,從RTP 包中解析出NALU 單元,然后送至*進行解碼播放。該流媒體傳輸系統的框架如圖3 所示。


????????????????????????????????????????????????????????????????????????????????????????????????
5.?結論
本文所設計的流媒體傳輸系統服務器端運行在Windows XP 系統,用VLC 播放器作為客戶端接收H.264 視頻RTP 數據包。經測試,客戶端在經過2 秒的緩沖過后即能流暢播放,傳輸速度設為 30 幀每秒的情況下,未出現丟包拖影等現象,視頻主觀質量良好,與本地播放該H.264 視頻無明顯區別。
AnyChat采用國際領先的視頻編碼標準H.264(MPEG-4 part 10 AVC /H.264)編碼,H.264/AVC 在壓縮效率方面有著特殊的表現,一般情況下達到 MPEG-2 及 MPEG-4 簡化類壓縮效率的大約 2 倍。H.264具有許多與舊標準不同的新功能,它們一起實現了編碼效率的提高。特別是在幀內預測與編碼、幀間預測與編碼、可變矢量塊大小、四分之一像素運動估計、多參考幀預測、自適應環路去塊濾波器、整數變換、量化與變換系數掃描、熵編碼、加權預測等實現上都有其獨特的考慮。

?佰銳科技采用先進去馬賽克技術,保障在視頻通訊過程中不出現花屏、馬賽克等現象。免費測試下載地址:
http://www2.bairuitech.com/downloads/bairuisoft/AnyChatCoreSDK_V3.0.rar


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/254906.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/254906.shtml
英文地址,請注明出處:http://en.pswp.cn/news/254906.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

機器人網首頁應用實例工業自動化 EtherCAT 技術在庫卡機器人控制系統上的應用

自 2010 年以來,庫卡一直采用 EtherCAT 技術作為所有庫卡機器人控制系統中的系統總線。最新的 KR AGILUS 機器人和 LBR iiwa 輕型機器人的緊湊型控制器也是在 EtherCAT 基礎上實施的。Beckhoff 基于工業以太網的 EtherCAT因而可以作為整個當前庫卡控制系統范圍內的…

KVM虛擬機共享存儲動態遷移與冷遷移

運行環境一、 配置nfs共享服務器二、 配置KVM虛擬化三、 創建橋接網卡四、 配置kvm服務器并實現動態遷移五、 配置冷遷移運行環境KVM虛擬機兩臺(linux 7.4)IP地址:192.168.80.100(KVM01)IP地址:192.168.80.…

HALCON示例程序surface_scratch.hdev提取劃痕

小哥哥小姐姐覺得有用點個贊唄! HALCON示例程序surface_scratch.hdev提取劃痕 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_update_off () dev_close_window () read_image (Image, ‘surface_scratch’) get_image_size (Image, Width…

MySQL--SQL中的安全問題

---恢復內容開始--- 1) SQL 注入簡介 SQL 注入(SQL Injection) 就是利用某些數據庫的外部接口將用戶數據插入到實際的數據庫操作語言(SQL)當中,從而達到入侵數據庫乃至操作系統的目的。他的產生主要是由程序對用戶輸入的數據沒有進行嚴格的過濾,導致非法…

伺服驅動器的 三環控制 電流環 速度環 位置環

運動伺服一般都是三環控制系統,從內到外依次是電流環速度環位置環。 1、電流環:電流環的輸入是速度環PID調節后的那個輸出,我們稱為“電流環給定”吧,然后呢就是電流環的這個給定和“電流環的反饋”值進行比較后的差值在電流環內做…

理解LSTM/RNN中的Attention機制

轉自:http://www.jeyzhang.com/understand-attention-in-rnn.html,感謝分享! 導讀 目前采用編碼器-解碼器 (Encode-Decode) 結構的模型非常熱門,是因為它在許多領域較其他的傳統模型方法都取得了更好的結果。這種結構的模型通常將…

linux下基于jrtplib庫的實時傳送實現

linux 下基于jrtplib庫的實時傳送實現一、RTP 是進行實時流媒體傳輸的標準協議和關鍵技術實時傳輸協議(Real-time Transport Protocol,PRT)是在 Internet 上處理多媒體數據流的一種網絡協議,利用它能夠在一對一(unicas…

[BZOJ2326] [HNOI2011] 數學作業 (矩陣乘法)

Description Input Output Sample Input Sample Output HINT Source Solution 遞推式長這樣:$f[n]f[n-1]*10^kn$ 對于每一段位數個數相同的$n$(如$10\sim99,100\sim999,23333\sim66666,1018701389\sim2147483647$),$k$是個定值 然…

HALCON示例程序texture.hdev檢測樹木

小哥哥小姐姐覺得有用點個贊唄! HALCON示例程序texture.hdev檢測樹木 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_close_window () Interactive : 0 dev_close_window () read_image (MreutHill, ‘mreut_y’) get_image_size (MreutH…

1、python基礎速成

基礎模塊 def prt(age,name):#函數定義 print("%s is %d 年齡 old"%(name,age)) if __name__"__main__":#程序入口 print("Hello World") prt(45,"gaici") 獲取輸入:使用input()函數 nameinput("you name &#x…

老男孩博客園楊海潮MySQL--MySQL機構邏輯2

轉載于:https://blog.51cto.com/yanfeilai528/2103403

法國標致雪鐵龍汽車公司采用通快碟片激光器進行焊接

發布日期:2011-10-14 來源:光電新聞網 發布人:星之球科技 摘要:3月11日消息,十一個碟片激光器(disk laser)將安裝在標致雪鐵龍集團的工廠,這家法國汽車制造商準備使用4千瓦的激光器…

h.264 rtp打包

(2011-05-27 08:44:13) 轉載標簽: 雜談 payload,H.264 RTP payload 格式 on 2011-2-18 in 博文摘選 | 0 Comment 1. 網絡抽象層單元類型 (NALU) NALU 頭由一個字節組成, 它的語法如下: --------------- |0|1|2|3|4|5|6|7| -------- |F|NRI| Type | --------------…

jquery live hover綁定方法

$(".select_item span").live({mouseenter:function(){$(this).addClass("hover");},mouseleave:function(){$(this).removeClass("hover");} }); 注意:jquery1.9以上版本不支持live,新方法為on 轉載于:https://www.cnblo…

HALCON示例程序vessel.hdev血管的分割與測量

小哥哥小姐姐覺得有用點個贊唄! HALCON示例程序vessel.hdev血管的分割與測量 示例程序源碼(加注釋) 關于顯示類函數解釋 dev_update_window (‘off’) dev_close_window () dev_open_window (0, 0, 512, 512, ‘black’, WindowID) set_d…

電子凸輪

CAM功能是按照一種人為預先設定的曲線關系(可以在線修改,對SEW的變頻/伺服控制器而言)來運動的控制應用。 100%速度前饋的位置控制這個觀點偶不敢茍同.典型的一些應用。比如:全自動包裝機械上,移動鋸,其實大家說的電子齒輪,指的就是一種可以調節主從速度比的同步應用…

浙南聯合訓練賽20180414

這次題目的代碼都不長,CF的一貫風格 A - Game CodeForces - 513A Two players play a simple game. Each player is provided with a box with balls. First players box contains exactly n1 balls and second players box contains exactly n2balls. In one move…

原生JS實現蘋果菜單

今天分享下用原生JS實現蘋果菜單效果,這個效果的重點有以下幾點 圖標中心點到鼠標的距離的算法 利用比例計算圖標的寬度 代碼地址:https://github.com/peng666/blogs/blob/gh-pages/menus/index.html 在線測試地址:http://peng666.github.io/…

Gym 100090D Insomnia

從 n 變到 1&#xff0c;有多少種方案&#xff1f; 打表記憶化。 1 #include <bits/stdc.h>2 3 using namespace std;4 5 int n;6 int dp[1000005];7 int dfs(int n) {8 if(n1)9 return 1; 10 if(dp[n]>0) 11 return dp[n]; 12 int cnt0;…

halcon rectangle1_domain縮減圖像域為矩形

目錄rectangle1_domain&#xff08;算子&#xff09;描述參數rectangle1_domain&#xff08;算子&#xff09; rectangle1_domain - 將圖像的域縮小為矩形。 rectangle1_domain&#xff08;Image&#xff1a;ImageReduced&#xff1a;Row1&#xff0c;Column1&#xff0c;Row…