x264有两种并行模式,slice并行和frame并行。slice并行把一帧划分为多个矩形slice,在这多个slice之间并行处理,是一种非延时性的并行模式,多slice会稍微降低编码性能。frame并行是同时开启多帧编码,x264在N个frame并行的时候需要集齐N帧再开始一起编码,因此x264 frame并行是一种延时性的并行模式(这是x264流程的问题,其实frame并行机制并不要求集齐N帧以后再启动编码)。对于对编码时间敏感的实时应用,不能采用frame并行,只能采用slice并行或者不做并行编码。
x264_param_t结构体里面的i_threads参数定义并行单元数目,根据并行模式的不同有不同的意义。
i_threads有三种设置方式。
1. i_threads = 1;
明确告诉编码器,不使用并行编码。zerolatency场景下设置param.rc.i_lookahead=0; 那么编码器来一帧编码一帧,无并行、无延时。如果没有设置i_lookahead=0,编码器会延时40帧(程序缺省值),再开始编码,这是为了做码率控制而统计帧信息。
2. i_threads = N; (N>1)
明确告诉编码器,使用N个并行单元编码。如果param.b_sliced_threads=1那么一帧图像被划分为N个slice(N的取值也有限制,不能大于图像宏块行数),进行slice并行。如果param.b_sliced_threads=0进行frame并行。编码器会延时max(N, param.rc.i_lookahead)帧。zerolatency场景下场景下,param.b_sliced_threads=1; param.rc.i_lookahead=0; N个slice并行、无延时。注意有些厂家的解码器不支持多slice码流,这时不能进行这种设置,而只能采用设置1。
3. i_threads = 0; 或者不设置
不配置并行单元数,由程序根据当前CPU性能决定N值。决定N值后的流程和设置2是一样的。
一般slice并行N值小于frame并行的N值。
x264_param_t结构体里面的i_threads参数定义并行单元数目,根据并行模式的不同有不同的意义。
i_threads有三种设置方式。
1. i_threads = 1;
明确告诉编码器,不使用并行编码。zerolatency场景下设置param.rc.i_lookahead=0; 那么编码器来一帧编码一帧,无并行、无延时。如果没有设置i_lookahead=0,编码器会延时40帧(程序缺省值),再开始编码,这是为了做码率控制而统计帧信息。
2. i_threads = N; (N>1)
明确告诉编码器,使用N个并行单元编码。如果param.b_sliced_threads=1那么一帧图像被划分为N个slice(N的取值也有限制,不能大于图像宏块行数),进行slice并行。如果param.b_sliced_threads=0进行frame并行。编码器会延时max(N, param.rc.i_lookahead)帧。zerolatency场景下场景下,param.b_sliced_threads=1; param.rc.i_lookahead=0; N个slice并行、无延时。注意有些厂家的解码器不支持多slice码流,这时不能进行这种设置,而只能采用设置1。
3. i_threads = 0; 或者不设置
不配置并行单元数,由程序根据当前CPU性能决定N值。决定N值后的流程和设置2是一样的。
一般slice并行N值小于frame并行的N值。