關于RTP時間戳及多媒體通信同步的問題/H264關于RTP協議的實現

http://www.rosoo.net/a/201101/10776.html

http://hi.baidu.com/fairygardenjoy/blog/item/e56c5cca95829e37b600c88e.html

H264關于RTP協議的實現:http://www.rosoo.net/a/201108/14896.html

RTP協議包頭的格式:

10~16 Bit為PT域,指的就是負載類型(PayLoad),負載類型定義了RTP負載的格式,協議原文說該域由具體應用決定其解釋。

目前,負載類型主要用來告訴接收端(或者播放器)傳輸的是哪種類型的媒體(例如G.729,H.264,MPEG-4等),這樣接收端(或者播放器)才知道了數據流的格式,才會調用適當的編解碼器去解碼或者播放,這就是負載類型的主要作用。

就ORTP庫而言,負載類型定義如下:

?

每一種負載類型都有著其獨特的參數,這里基本上涵蓋了當前主流的一些媒體類型,例如pcmu 、g.729、h.263(很奇怪,竟然沒有定義h.264)、mpeg-4等等。Jrtplib庫應該也有相類似的定義,你可以去找找源碼,在此我就不再贅述了。

?

在ORTP庫和JRTplib庫中,都提供了設置RTP負載類型的函數,千萬要記得根據實際的應用進行設置,我就是當時沒有注意,使用ORTP默認的pcmu音頻的負載類型,傳輸H.264編碼的視頻數據,結果傳輸中一直有問題,困擾我好久好久。

好了,再說說RTP的時間戳吧。

?

基本概念:

時間戳單位:時間戳計算的單位不是秒之類的單位,而是由采樣頻率所代替的單位,這樣做的目的就是為了是時間戳單位更為精準。比如說一個音頻的采樣頻率為8000Hz,那么我們可以把時間戳單位設為1 / 8000。

時間戳增量:相鄰兩個RTP包之間的時間差(以時間戳單位為基準)。

采樣頻率: 每秒鐘抽取樣本的次數,例如音頻的采樣率一般為8000Hz

幀率: 每秒傳輸或者顯示幀數,例如25f/s

?

?

再看看RTP時間戳課本中的定義:

RTP包頭的第2個32Bit即為RTP包的時間戳,Time Stamp ,占32位。

時間戳反映了RTP分組中的數據的第一個字節的采樣時刻。在一次會話開始時的時間戳初值也是隨機選擇的。即使是沒有信號發送時,時間戳的數值也要隨時間不斷的增加。接收端使用時間戳可準確知道應當在什么時間還原哪一個數據塊,從而消除傳輸中的抖動時間戳還可用來使視頻應用中聲音和圖像同步

在RTP協議中并沒有規定時間戳的粒度,這取決于有效載荷的類型。因此RTP的時間戳又稱為媒體時間戳,以強調這種時間戳的粒度取決于信號的類型。例如,對于8kHz采樣的話音信號,若每隔20ms構成一個數據塊,則一個數據塊中包含有160個樣本(0.02×8000=160)。因此每發送一個RTP分組,其時間戳的值就增加160

官方的解釋看懂沒?沒看懂?沒關系,我剛開始也沒看懂,那就聽我的解釋吧。

首先,時間戳就是一個值,用來反映某個數據塊的產生(采集)時間點的,后采集的數據塊的時間戳肯定是大于先采集的數據塊的。有了這樣一個時間戳,就可以標記數據塊的先后順序。

第二,在實時流傳輸中,數據采集后立刻傳遞到RTP模塊進行發送,那么,其實,數據塊的采集時間戳就直接作為RTP包的時間戳。

第三,如果用RTP來傳輸固定的文件,則這個時間戳就是讀文件的時間點,依次遞增。這個不再我們當前的討論范圍內,暫時不考慮。

第四時間戳的單位采用的是采樣頻率的倒數,例如采樣頻率為8000Hz時,時間戳的單位為1 / 8000 ,在Jrtplib庫中,有設置時間戳單位的函數接口,而ORTP庫中根據負載類型直接給定了時間戳的單位(音頻負載1/8000,視頻負載1/90000)

第五時間戳增量是指兩個RTP包之間的時間間隔,詳細點說,就是發送第二個RTP包相距發送第一個RTP包時的時間間隔單位是時間戳單位)。

如果采樣頻率為90000Hz,則由上面討論可知,時間戳單位為1/90000,我們就假設1s鐘被劃分了90000個時間塊,那么,如果每秒發送25幀,那么,每一個幀的發送占多少個時間塊呢?當然是 90000/25 = 3600。因此,我們根據定義“時間戳增量是發送第二個RTP包相距發送第一個RTP包時的時間間隔”,故時間戳增量應該為3600

在Jrtplib中好像不需要自己管理時間戳的遞增,由庫內部管理。但在ORTP中每次數據的發送都需要自己傳入時間戳的值,即自己需要每次發完一個RTP包后,累加時間戳增量,不是很方便,這就需要自己對RTP的時間戳有比較深刻地理解,我剛開始就是因為沒搞清楚,隨時設置時間戳增量導致傳輸一直有問題,困擾我好久。

