天天看点

音视频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是基于此种单位的数值计算

继续阅读