H264關于RTP協議的實現

??????? 完整的C/S架構的基于RTP/RTCP的H.264視頻傳輸方案。此方案中,在服務器端和客戶端分別進行了功能模塊設計服務器端:RTP封裝模塊主要是對H.264碼流進行打包封裝;RTCP分析模塊負責產牛和發送RTCP包并分析接收到的RTCP包;QoS反饋控制模塊則根據RR報文反饋信息動態的對發送速率進行調整;發送緩沖模塊則設置端口發送RTP、RTCP包。客戶端:RTP模塊對接收到的RTP包進行解析判斷;RTCP模塊根據SR報文統計關鍵信息,產牛并發送RR包。然后,在VC++6.0下用Socket編程,完成基于RTP/UDP/IP的H.264視頻傳輸,并在局域網內運行較好。

基于RTP/UDP/lP的H.264視頻傳輸結構設計

??????? 對于H.264視頻的實時傳輸應用來說,TCP的重傳機制引入的時延和抖動是無法容忍的,因此我們采用UDP傳輸協議。但是UDP協議本身是面向無連接的,不能提供質量保證。而基于UDP之上的高層協議RTP/RTCP可以一起提供流量控制和擁塞控制服務。圖給出了基于RTP/UDP/IP的H.264視頻傳輸的框架。

??

H.264視頻流的RTP封裝策略

??????? 從圖4—1可以看出,H.264視頻數據首先經RTP進行封裝,打包成適合網絡傳輸的數據包才能進行傳輸。所以,如何設計合適的RTP封裝策略對H.264視頻數據進行封裝是十分重要的。一般來說,在H.264中,RTP封裝應該遵循幾個設計原則:
1、較低的開銷,因此MTU的尺寸應該限制在100—64K字節范圍內。
2、易于區分分組的重要性,而不必對分組內的數據解碼。
3、應能檢測到數據的類型,而不需解碼整個數據流,并能根據編碼流之間的相關性丟棄無用數據,如網關應能檢測A型分割的丟失,并能丟棄相應的B型和C型分割。

4、應支持將一個NALU拆分為若干個RTP包:不同大小的輸入圖片決定了NALU的長度可能會大于MTU,只有拆分后才會避免IP層在傳輸時出現分片。
5、支持將多個NALU匯集在一個RTP分組中,即在一個RTP包中傳輸超過一個NALU,當多個圖片的編碼輸出小于M1IU時就考慮此模式,以提高網絡傳輸效率。

RTP載荷封裝設計

???????? 本文的網絡傳輸是基于IP協議,所以最大傳輸單元(MTU)最大為1500字節,在使用IP/UDP/RTP的協議層次結構的時候,這其中包括至少20字節的IP頭8字節的UDP頭,以及12字節的RTP頭。這樣,頭信息至少要占用40個字節,那么RTP載荷的最大尺寸為1460字節。

????????? 一方面,如果每個IP分組都填滿1500字節,那么協議頭的開銷為2.7%,如果RTP載荷的長度為730字節,協議頭的開銷仍達到5.3%,而假設RTP載荷的長度不到40字節,那么將有50%的開銷用于頭部,這將對網絡造成嚴重資源浪費。另一方面,如果將要封裝進RTP載荷的數據大于1460字節,并且我們沒有在應用層數據裝載迸RTP包之前進行載荷分割,將會產生大于MTU的包。在IP層其將會被分割成幾個小于MTU尺寸的包,這樣將會無法檢測數據是否丟失。因為IP和UDP協議都沒有提供分組到達的檢測,如果分割后第一個包成功接收而后續的包丟失,由于只有第一個包中包含有完整的RTP頭信息,而RTP頭中沒有關于載荷長度的標識,因此判斷不出該RTP包是否有分割丟失,只能認為完整的接收了。并且在IP層的分割無法在應用層實現保護從而降低了非平等包含方案的效果。由于UDP數據分組小于64K字節,而且一個片的長度對某些應用場合來說有點太小,所以應用層的打包也是RTP打包機制的一個必要部分。最新的RFC3984標準中提供了針對H.246媒體流的RTP負載格式,主要有三種:
單個NAL單元分組、聚合分組、片分組。

