x264编码参数详细介绍:cpu与Video properties

目录

引言

cpu aotodetect

代码模块

 解释

Video properties

代码模块

解释


引言

x264编码器引入了引入了各类算法和各类基础编码功能,本片介绍cpu配置和video properties配置参数详细介绍。

 x264编码器全部参数的集合可以参考:x264参数全集_DogDaoDao的博客-CSDN博客

profile、preset、tune等参数集具体详细介绍可以参考: x264编码参数详细介绍_DogDaoDao的博客-CSDN博客

Encoder相关参数集具体详细介绍可以参考:x264编码参数详细介绍:Encoder_DogDaoDao的博客-CSDN博客 

cpu aotodetect

代码模块

    param->cpu = x264_cpu_detect();
    param->i_threads = X264_THREADS_AUTO;
    param->i_lookahead_threads = X264_THREADS_AUTO;
    param->b_deterministic = 1;
    param->i_sync_lookahead = X264_SYNC_LOOKAHEAD_AUTO;

 解释

CPU

当前设备cpu类型、能力检测,通过调用方法x264_cpu_detect()来自动检测完成;具体的实现在common/cpu.c中。

i_threads

/* encode multiple frames in parallel */ 并行编码多帧

  • 线程参数之一,并行编码线程数,可以是frame帧级多线程,也可以slice片级多线程,需要根据实际使用场景确定;视频会议这样要求实时性比较高的场景适合slice级多线程多能,点播、直播对实时性要求不高的场景适合frame帧级多线程功能;
  • 缺省值是X264_THREADS_AUTO(0);此时线程数为逻辑CPU个数的1.5倍;
  • i_threads的设置方式
    • i_threads=1
      • 不支持并行编码;zerolatency场景下设置param.rc.i_lookahead = 0,那么编码器来一帧编码一帧,无并行,无延时;如果没有设置i_lookahead = 0;编码器会延时40帧(default值),再开始编码,这是为了做码率控制而统计帧信息;
    • 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码流,此时不能进行这种设置,而只能采用设置i_threads = 1;
    • i_threads=0或者不设置(X264_THREADS_AUTO)
      • 不配置并行单元数,由程序根据当前CPU性能决定N值,决定N值后的流程和设置2是一样的;
      • 一般slice并行N值小于frame并行的N值;

i_lookahead_threads

/* multiple threads for lookahead analysis */前向分析的多个线程

  • 计算slicetype_slice_cost使用线程数,一般配置成0(缺省值,不进行手动配置),算法会根据frame帧级线程数和slice线程数,自动分配;
  • 缺省值是X264_THREADS_AUTO(0);

b_deterministic 

/* whether to allow non-deterministic optimizations when threaded */是否允许非确定性时线程优化

  • 缺省值是开启状态,可减少多线程的开销;
  • 不需要改动,最好保持默认状态;

i_sync_lookahead 

/* threaded lookahead buffer */ 配置线程的前向分析帧缓存大小;

  • 缺省设置-1(X264_SYNC_LOOKAHEAD_AUTO ),即自动选择最佳的前向分析线程缓冲区大小;
  • 在tune里的zerolantency会配置param->b_sync_lookahead = 0,用于实时视频会议场景,否则会增加首帧延时时间;
  • 最大值是250,在第二遍及更多遍编码或基于分片线程时自动关闭;

Video properties

代码模块

    param->i_csp           = X264_CHROMA_FORMAT ? X264_CHROMA_FORMAT : X264_CSP_I420;
    param->i_width         = 0;
    param->i_height        = 0;
    param->vui.i_sar_width = 0;
    param->vui.i_sar_height= 0;
    param->vui.i_overscan  = 0;  /* undef */
    param->vui.i_vidformat = 5;  /* undef */
    param->vui.b_fullrange = -1; /* default depends on input */
    param->vui.i_colorprim = 2;  /* undef */
    param->vui.i_transfer  = 2;  /* undef */
    param->vui.i_colmatrix = -1; /* default depends on input */
    param->vui.i_chroma_loc= 0;  /* left center */
    param->i_fps_num       = 25;
    param->i_fps_den       = 1;
    param->i_level_idc     = -1;
    param->i_slice_max_size = 0;
    param->i_slice_max_mbs = 0;
    param->i_slice_count = 0;
#if HAVE_BITDEPTH8
    param->i_bitdepth = 8;
#elif HAVE_BITDEPTH10
    param->i_bitdepth = 10;
#else
    param->i_bitdepth = 8;
#endif

解释

i_csp