?

===========================================================================

?

在使用JRTPLIB的發送數據的時候需要設置時間戳單位(timestamp)和時間戳增量(timestampincrement)。看了網上一些文章,細細想來現在才想通這個問題。???
????????? RFC3550對時間戳的描述是:

??????? 時間戳(timestamp) 32比特 時間戳反映了RTP數據包中第一個字節的采樣時間。(采樣時鐘必須來源于一個及時的單調、線性遞增時鐘,以便允許同步和去除網絡引起的數據包抖動(見章節6.4.1)。該時鐘的分辨率必須滿足理想的同步精度和測量數據包到來時的抖動的需要(一種典型的時鐘分辨率不滿足情況是每個視頻幀僅一個時鐘周期)時鐘頻率依賴于負載數據的格式,并在描述文件(profile)中或者是在負載格式描述中(payload format speci_cation)進行靜態描述。也可以通過非RTP方法(non-RTP means)對負載格式動態描述。

?????? 如果RTP包是周期性產生的,那么將使用由采樣時鐘決定的名義上的采樣時刻,而不是讀取系統時間。例如,對一個固定速率的音頻,采樣時鐘(時間戳時鐘)將在每個周期內增加1。如果一個音頻從輸入設備中讀取含有160個采樣周期的塊,那么對每個塊,時間戳的值增加160,而不考慮該塊是否用一個包傳遞或是被丟棄。

??????? 時間戳的初始值應當是隨機的,就像序號一樣。幾個連續的RTP包如果(邏輯上)是同時產生的,如:屬于同一個視頻幀的RTP包,將有相同的序列號。如果數據并不是以它采樣的順序進行傳輸,那么連續的RTP包可以包含不是單調遞增(或遞減)的時間戳(RTP包的序列號仍然是單調變化的)。

??
根據一些文章我自己推敲了一下幾個概念如下:???
?????? 時間戳單位:時間戳計算的單位不為秒之類的單位,而是由采樣頻率所代替的單位,這樣做的目的就是為了是時間戳單位更為精準。比如說一個音頻的采樣頻率為8000HZ,那么我們可以把時間戳單位設為1/8000。
?????? 時間戳增量:相鄰兩個RTP包之間的時間差(以時間戳單位為基準)。

?????? 如何設定時間戳之間的增量呢?
?????? 按照剛才時間戳單位來看,1秒鐘按照時間戳單位就是8000,那么一秒鐘如果可以播放20幀,也就是發送30幀(幀率),那么可以求出相鄰兩幀之間的時間差,也就是時間戳增量,那么顯而易見是用8000/20,那么這個時間戳增量就為400.
?????? 網上大多數列舉的一個例子是:例如MPEG,每幀20ms,采樣頻率8000Hz,設定時間戳單位1/8000,而每個包之間就是160的增量
????這里又該如何理解呢?可以輕易地看出增量是直接8000與20ms相乘的結果,我們可以知道這里兩幀之間的時間為20ms,也就是0.02s,這個單位是以秒來衡量的,那么我們要用時間戳單位來表示那么就是8000*0.02=160.所以時間戳增量為160.

??????? 還有一點為什么一般都用90000作為視頻采樣頻率呢?
??????? 90k是用于視頻同步的時間尺度(TimeScale),就是每秒90k個時鐘tick。為什么采用90k呢?目前視頻的幀速率主要有25fps、29.97fps、30fps等,而90k剛好是它們的倍數,所以就采用了90k。

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

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

相關文章

程序員懂點經濟學-股票投資

2019獨角獸企業重金招聘Python工程師標準>>> ▍寫在前面 前面有文章 關于程序員如何賺點小錢 講過 合理的投資理財,可以了解一下. 再次建議,不要將全身家當投入股市,建議投入10~30%就好了. (不要拿輸不起的錢來炒股,比…

徹底弄懂響應式設計中的em和rem

前一陣子在響應式開發中遇到了em和rem的問題,也上網搜過一些文章,篇幅很長,也沒有仔細看,今天來總結一下。 rem是指:根元素(root element,html)的字體大小, em是指&#…

JAVA字符串

字符串 1. 字符串 1.1 字符串概述和特點 java.lang.String類代表字符串。 API當中說:Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實例實現。 其實就是說:程序當中所有的雙引號字符串,都是String類…

21分鐘 MySQL 入門教程

轉自 21分鐘 MySQL 入門教程 一、MySQL的相關概念介紹二、Windows下MySQL的配置配置步驟MySQL服務的啟動、停止與卸載三、MySQL腳本的基本組成四、MySQL中的數據類型五、使用MySQL數據庫登錄到MySQL創建一個數據庫選擇所要操作的數據庫創建數據庫表六、操作MySQL數據庫向表中插…

node-sass報錯解決方法

node-sass報錯解決方法 node-sass報錯解決方法 在Vue.js中,每一個vue文件都是一個組件,在.vue文件中可以將模板,腳本,樣式寫在一起,便于組織整個組件。在使用template,script時,編寫css樣式時&a…

微軟人工智能愿景:根植于研發 寄望于“對話”

過去25年來,微軟公司持續投入人工智能的發展愿景。現在,借助全新發布的聊天機器人Zo、Cortana Decices SDK和智能套件、以及擴展智能工具,這一愿景即將成為現實。12月13日,在舊金山的一次小聚會上,微軟全球執行副總裁、…

H264 TS/ES

http://blog.csdn.net/heanyu/article/details/6229724

Java中Semaphore(信號量) 數據庫連接池

計數信號量用來控制同時訪問某個特定資源的操作數或同時執行某個指定操作的數量 A counting semaphore.Conceptually, a semaphore maintains a set of permits. Each acquire blocks if necessary until a permit is available, and then takes it. Each release adds a permi…

Visual Studio for Mac Preview離線下載安裝

Visual Studio for Mac離線下載安裝。 環境:OS X EI Caption 10.11.2 .NET Core SDK 1.1 需預先安裝 .NET Core 1.1 SDK macOS版下載地址:https://go.microsoft.com/fwlink/?LinkID835011 安裝SDK需先安裝openssl。 brew update brew install openssl mkdir -p /us…

LOAM_velodyne學習(一)

在研讀了論文及開源代碼后,對LOAM的一些理解做一個整理。 文章:Low-drift and real-time lidar odometry and mapping 開源代碼:https://github.com/daobilige-su/loam_velodyne 系統概述 LOAM的整體思想就是將復雜的SLAM問題分為&#x…

實戰Vue簡易項目(2)定制開發環境

本章內容包含上一章思考的解決,還有一些其它的定制... CSS預處理 關于對.vue文件模塊處理規則的配置依次可在build/webpack.base.conf.js->build/vue-loader.conf.js->build/utils.js文件中跟蹤; 而loaders的關鍵在于build/vue-loader.conf.js文件…

LINUX framebuffer

http://wangshh03.blog.163.com/blog/static/49103415201001231317484/ 一、FrameBuffer的原理 FrameBuffer 是出現在 2.2.xx 內核當中的一種驅動程序接口。 Linux是工作在保護模式下,所以用戶態進程是無法象DOS那樣使用顯卡BIOS里提供的中斷調用來實現直接寫屏&…

[POI2007]POW-The Flood

題目描述 給定一張地勢圖,所有的點都被水淹沒,現在有一些關鍵點,要求放最少的水泵使所有關鍵點的水都被抽干 輸入輸出格式 輸入格式: In the first line of the standard input there are two integers and , separated by a sin…

LOAM_velodyne學習(二)

LaserOdometry 這一模塊(節點)主要功能是:進行點云數據配準,完成運動估計 利用ScanRegistration中提取到的特征點,建立相鄰時間點云數據之間的關聯,由此推斷lidar的運動。我們依舊從主函數開始&#xff1…

戶外穿越

晚上很早就睡了,并且,太過激動,所以早上四點五十分就被驚醒,然后到早上鬧鐘響。 早上匆匆忙吃過早餐,就趕去坐車,到登山之前,坐了大巴車,又坐了景區的車,景區的路是山路十…

【oracle】關于創建表時用default指定默認值的坑

剛開始學create table的時候沒注意,學到后面發現可以指定默認值。于是寫了如下語句: 當我查詢的時候發現,查出來的結果是這樣的。。 很納悶有沒有,我明明指定默認值了呀,為什么創建出來的表還是空的呢?又跑…

Makefile中用宏定義進行條件編譯(gcc -D)/在Makefile中進行宏定義-D

在源代碼里面如果這樣是定義的: #ifdef MACRONAME //可選代碼 #endif 那在makefile里面 gcc -D MACRONAMEMACRODEF 或者 gcc -D MACRONAME 這樣就定義了預處理宏,編譯的時候可選代碼就會被編譯進去了。 對于GCC編譯器,有如下選項&…

python安裝與配置

首先下載python地址: https://www.python.org/downloads/release/python-361/下載頁面中有多個版本: web-based installer 是需要通過聯網完成安裝的 executable installer 是可執行文件(*.exe)方式安裝 embeddable zip file 嵌入式版本,可…

[OpenGL ES 03]3D變換:模型,視圖,投影與Viewport

[OpenGL ES 03]3D變換:模型,視圖,投影與Viewport 羅朝輝 (http://blog.csdn.net/kesalin) 本文遵循“署名-非商業用途-保持一致”創作公用協議 系列文章:[OpenGL ES 01]OpenGL ES之初體驗[OpenGL ES 02]OpenGL ES渲染管線與著色器…

LOAM_velodyne學習(三)

終于到第三個模塊了,我們先來回顧下之前的工作:點云數據進來后,經過前兩個節點的處理可以完成一個完整但粗糙的里程計,可以概略地估計出Lidar的相對運動。如果不受任何測量噪聲的影響,這個運動估計的結果足夠精確&…