x264帧编码延迟

一路向南_csdn 2014-11-05 10:36:33
研究了一下x264编码延时.
方法是加log在x264.c
static int encode( x264_param_t *param, cli_opt_t *opt )
{
...
i_frame_size = encode_frame( h, opt->hout, &pic, &last_dts );
if( i_frame_size == 0) // delay frames
fprintf( stderr, "output zero %d\n", i_frame );
...
}

统计了一下,发现x264编码延时帧数符合下面的公式。
h->frames.i_delay =
param->i_sync_lookahead + // 前向考虑帧数
max ( param->i_bframe, // B帧数量
param->rc.i_lookahead) + // 码率控制前向考虑帧数
param->i_threads - 1. // 并行编码帧数

延迟有两种:
1.编码前延时(当前帧没有编码,需要buffer更多帧后才能开始编码)。
这种延时出口在 encoder.c, x264_encoder_encode函数
...
if( h->frames.i_input <= h->frames.i_delay + 1 - h->i_thread_frames )
{
/* Nothing yet to encode, waiting for filling of buffers */
pic_out->i_type = X264_TYPE_AUTO;
return 0;
}
...
i_sync_lookahead, i_bframe, rc.i_lookahead 都会在此影响延时。

2. 编码后延时(当前帧已经编码,但后续帧还没编码,只好先退出)。
这种延时出口在 encoder.c, x264_encoder_frame_end函数
if( !h->out.i_nal )
{
pic_out->i_type = X264_TYPE_AUTO;
return 0;
}
这部分延时是因为x264并行帧编码引起的。
x264并行帧编码每一次都是把一个帧组(i_threads个并行处理帧)处理完后,再处理下一个帧组。

根据公式看到减少帧延时的方法,也就是(zerolatency 设置)
param->rc.i_lookahead = 0;
param->i_sync_lookahead = 0;
param->i_bframe = 0;
param->b_sliced_threads = 1;
param->b_vfr_input = 0;
param->rc.b_mb_tree = 0;

这个设置h->frames.i_delay = 0。但其中param->b_sliced_threads = 1 的设置值得怀疑。
当b_sliced_threads = 1时,x264放弃帧并行编码,这必然会影响编码速度。
一个折中的办法是设置b_sliced_threads = 0,其他按照zerolatency 设置。
这样h->frames.i_delay = param->i_threads - 1。
x264根据CPU自动计算i_threads,一般为6/8. 这样的帧群延迟大概是1/3-1/2秒。
看具体系统的需要能否满足。

这样看x264并行帧编码写的还不是很自适应。
如果能够让i_threads在编码起始阶段随着输入帧数的增加而增加,那样就可以彻底解决编码群延时的问题了。
个人想法,未经验证,欢迎指正。
...全文
1884 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
macrojj 2015-07-06
  • 打赏
  • 举报
回复
加上 av_dict_set(¶m, "tune", "zerolatency", 0); 零延时
lihp1603 2015-01-14
  • 打赏
  • 举报
回复
最近在学x264编码,按照ithread相同,使用低延时设置,和不启用低延时设置,编码一帧的时间差距很大,低延时的时候,为7ms一帧,但不启用,使用并行编码的时候,一帧时间大概为2ms,编码的视频是为1080P的。 所以并行编码的时候实际的编码时间比启用低延时要快,但在并行编码的时候,有一个问题,感觉不太好解决,不知道楼主是怎么解决的? 就是当我要强制出IDR的时候,那么这个时候,我需要马上得到我送进去的这种,出来就是IDR,但在并行编码的时候,因为存在帧数的延迟,所以我送进去以后,它是在我送进去这帧开始,往后推迟延迟帧的数量,这个问题就感觉不太好解决了,有什么其他方法嘛?
dengzikun 2014-11-10
  • 打赏
  • 举报
回复
X264编码时延可以分为两部分,计算时延+缓冲时延。 降低计算复杂度,使用帧内并行编码,提高硬件性能可以降低计算时延。 关闭B帧,关闭帧间并行编码可以降低缓冲时延。

2,543

社区成员

发帖
与我相关
我的任务
社区描述
专题开发/技术/项目 多媒体/流媒体开发
社区管理员
  • 多媒体/流媒体开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