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在编码起始阶段随着输入帧数的增加而增加,那样就可以彻底解决编码群延时的问题了。
个人想法,未经验证,欢迎指正。
相关推荐
一种基于帧间和帧内宏块级的X264并行编码算法
:结合H.264编码标准对X264编码器进行了分析与研究,目的在于提高编码速度,增强X264 的实时性。在重点分析了宏块间数据依赖关系的情况下,针对帧间宏块级多线程并行编码的特点,本文提 出了一种基于帧间和帧内宏块级的多线程并行编码算法。该算法在原有的帧间宏块级多线程并行编码的 基础上,遵循宏块之间的空间相关性,为I帧内每行宏块创建单独的线程,实现了帧间和帧内宏块级并行 编码,达到了多粒度并行的效果。实验结果表明,该算法在视频序列能够有效地编码和保持峰值信噪比变 化不大的情况下,提高了编码的加速比,从而加强了视频编码的实时性
【x264编码器】章节1——x264编码流程及基于x264的编码器demo
提供了一种方便的方式来根据指定的配置profile应用相应的设置到 x264 参数结构体上。不同的配置文件类型会对参数结构体进行不同的修改,以满足特定的编码需求。然后是编码器参数,包括帧参考数、最大关键帧间隔、最小关键帧间隔、B 帧数、场景切换阈值等。结构体的成员进行赋值,将其初始化为默认值。之后是一些编码器设置,如去块滤波、CABAC 编码、码率控制方法、参考帧压缩系数等。接下来是一系列与视频属性相关的参数,如色度格式、宽度、高度、宽高比等。然后是一些与日志输出、分析类型、量化矩阵等相关的参数。
x264 码率控制 VBV 原理
x264 码率控制 VBV原理
别再被‘无延迟’忽悠了!实测告诉你OBS+保利威私域直播的真实延迟表现
本文通过实测数据揭示了OBS+保利威私域直播的真实延迟表现,拆解了‘无延迟’营销话术与技术现实的差距。详细对比了RTMP与WebRTC协议在不同场景下的延迟差异,并提供了优化延迟的实战技巧,帮助企业根据业务需求选择最优直播方案。
低延迟视频编码:超帧原理、参数配置与AI插帧实践
视频端到端延迟的根源往往不在网络,而在传统的帧结构。H.264/H.265编码中,B帧重排序和GOP长时间等待会引入数十毫秒的编码延迟,叠加播放缓冲后时延轻松超过2秒。超帧(hyperframes)打破按帧交付的惯例,将一组关联帧封装为独立解码单元,让解码器无需等齐未来帧即可输出画面,从而将延迟压缩至百毫秒级。这一思想同样延伸至AI视频插帧领域——RIFE等光流算法正是把连续帧作为整体推断中间帧,属于时间轴上的“超帧”思维。本文从实际远程操控场景出发,详解超帧原理,并给出x264/x265/NVENC的ze


多媒体/流媒体开发
