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_framesi_max_ref1 变量的赋值,暂不考虑 bref)
posted @ 2025-04-01 15:17  重返科韵路  阅读(8)  评论(0)    收藏  举报