NAL單元單一打包

將一個NAL單元封裝進一個包中,也就是說RTP負載中只包含一個NAL單元,NAL頭部兼作RTP頭部。RTP頭部類型即NAL單元類型1-23,如下圖所示:

NAL單元的重組
此分組類型用于將多個NAL單元聚合在一個RTP分組中。一些H.264的NAL單元的大小,如SEI NAL單元、參數集等都非常小,有些只有幾個字節,因此應該把它們組合到一個RTP包中,將會有利于減小頭標(RTP/UDP/IP)的開銷。目前存在著兩種類型聚合分組:

NAL單元的分割

將一個NAL單元分割,使用多個RTP分組進行傳輸。共有兩個類型FU—A和FU—B,單元類型中分別為28和29。根據IP層MTU的大小,對大尺寸的NALU必須要進行分割,可以在分別在兩個層次上進行分割:
1)視頻編碼層VCL上的分割

為了適應網絡MTU的尺寸,可以使用編碼器來選擇編碼Slice NALU的大小,從而使其提供較好的性能。一般是對編碼Slice的大小進行調整,使其小于1460字節,以免IP層的分割。


2)網絡提取層NAL上的分割
在網絡提取層上對NALU的分割主要是采用分片單元方案,H.264標準中提出了分割機制,可以使NAL單元的尺寸小于1460字節。注意:此方式是針對同一個NAL單元進行分割的,不適用于聚合分組。一個NAL單元采用分割分組后,每個RTP分組序列號依次遞增l,RTP時間戳相同且惟一。NAL單元的分割是RTP打包機制的一個重要環節,總結其分割機制主要有如下幾個特點:
①分割NALU時,是以RTP次序號升序進行傳輸。在序列號不循環的前提下,屬于前一幀圖像的所有圖像片包以及A/B/C數據分割包的序列號要小于后幀圖像中的圖像片及數據分割包的序列號。
②一個符號機制來標記一個分割的NALU是第一個還是最后一個NAL單元。
3.存在另外一個符號機制用來檢測是否有丟失的分塊。
④輔助增強信息包和頭信息包可以任意時間發送。
⑤同一幀圖像中的圖像片可以以任意順序發送,但是對于低時延要求的網絡系統,最好是以他們原始的編碼順序來發送。


1)單一時間聚合分組(STAP):包括單一時間聚合分組A(STAP—A)和單一時間聚合分組B(STAP—B),按時間戳進行組合,他們的NAL單元具有相同的時間戳,一般用于低延遲環境。STAP—ASTAP—B的單元類型分別為24和25。
2)多時間聚合分組(MTAP):包括16比特偏移多時間聚合分組(MTAPl6)和24比特偏移多時間聚合分組(MTAP24)不同時間戳也可以組合,一般用于高延遲的網絡環境,比如流媒體應用.它的打包方案相對復雜,但是大大增強了基于流媒體的H.264的性能。MTAPl6 MTAP24的單元類型分別為26和27。

RTP包的封裝流程設計

根據H.264NAL單元的分割重組的性質以及RTP打包規則,本文實行的對RTP打包的設計如下:
1、若接收到的NAL單元小于MAX—SIZE(此時MAX-sIZE為設定的最大傳輸單元),則對它進行單一打包,也就是將此NAL單元直接放進RTP包的載荷部分,生成一個RTP包。
2、若接收到的NAL單元大于MAx—SIZE字節,則對它進行分割,然后對分割后的NAL單元進行步驟1方式打包。分割方案如下:

其中Nsize是分割前的NAL單元大小,N是分割后NAL單元的大小K分割后的單元數。分割后最后一個單元的大小可能會小于N,這時必須使用RTP載荷填充是其同前面的分塊大小相同,此時RTP頭中的填充標識位值為1。

