天天看點

音視訊pts計算

    • 視訊pts計算
    • 音頻pts計算
      • rtp時間戳
      • 檔案時間戳
    • 總結

視訊pts計算

  • PTS(Presentation Time Stamp):即顯示時間戳,這個時間戳用來告訴播放器該在什麼時候顯示這一幀的資料。
  • DTS(Decoding Time Stamp):即解碼時間戳,這個時間戳的意義在于告訴播放器該在什麼時候解碼這一幀的資料。

    需要注意的是:雖然 DTS、PTS 是用于指導播放端的行為,但它們是在編碼的時候由編碼器生成的。當視訊流中沒有 B 幀時,通常 DTS 和 PTS 的順序是一緻的。但如果有 B 幀時,就回到了我們前面說的問題:解碼順序和播放順序不一緻了。

    視訊pts是每幀遞增,假如fps是25幀的,時間基為fps的倒數1/25,那麼pts遞增+1即可。

//pts計算需要參考time_base, time_base代表的是時間機關,此處機關根據幀率,即25個機關一秒
      video_stream_->time_base = (AVRational) {, };

      //對應到每秒25幀,即每幀一個機關,故pts計算是每幀加1
      - 第一幀:pts=
      - 第二幀:pts=
      - 第三幀:pts=
      - 第n幀的pts = n * (( / timbase)/ fps);
      //算法即是通過time_base知道一秒有25個時間機關,幀率是25幀每秒,是以每個幀占一個時間機關
           

音頻pts計算

音頻有采樣率概念,8000,16000,32000, 44100, 48000 即每秒采樣多少次,有多少個樣本。
           

rtp時間戳

rtp中時間機關與采樣率一緻,以pcmu為例,每個rtp之間的時間相差160,每個rtp中pcmu長度為160.
如果是AAC,AAC的frame_size=1024,如果每幀一個包的話,每個rtp之間時間差為1024
           

檔案時間戳

//以8000采樣率示例,AAC編碼,s16,單音頻
   audio_stream_->time_base = (AVRational) { , };

   AAC nb_samples =   frame_size=

   即每秒有 / 個 AAC幀,每幀占用的時間機關根據tiem_base換算

   num = /

   每幀時間機關 pts = */num 

   pts = n * (( / timbase)/ num);
   pts = n * 
           

總結

  • 檔案中計算音視訊pts,都是根據每秒算出有多少個音視訊幀, 然後根據time_base,算出每幀占有多少個時間機關,即為pts內插補點
  • rtp傳輸中時間機關與采樣率一緻,傳輸多少個樣本即為增加多少時間
  • 重點了解time_base是一種度量機關,pts是基于此種機關的數值計算

繼續閱讀