为何x264/x265编码器会忽略输入帧的PTS与DTS参数?
我之前在处理可变帧率摄像头编码时,也碰到过libx265无视自定义PTS/DTS的情况,结合你的场景,给你几个实际可行的排查和解决方向:
确保时间基准参数完全匹配
你设置了fpsNum=1000和fpsDenom=1(相当于以毫秒为时间基准的名义帧率),但还要同步配置编码器的时间基准:param->timebaseNum = 1; param->timebaseDenom = 1000;libx265的时间基准和帧率参数是关联的,如果只设置帧率不指定时间基准,编码器会用默认值(通常是和帧率对应的时间基准),导致输入帧的PTS/DTS和编码器内部基准不匹配,被自动忽略。
用官方API设置PTS/DTS,不要直接修改结构体
不要直接给x265_image_t的成员赋值,而是用libx265提供的API来设置:x265_image_setPts(img, calculated_pts); x265_image_setDts(img, calculated_dts);部分版本的libx265内部会对这些参数做封装校验,直接修改结构体成员可能不会被编码器识别。
开启可变帧率模式
libx265默认会强制对齐设置的帧率,当输入帧的实际帧率波动时,编码器会自动丢弃或重复帧,同时忽略自定义的时序参数。你需要明确告诉编码器处理可变帧率输入:param->rc.fpsMode = X265_FPS_MODE_VARIABLE;这个设置会让编码器尊重每帧的PTS/DTS,不再强制按固定帧率生成输出。
校验PTS/DTS的合理性
如果输入帧没有B帧(比如用IP帧结构),建议把DTS设置为和PTS相同;如果有B帧,要保证DTS ≤ PTS的时序逻辑。不合理的时序关系会让编码器自动修正参数,导致你的自定义值被覆盖。打印参数做验证
在编码前打印param的timebaseNum/timebaseDenom、fpsNum/fpsDenom,以及每帧的PTS/DTS值,确认这些参数没有被初始化代码或其他逻辑意外覆盖,数值完全符合你的预期。
内容的提问来源于stack exchange,提问作者Iceman

