原文連結:http://blog.csdn.net/yu_yuan_1314/article/details/8963673
RTP包中的時間戳記欄位是說明資料包時間的同步資訊,是資料能以正確的時間順序恢複的關鍵。時間戳記的值給出了分組中資料的第一個位元組的採樣時間。為了計算各個資料流的播放時間以及同步處理,僅有RTP包中的時間戳記資訊是不夠的。
在整個播放過程中,包括這樣幾種時間,1)RTP包中的rtp time
2)PLAY請求的Response中的rtp time和npt
3)RTCP的SR中的rtp和ntp時間戳記對
一、時間戳記映射關係
首先介紹PLAY請求的Response裡的兩個域:
(1)npt
npt顧名思義Normal PLay Time,正常播放時間,指出了流相對與播放開始時的絕對位置。播放開始時的之間定義為0.0s。這個特殊的常量now被定義為現場事件的當前時刻。“now”常數允許用戶端請求接收即時反饋而不是儲存或者延時的版本。因為對於這種情況而言,既沒有絕對時間,也沒有 0 時間,所以需要該參數。
(2)rtptime
rtptime是發送PLAY請求後將收到的第一個RTP包的時間戳記值。
npt和rtptime的區別在於npt是影片開始的相對時間,而rtptime是會話開始的相對時間。因此在client端,需要對這兩者進行map處理。
在client端計算播放時間戳記的公式如下:
nptUs = (current_rtpTime - start_rtptime) / scale + srart_npt;
其中:
start_rtptime與srart_npt分別是PLAY請求的Response中的rtptime和npt。
current_rtpTime是當前收到的RTP包頭中的rtp time。
scale為PLAY請求的Response中的scale值。在正常播放的情況下為1,快速播放時大於1,當處於反向掃描模式時小於-1.
二、媒體間同步方法
上面的處理僅僅實現了媒體內的同步,在實現媒體間同步時,還需要進行其他的處理工作。這就需要用到RTCP的SR。在SR中包含一個<rtp,ntp>時間戳記對,通過這個時間戳記對可以將音頻和視頻準確的定位到一個絕對時間軸上。
<rtp,ntp>時間戳記對的必要性在於不同流的 RTP 時間戳記有不同的隨機位移量,因此無法直接進行同步。
<rtp,ntp>中的ntp是網路時間協議格式表示的絕對時間值。
<rtp,ntp>中的rtp與資料包中的 RTP 時間戳記具有相同的單位和位移量,但在大多數情況下此時間戳記不等於任何臨近的 RTP 包中的時間戳記。
根據不同stream中的<rtp,ntp>時間戳記對,可以將一個stream中的時間戳記值對應為另一個stream的時間戳記值,從而實現媒體間的同步。