3、對SEI,參數集等小NAL單元重組,將它們合并到一個RTP包中。雖然步驟3中的重組方案可以減小IP/UDP/RTP頭部開銷,但是對于包丟失率比較高的網絡環境,這意味著一個RTP包的丟失可能會導致多片的丟失,往往一個片中就有一個P圖像,解碼后的視頻質量必然會嚴重下降。因此,在丟失率的網絡中可以采用NAL單元的重組方案,而在高丟失率的網絡環境中采用NAL單元重組時要進行有效的差錯控制.在本文中不使用重組方案。

RTP/RTCP包的封裝實現

RTP包封裝設計

RTcP包的封裝設計

??????? RTCP報文封裝在UDP數據報中進行傳輸,發送時使用比它所屬的RTP流的端口號大1的協議號(RTP使用偶數號,RTCP使用奇數號)。以下是RTCP頭部數據結構:


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

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

相關文章

華為數通HCIE面試題目解密系列之RSTP邊緣端口

以下是華為數通面試考試的一道真題,原題如下; 請舉例說明 stp 的 edge port 的作用,用在什么場景,并且使用 edge port 會碰到什么問題,怎么解決和防止? 提到邊緣端口,我們是在NP課程的交換部分第一次接觸&a…

VS2013 Pro版本密鑰

Visual Studio Professional 2013 KEY(密鑰): XDM3T-W3T3V-MGJWK-8BFVD-GVPKY 轉載于:https://www.cnblogs.com/Mysterious/p/5990358.html

Django:視圖和URL配置

一、視圖1.在mysite文件夾下。創建views.py文件(文件名稱沒有特別的要求);from django.http import HttpResponsedef hello(request):return HttpResponse("Hello world")2.改動mysite文件夾下的urls.py文件;from djang…

u-boot 詳細介紹 .

Bootloader 對于計算機系統來說,從開機上電到操作系統啟動需要一個引導過程。嵌入式Linux系統同樣離不開引導程序,這個引導程序就叫作Bootloader。6.1.1 Bootloader介紹Bootloader是在操作系統運行之前執行的一段小程序。通過這段小程序,我們…

apicloud使用指南

ApiCloud ApiCloud平臺介紹 ApiCloud首頁在線教程文檔ApiCloud是一個國內的Hybird APP平臺,提供Hybird APP一站式開發服務。可以將使用HTML、CSS和JS制作的應用直接編譯為能在安卓和IOS平臺上運行的APP。另外,其所提供的代碼托管和在線編譯服務&#xff…

halcon對光源打光不均勻進行平場矯正

