談談RTP傳輸中的負載類型和時間戳
轉載自:http://ticktick.blog.51cto.com/823160/350142 首先,時間戳就是一個值,用來反映某個數據塊的產生(采集)時間點的,后采集的數據塊的時間戳肯定是大于先采集的數據塊的。有了這樣一個時間戳,就可以標記數據塊的先后順序。
第二,在實時流傳輸中,數據采集后立刻傳遞到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。
第二,在實時流傳輸中,數據采集后立刻傳遞到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。
【補充】:最近思考了一下,又有了新的體會和解釋,可能對大家更容易地去理解這個時間戳增量會有所幫助,補充在下面吧:
其實,網絡發送重點關注的是流量的平衡,即均勻地利用網絡帶寬,為了實現這一點,需要滿足:數據采集的速率與數據網絡傳輸的速率盡量保持一致。時間戳增量的設置影響的是RTP包的網絡傳輸的速率,時間戳增量越小,發送速度越快。
下面再進一步解釋一下時間戳增量是怎么計算出來的:
對于PAL制式的視頻而言,每秒攝像頭會采集 25 幀 數據,那么,每采集到 1幀 耗時 1/25 s ,如果我們設計為1個RTP包只包含1幀數據,并且一次發送1幀,那么,要想網絡流量均勻,則時間戳增量應該設計為 1/25 s . 而在一般的RTP協議的實現中,時間戳單位不是 秒(s),而約定為采樣頻率的倒數,由于一般視頻的采樣頻率是 90000,故時間戳單位為 1/90000 s,因此,實際的時間戳增量 = 時間戳增量 ( 1/25 s ) / 時間戳單位(1/90000 s) = 3600
在Jrtplib中好像不需要自己管理時間戳的遞增,由庫內部管理。但在ORTP中每次數據的發送都需要自己傳入時間戳的值,即自己需要每次發完一個RTP包后,累加時間戳增量,不是很方便,這就需要自己對RTP的時間戳有比較深刻地理解,我剛開始就是因為沒搞清楚,隨時設置時間戳增量導致傳輸一直有問題,困擾我好久。



