音视频时间戳计算

时间戳

时间戳分为解码时间戳(DTS)和显示时间戳(PTS) 分别表示某一帧解码和显示相对于起始时间的时间戳
通常来说视频不带B帧的情况下 视频的DTS和PTS相同
带B帧的情况下 由于B帧是前后双向参考编码
B帧的解码时间戳可能会晚于它的显示时间戳 这种情况下DTS和PTS不同
音频的DTS和PTS则始终相同

时间戳的计算

计算时间戳时涉及到几个概念

  1. 采样频率 : 表示时间戳的增量单位
    采样频率假设为1000HZ 则表示一秒采样100次 时间戳的单位就是1ms 也即是时间基
    设为90000HZ 则表示一秒采样90000次 时间戳的增量等于1/90ms
    这里的采样频率指的是时间戳的采样频率 和音频的采样频率概念不同
  2. 帧率 : 视频一秒的显示帧数
    常见的有25fps 30fps 60fps这些帧率
  3. 音频采样频率 : 音频一秒的采样次数
  4. 音频采样数 : 某种音频格式一帧的采样次数
    比如一帧AAC包含1024次采样的数据 也就是1k字节的数据
    一帧mp3则包含1152次采样的数据

视频时间戳的计算

视频时间戳计算公式 : video_ts = n * ts_freq / fps;
n : 第n帧视频
ts_freq : 选定的时间戳的采样频率
fps : 视频帧率
  1. 计算时间戳首先需要选定采样频率从而计算出时间基
    ffmpeg选择的时间基是1000 所以ffmpeg的时间戳单位是ms(1s=1000ms)
    RTP则规定视频的时间基必须是90000 这么做是为了兼容25fps 29.97fps 30fps这些帧率
    90000恰好是25,30,60fps的倍数
  2. 时间戳的增量确定后 比如1000hz的采样频率对应增量1
    fps假设为25 那么一帧可以得到40ms的时间显示 时间戳的增量(上一帧和下一帧的间隔)
    就应该等于40 * 1 = 40ms

音频时间戳的计算

音频时间戳计算公式 : audio_ts = n * frame_size * ts_freq / sample_rate
n : 第n帧音频
ts_freq : 选定的时间戳的采样频率
frame_size : 一帧音频的采样数 也即是帧的大小
sample_rate : 音频的采样频率
  1. 音频的时间戳采样频率一般选1000
  2. 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)

你可能感兴趣的:(音视频时间戳计算)