/* CSP of encoded bitstream */编码后的码流色彩空间参数Colorspace

  • 缺省设置是param->i_csp=X264_CHROMA_FORMAT?X264_CHROMA_FORMAT:X264_CSP_I420; 配置成1时,支持I420的颜色空间格式;
  • 目前只支持I420格式//待验证?

i_width/i_height

  • 视频图像的宽高,缺省值都设置成 0 ;
  • 属于外部必须赋值的编码参数;
  • 使用方法
    • param->i_width=0; param->i_height=0; //代码版,通过外部参数设置传参形式赋值
    • --input-res 720x1280 //命令行版,通过*x264_param2string(x264_param_t*p,intb_res)指针函数来解析字符串实现赋值width和height

vui

/* video usability information */视频可用性信息,视频标准化选项

  • 结构体参数,里面含有一系列参数;
  • 编码器在sps里将vui信息带给解码器,建议解码器做的一些矫正处理;但是查看ffmpeg、VLC的264解码器,只有SAR解码器有做变形处理,其他的没有看到有特殊处理,并且SAR也不是解码器处理的,是ffmpeg外挂一个setsar filter处理的;
  • i_sar_width/i_sar_height
    • sample aspect ratio, 样本比例的宽和高,强制改变视频的宽高比,实现原理是将SAR信息通过SPS带到解码端,由解码端做变形操作;
    • SAR的计算公式:PAR x SAR = DAR;PAR(pixel aspect ratio)像素纵横比,DAR(display aspect ratio)显示纵横比,SAR(sample aspect ratio)采样纵横比
    • 缺省状态时设置为 0;
    • 使用方法
      • param->vui.i_sar_width=0; param->vui.i_sar_height=0; //代码
      • --sar x:y ( x/y) //命令行版
  • i_overscan
    • 图像在放大的时候边缘容易变形,该参数可以将变形的边界显示到窗口外面,让观看的人看起来是画面放大后是正常的;
    • 使用方法
      • 缺省状态是0 /*undef 未定义*/;1 /*=no overscan*/; 2 /*=overscan*/
      • 但是在ffmpeg、VLC解码器里对该字段都忽略,没有做特殊处理;
      • param->vui.i_overscan=0; //代码
      • --overscan 0/1/2 //命令行版
  • i_vidformat
    • 表明此视频在编码/数字化之前是什么格式;
    • 使用方法
      • --videoformat 0/1/2/3/4/5 //命令行版
      • param->vui.i_vidformat = 5; //代码版
      • 缺省状态是 5 /*undef 未定义*/;
      • 0/*Component*/,1/*PAL*/, 2/*NTSC*/, 3/*SECAM*/, 4/*MAC*/,6/*Reserved*/,7/*Reserved*/
  • b_fullrange
    • 画面颜色值范围,默认off状态16-255,on表示0-255,色域范围更大;
    • 使用方法
      • 缺省状态是 -1,依赖输入;
      • param->vui.b_fullrange=-1; /* default depends on input */ //代码版
      • --fullrange 0/1/-1 //命令行版
  • i_colorprim
    • 原始色度格式,不影响编码相关,仅仅是存到sps中;
    • 使用方法
      • 1/*BT709*/,4/*BT407m*/......其他定义参考h264标准介绍
      • 缺省状态是 2,取值范围是0~255,(0、3、13-21、23-255是reserved状态);
      • param->vui.i_colorprim=2; /* undef */ //代码版
      • --colorprim 0~255 //命令行版
  • i_transfer
    • 设置光电传输特性(设置伽马曲线用于矫正);
    • 使用方法
      • 1/*BT709*/,4/*BT407m*/......其他定义参考h264标准介绍
      • 缺省状态是 2,取值范围是0~255,(0、3,19~255是reserved状态);
      • param->vui.i_transfer=2; /* undef */ //代码版
      • --transfer 0~255 //命令行版
  • i_colmatrix
    • 设置从RGB转化时亮度和色度的矩阵系数。选择更合适的还原为YUV->RGB矩阵;
    • 使用方法
      • 0/*GBR*/,1/*BT709,KR = 0.2126, KB =0.00722 */...其他如YCgCo、bt2020c、ICtCp等定义参考h264标准介绍
      • 缺省状态是 -1 ,依赖输入; 取值范围是0~255,(2、3、15-255是reserved状态);
      • param->vui.i_colmatrix=-1; /* default depends on input *///代码版
      • --colmatrix 0~255 //命令行版
  • i_chroma_loc
    • 设置色度取样位置;如果正确的从 MPEG1(比如 VCD)的 4:2:0 格式二次采样转码,且不做任何色彩空间转换,应该设为1;如果正确的从 MPEG2(比如 DVD)的 4:2:0 格式二次采样转码,且不做任何色彩空间转换,应该设为0;如果正确的从 MPEG4(比如蓝光)的 4:2:0 格式二次采样转码,且不做任何色彩空间转换,应该设为0;其它,默认缺省值;
    • 使用方法
      • 缺省状态是0,取值范围0-5 ;//b_error= ( p->vui.i_chroma_loc<0||p->vui.i_chroma_loc>5 );
      • parma->vui.i_chroma_loc = 0 /*left center*/ //代码版
      • --chromaloc 0/1/2/3/4/5 //命令行版

