时间戳
时间戳分为解码时间戳(DTS)和显示时间戳(PTS) 分别表示某一帧解码和显示相对于起始时间的时间戳
通常来说视频不带B帧的情况下 视频的DTS和PTS相同
带B帧的情况下 由于B帧是前后双向参考编码
B帧的解码时间戳可能会晚于它的显示时间戳 这种情况下DTS和PTS不同
音频的DTS和PTS则始终相同
时间戳的计算
计算时间戳时涉及到几个概念
- 采样频率 : 表示时间戳的增量单位
采样频率假设为1000HZ 则表示一秒采样100次 时间戳的单位就是1ms 也即是时间基
设为90000HZ 则表示一秒采样90000次 时间戳的增量等于1/90ms
这里的采样频率指的是时间戳的采样频率 和音频的采样频率概念不同 - 帧率 : 视频一秒的显示帧数
常见的有25fps 30fps 60fps这些帧率 - 音频采样频率 : 音频一秒的采样次数
- 音频采样数 : 某种音频格式一帧的采样次数
比如一帧AAC包含1024次采样的数据 也就是1k字节的数据
一帧mp3则包含1152次采样的数据
视频时间戳的计算
视频时间戳计算公式 : video_ts = n * ts_freq / fps;
n : 第n帧视频
ts_freq : 选定的时间戳的采样频率
fps : 视频帧率
- 计算时间戳首先需要选定采样频率从而计算出时间基
ffmpeg选择的时间基是1000 所以ffmpeg的时间戳单位是ms(1s=1000ms)
RTP则规定视频的时间基必须是90000 这么做是为了兼容25fps 29.97fps 30fps这些帧率
90000恰好是25,30,60fps的倍数 - 时间戳的增量确定后 比如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 : 音频的采样频率
- 音频的时间戳采样频率一般选1000
- 音频帧的播放时间=一个AAC帧对应的采样样本的个数/采样频率(单位为s)
网友评论