x264 如何计算 dts
假设有如下含有 B 帧的序列 (按显示顺序排列): I B B B P
其 pts 等各值如下 (pts 由调用者输入):
I B B B P
pts: 0 1 2 3 4
现在对这个序列打 dts (最后一个 P 帧的的解码顺序一定是排第二个的,其余 B 帧解码顺序排在最后一个 P 帧之后):
I B B B P
pts: 0 1 2 3 4
dts: 0 2 3 4 1
可见,中间的几个 B 帧不满足 pts >= dts 的条件,改一下:
I B B B P
pts: 0 1 2 3 4
reordered_pts: 0 2 3 4 1
dts: -1 1 2 3 0
可见,这时是满足要求的:
dts = reordered_pts - 1
B B B P 序列在 x264 lookahead 模块中被称为一个 mini_gop 序列。
x264 需要在 lookahead 模块中对这个 mini_gop 序列中的 reordered_pts 赋予正确的值。这样正式编码阶段就能设置正确的 dts 值了。
另外还有一个注意点:
- 这里的 dts 计算公式只满足 B 帧后向参考一个 P 帧的情况,在 x264 中,默认最多后向参考一帧 (参看
i_num_reorder_frames和i_max_ref1变量的赋值,暂不考虑bref)

浙公网安备 33010602011771号