i_fps_num/i_fps_den       

  • 预设帧率,用来定位关键帧位置,以及码率控制,并不能完全控制输出帧率;输出帧率与输入帧率有关;
  • 相关的代码逻辑
    • rc->fps = (float)h->param.i_fps_num/h->param.i_fps_den//码率控制fps
    • h->param.i_keyint_min = X264_MIN(h->param.i_keyint_max/10, (int)fps);//最小关键帧间隔
    • rc->buffer_rate = vbv_max_bitrate / rc->fps; //一帧的max size rate
  • 采集帧率、编码输入帧率、编码输出帧率关系
    • 在webrtc中从最开始的采集到最终的渲染,fps是递减的;
    • 输入到编码器的视频帧,也不一定全部被编码,在webrtc中,当网络出现延时或者丢包情况下,码率会持续下调,如果帧率不变的话,码率的持续下调必然导致视频质量快速下降,因此在webrtc中还会有在编码前降低帧率的处理方法;此外当编码器输出的码率无法压缩到指定的目标码率时候,编码器的码控模块也会有丢帧逻辑,因此,实际的输出帧率小于等于输入编码器的帧率;
      • 当采集帧率小于编码输入帧率,以采集帧率为准;
      • 当采集帧率大于编码帧率,webrtc直接进行掉帧处理,没有平滑算法,仅仅判断当前编码器是否空闲,空闲可以正常编码,不丢帧,否则丢掉当前帧;
      • 理论上编码器的输入帧率小于等于视频的采集帧率,编码器编码性能+视频采集帧率决定编码器的输入帧率;
  • 缺省状态是param->i_fps_num=25; param->i_fps_den=1;通常i_fps_num参数需要user根据实际应用场景配置合适的值;
  • 使用方法
    • param->i_fps_num=25; param->i_fps_den=1; //代码版
    • --fps 25 //命令行版,通过x264_param_parse(x264_param_t*p,constchar*name,constchar*value)给传递参数,参数%u/%u

slice-max-size

/* Max size per slice in bytes; includes estimated NAL overhead. */

  • 设置slice片的最大字节数,包括预估的NAL额外量(overhead);
  • 目前与interlaced不兼容;
  • 缺省状态是0;
  • 使用方法
    • param->i_slice_max_size=0; //代码版
    • --slice-max-size 0 //命令行版

--slice-max-mbs

/* Max number of MBs per slice; overrides i_slice_count. */

  • 每个slice片的宏块MB最大数,会重写i_slice_count参数;
  • 目前与interlaced不兼容;
  • 缺省状态是0;
  • 使用方法
    • param->i_slice_max_mbs = 0; //代码版
    • --slice-max-mbs 0 //命令行版

slice-min-mbs

/* Min number of MBs per slice */

  • 每个slice片的宏块MB最小数;
  • 没有缺省状态,正常不使用;

slices

/* Number of slices per frame: forces rectangular slices. */

  • 每帧的slice片数量,强制矩形分片;会被i_slice_max_mbs所覆盖;
  • 蓝光编码需要使用4,其他情况若非必要一般不用;
  • 缺省状态是0;
  • 使用方法
    • param->i_slice_count=0; //代码版
    • --slices 0//命令行版

slices-max

/* Absolute cap on slices per frame; stops applying slice-max-size and slice-max-mbs if this is reached. */

  • 每帧分片slice的绝对上限,如果达到则停止使用slice-max-size和slice-max-mbs;
  • 没有缺省状态,正常不使用;
  • 使用方法
    • param->i_slice_count_max=0; //代码版
    • --slices-max 0//命令行版

input-depth

  • 输入视频流的位数,一般都是8比特,特殊支持10比特;
  • 使用 方法
    • param->i_bitdepth=8;//代码版
    • --input-depth 8 //命令行版

你可能感兴趣的:(H264标准,h.264,视频编解码,实时音视频,视频编码参数,x264,视频直播)