rtsp時間戳計算方法

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接:https://blog.csdn.net/lipku/article/details/17800651
Rtsp的拖放和快放、慢放都是先pause,再play,根據play消息包中的range和scale參數來實現。

對應到live555中,pause時調用sendPauseCommand函數。

Play時調用unsigned sendPlayCommand(MediaSubsession& subsession, responseHandler* responseHandler,double start = 0.0f, double end = -1.0f, float scale = 1.0f, Authenticator*authenticator = NULL),在該函數中可以設置start,end(對應range,以秒爲單位)和scale(對應快慢放)。

end設爲-1表示播放到文件結尾。

在pause後的resume播放時,start可以設爲-1,表示繼續從當前位置播放;

在seek時,start設爲拖放到的播放時間點(以秒爲單位)。

rtsp客戶端對於每個收到的rtp數據包,可以根據時間戳調用

doubleMediaSubsession::getNormalPlayTime(struct timeval const& presentationTime)獲得當前相對文件開始(從0起始)的播放時間(秒)。

該函數的計算公式爲:PlayStartTime+(currnpt-startnpt)*scale

PlayStartTIme:從收到服務器play應答中的range域中提取。

Currnpt:當前rtp包的時間戳

Startnpt:play後收到的第一個數據包的npt。

rtspserver中的rtp包時間戳實現:

每收到一個play請求後(seek和resume的play請求同樣如此),取當前時間作爲時間戳。以後每個數據包的時間戳計算公式爲:play後第一個包的時間戳+當前包與第一個包在文件中的相對時間間隔。

注意在Play的響應包中音視頻的seq和rtptime分別要取pause時的值,否則客戶端的時間條指示會不對。

在live555的rtspserver中,收到resume的play請求時(range域start爲-1),返回的應答包不會置range域start時間,導致客戶端提取PlayStartTIme爲0。爲了避免這種問題,客戶端在resume的play請求中最好置start爲當前播放時間,這樣其實類似於seek操作了。

在讀取文件結束時(音頻或視頻結束),構造RTCP  BYE包,通過RTCP通道往客戶端發送一個BYE包,客戶端會結束播放。

————————————————
版權聲明:本文爲CSDN博主「lipku」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/lipku/article/details/17800651

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章