* Image Acquisition 01: Code generated by Image Acquisition 01 *******預處理,生成RGB三通道的平場矯正的圖像 *1.繪制檢測ROI *2.對檢測的ROI進行平場矯正 *3.平場矯正方法采用均值對減方法 read_image (ImageWhite, C:/Users/Administrator/Desktop/平場矯正/…

一般面試題

1.瀏覽器訪問一個網頁的整個過程,附帶連接協議? 2.tcp和upd的區別? 3.tcp報頭? 4.網絡協議的7層和5層分別是什么? 5.ipv6的知識? 6.網絡分包? 7.求素數的改進方法?轉載于:https://ww…

Python 執行代碼的兩種方式

1、交互執行即黑屏命令行執行 優點:即時調時程序,調試方便 缺點:無法永久無法保存代碼 2、即文件存儲代碼執行Python代碼文件 優點:可以永久保存代碼 缺點:調試不方便轉載于:https://www.cnblogs.com/liuxiaowei/p/7163473.html

金屬圓柱求取傾斜角度

方法1: count_seconds (Seconds1)read_image (Image, 9_7750_f3d301de6764d94.jpg)get_image_size (Image, Width, Height)dev_open_window (0, 0, Width, Height, black, WindowHandle)dev_display (Image)rgb1_to_gray (Image, GrayImage)dev_display (GrayImage)…

編程開發之--java多線程學習總結(2)同步代碼塊

1、第一種解決辦法:同步代碼塊,關鍵字synchronized package com.lfy.ThreadsSynchronize;/*** 1、使用同步代碼塊* 語法:synchronized (同步鎖) {//需要同步操作的代碼 }同步鎖:為了保證每個線程都能正常的執行原子操作&a…

swift 隨機數

1.一行代碼生成隨機數 arc4random() 如果要生成一個生成在一定范圍內的隨機整數: func randomIn(#min: Int, max: Int) -> Int { return Int(arc4random()) % (max - min 1) min} 該方法會生成[min, max]范圍內的隨機整數轉載于:https://www.cnblogs.com/qiyiyifan/p/…

u-boot裁減

http://blog.csdn.net/menuconfig/article/details/2276078u-boot裁減的主要方法是通過刪除不需要的命令來減小可執行代碼體積。比如說,如果不需要網絡相關的功能,則可以將網絡相關的所有命令全部刪除,可以節約可觀的flash空間。一般u-boot的…

PhpStudy 升級 MySQL 版本到5.7

1:備份當前數據庫數據、 最好是導成 SQL 文件2:備份 PhpStudy 下的 MySQL 文件夾、以防升級失敗、還可以使用舊版本的數據庫3:下載MySQL5.7、解壓、然后放在 PhpStudy 下的 MySQL 文件夾下地址:https://dev.mysql.com/downloads/f…

使用直線標定板進行相機畸變校正,并且進行9點標定(halcon)

直線標定板圖片: 機械吸頭位置圖片: 處理代碼 read_image (Image, 直線標定板圖片/Left201118140641772.bmp) get_image_size (Image, Width, Height) dev_close_window () dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle) dev_display…

github設置添加SSH

很多朋友在用github管理項目的時候,都是直接使用https url克隆到本地,當然也有有些人使用 SSH url 克隆到本地。然而,為什么絕大多數人會使用https url克隆呢? 這是因為,使用https url克隆對初學者來說會比較方便&…

linux設置套接字緩沖區的大小

系統提供的socket緩沖區大小為8K,你可以將之設置為64K,尤其在傳輸實時視頻時。 socket發送數據時候先把數據發送到socket緩沖區中,之后接受函數再從緩沖區中取數據,如果發送端特別快的時候,緩沖區很快就被填滿&#x…

【Java MyBatis Generator】使用generator自動生成Dao,Mapping和實體文件

具體請參照&#xff1a; http://blog.csdn.net/fengshizty/article/details/43086833 按照上面博客地址&#xff0c;下載Generator的依賴包&#xff1a; 如下是我的配置文件&#xff1a; 1 <?xml version"1.0" encoding"UTF-8"?>2 <!DOCTYPE ge…

h5移動端設備像素比dpr介紹

首先介紹一下概念 devicePixelRatio其實指的是window.devicePixelRatio window.devicePixelRatio是設備上物理像素和設備獨立像素(device-independent pixels (dips))的比例。 公式表示就是&#xff1a;window.devicePixelRatio 物理像素 / dips 好了&#xff0c;到了這里有出…

halcon直線標定板對相機標定的效果評估(對比矯正前后、對比標定板矯正效果)

原圖 程序源碼 * gen_caltab (7, 7, 0.0025, 1/2.5, GB025標定板.descr, GB025標定板.ps) * Calibration 01: Code generated by Calibration 01 * CameraParameters : [0.048105,-44.0585,8.31518e-006,8.3e-006,641.37,588.269,1280,1024] * CameraPose : [-0.000849522,-0.…

【QQ輸入法】QQ輸入法-剪切板 釋放內存

發現一個神奇的情況&#xff1a; 清除和關閉的操作&#xff1a; 1. 2.右鍵 3.點擊 4.清空 5.最后需要關閉 QQ輸入法的進程