设置pts
Pts的设置是根据timestamp和rtcp的ntp time设置的,在函数finalize_packet()内设置。跟ntp time挂钩是音视频同步的基础。
基本上可以认为timestamp的变化值就是pts的变化值,在没有B frame 时25fps 就是3600递增, 29.97fps 是3003 递增。存在B frame 时 timestamp 值 不是线性增加。
1 | /** |
其中的s->st->time_base.den = 90000 / 44100 等, s->st->time_base.num = 1。
设置dts
Dts的值是从pts的值里面选择的,在没有B帧时设置成和pts一样;
有B frame存在时,根据B frame num , 缓存相应B frame num个数加1的pts, 缓存的pts按从小到大排列。然后从数组0位置取出来当dts。
1 | delay = st->internal->avctx->has_b_frames; |