X264编码---基本参数设置

版权声明:凡本人原创,转发请注明出处,谢谢! https://blog.csdn.net/qq_41248872/article/details/83446375

x264编码有3个重要的相关参数,preset-tune-profile

参数设置相关函数:

x264_param_t* pParam = (x264_param_t*)malloc(sizeof(x264_param_t));

x264_param_default(pParam);   //给参数结构体pParam 赋默认值
x264_param_default_preset(pParam, "fast" , "zerolatency" );  //设置preset和tune

x264_param_apply_profile(pParam, "baseline");  //设置profile

preset是编码速度

可选项"ultrafast", "superfast", "veryfast", "faster", "fast", "medium", "slow", "slower", "veryslow", "placebo",从最快到最慢。无特殊要求选fast即可。

tune是编码质量和画面细节相关的参数。

可选项"film"电影, "animation"动画, "grain"颗粒, "stillimage"静态图像, "psnr"PSNR测试, "ssim"SSIM测试, "fastdecode"快速解码, "zerolatency"零延迟这几种。

profile是约束条件

从多到少排的"baseline", "main", "high", "high10", "high422", "high444",下面是从其他地方找的,介绍的有点老了。

H.264有四种画质级别,分别是baseline, extended, main, high:

  • 1、Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
  • 2、Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;(用的少)
  • 3、Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced), 也支持CAVLC 和CABAC 的支持;
  • 4、High profile:高级画质。在main Profile 的基础上增加了8x8内部预测、自定义量化、 无损视频编码和更多的YUV 格式;

  H.264 Baseline profile、Extended profile和Main profile都是针对8位样本数据、4:2:0格式(YUV)的视频序列。在相同配置情况下,High profile(HP)可以比Main profile(MP)降低10%的码率。 根据应用领域的不同,Baseline profile多应用于实时通信领域,Main profile多应用于流媒体领域,High profile则多应用于广电和存储领域

码率控制:(文件大小=码率x时长/8)

三种方式:CQP(恒定质量)、CRF(恒定码率)、ABQ(平均码率) 。缺省方法是CRF,优先级是ABR > CQP > CRF。

bitrate和QP都没有缺省值,一旦设置他们就表示要按照相应的码率控制方法进行编码,CRF有缺省值23,没有任何关于编码控制的设置时就按照CRF缺省值23来编码。

一般的使用建议:    
CQP – 一般不推荐使用,在一些算法验证工作中会使用这种模式     
CRF – 适合在关注一遍编码质量而输出文件大小或码率不是太紧要的场景下使用,一般网络压片使用CRF。     
1 pass ABR – 适用于流媒体或者目标码率受限的实时应用场景。    
2 pass VBR – 适用于有目标码率限制而又有时间可以进行二次编码的非实时应用。


ABR, 恒定平均目标码率。想要选择这种码率控制方法,必须先设置bitrate
       X264中bitrate的单位是Kbps(K bit per second).

       关系:编码后的文件大小=码率x时长/8.(比如码率为600kbps,视频时长为20s,那么编码后的h264码流文件大小等于1500kb(600x20/8))

别人写的对x264结构体的说明

typedef struct x264_param_t
{
  /* CPU 标志位 */
  unsigned int cpu;
  int i_threads; /* 并行编码多帧 */
  int b_deterministic; /*是否允许非确定性时线程优化*/
  int i_sync_lookahead; /* 线程超前缓冲 */

  /* 视频属性 */
  int i_width; /* 宽度*/
  int i_height; /* 高度*/
  int i_csp; /* 编码比特流的CSP,仅支持i420,色彩空间设置 */
  int i_level_idc; /* level值的设置*/
  int i_frame_total; /* 编码帧的总数, 默认 0 */
/*Vui参数集视频可用性信息视频标准化选项 */
  struct
  {
  /* they will be reduced to be 0 < x <= 65535 and prime */
  int i_sar_height;
  int i_sar_width; /* 设置长宽比 */

  int i_overscan; /* 0=undef, 1=no overscan, 2=overscan 过扫描线,默认"undef"(不设置),可选项:show(观看)/crop(去除)*/

  /*见以下的值h264附件E */
  Int i_vidformat;/* 视频格式,默认"undef",component/pal/ntsc/secam/mac/undef*/
  int b_fullrange; /*Specify full range samples setting,默认"off",可选项:off/on*/
  int i_colorprim; /*原始色度格式,默认"undef",可选项:undef/bt709/bt470m/bt470bg,smpte170m/smpte240m/film*/
  int i_transfer; /*转换方式,默认"undef",可选项:undef/bt709/bt470m/bt470bg/linear,log100/log316/smpte170m/smpte240m*/
  int i_colmatrix; /*色度矩阵设置,默认"undef",undef/bt709/fcc/bt470bg,smpte170m/smpte240m/GBR/YCgCo*/
  int i_chroma_loc; /* both top & bottom色度样本指定,范围0~5,默认0 */
  } vui;

  int i_fps_num;
  int i_fps_den;
/*这两个参数是由fps帧率确定的,赋值的过程见下:
{ float fps;   
if( sscanf( value, "%d/%d", &p->i_fps_num, &p->i_fps_den ) == 2 )
  ;
  else if( sscanf( value, "%f", &fps ) )
  {
  p->i_fps_num = (int)(fps * 1000 + .5);
  p->i_fps_den = 1000;
  }
  else
  b_error = 1;
  }
Value的值就是fps。*/

  /*流参数 */
  int i_frame_reference; /* 参考帧最大数目 */
  int i_keyint_max; /* 在此间隔设置IDR关键帧 */
  int i_keyint_min; /* 场景切换少于次值编码位I, 而不是 IDR. */
  int i_scenecut_threshold; /*如何积极地插入额外的I帧 */
  int i_bframe; /*两个相关图像间P帧的数目 */
  int i_bframe_adaptive; /*自适应B帧判定*/
  int i_bframe_bias; /*控制插入B帧判定,范围-100~+100,越高越容易插入B帧,默认0*/
  int b_bframe_pyramid; /*允许部分B为参考帧 */
/*去块滤波器需要的参数*/
  int b_deblocking_filter;
  int i_deblocking_filter_alphac0; /* [-6, 6] -6 light filter, 6 strong */
  int i_deblocking_filter_beta; /* [-6, 6] idem */
  /*熵编码 */
  int b_cabac;
  int i_cabac_init_idc;

  int b_interlaced; /* 隔行扫描 */
  /*量化 */
  int i_cqm_preset; /*自定义量化矩阵(CQM),初始化量化模式为flat*/
  char *psz_cqm_file; /* JM format读取JM格式的外部量化矩阵文件,自动忽略其他—cqm 选项*/
  uint8_t cqm_4iy[16]; /* used only if i_cqm_preset == X264_CQM_CUSTOM */
  uint8_t cqm_4ic[16];
  uint8_t cqm_4py[16];
  uint8_t cqm_4pc[16];
  uint8_t cqm_8iy[64];
  uint8_t cqm_8py[64];

  /* 日志 */
  void (*pf_log)( void *, int i_level, const char *psz, va_list );
  void *p_log_private;
  int i_log_level;
  int b_visualize;
  char *psz_dump_yuv; /* 重建帧的名字 */

  /* 编码分析参数*/
  struct
  {
  unsigned int intra; /* 帧间分区*/
  unsigned int inter; /* 帧内分区 */

  int b_transform_8x8; /* 帧间分区*/
  int b_weighted_bipred; /*为b帧隐式加权 */
  int i_direct_mv_pred; /*时间空间队运动预测 */
  int i_chroma_qp_offset; /*色度量化步长偏移量 */

  int i_me_method; /* 运动估计算法 (X264_ME_*) */
  int i_me_range; /* 整像素运动估计搜索范围 (from predicted mv) */
  int i_mv_range; /* 运动矢量最大长度(in pixels). -1 = auto, based on level */
  int i_mv_range_thread; /* 线程之间的最小空间. -1 = auto, based on number of threads. */
  int i_subpel_refine; /* 亚像素运动估计质量 */
  int b_chroma_me; /* 亚像素色度运动估计和P帧的模式选择 */
  int b_mixed_references; /*允许每个宏块的分区在P帧有它自己的参考号*/
  int i_trellis; /* Trellis量化,对每个8x8的块寻找合适的量化值,需要CABAC,默认0 0:关闭1:只在最后编码时使用2:一直使用*/
  int b_fast_pskip; /*快速P帧跳过检测*/
  int b_dct_decimate; /* 在P-frames转换参数域 */
  int i_noise_reduction; /*自适应伪盲区 */
  float f_psy_rd; /* Psy RD strength */
  float f_psy_trellis; /* Psy trellis strength */
  int b_psy; /* Toggle all psy optimizations */

  /*,亮度量化中使用的无效区大小*/
  int i_luma_deadzone[2]; /* {帧间, 帧内} */

  int b_psnr; /* 计算和打印PSNR信息 */
  int b_ssim; /*计算和打印SSIM信息*/
  } analyse;

  /* 码率控制参数 */
  struct
  {
  int i_rc_method; /* X264_RC_* */

  int i_qp_constant; /* 0-51 */
  int i_qp_min; /*允许的最小量化值 */
  int i_qp_max; /*允许的最大量化值*/
  int i_qp_step; /*帧间最大量化步长 */

  int i_bitrate; /*设置平均码率 */
  float f_rf_constant; /* 1pass VBR, nominal QP */
  float f_rate_tolerance;
  int i_vbv_max_bitrate; /*平均码率模式下,最大瞬时码率,默认0(与-B设置相同) */
  int i_vbv_buffer_size; /*码率控制缓冲区的大小,单位kbit,默认0 */
  float f_vbv_buffer_init; /* <=1: fraction of buffer_size. >1: kbit码率控制缓冲区数据保留的最大数据量与缓冲区大小之比,范围0~1.0,默认0.9*/
  float f_ip_factor;
  float f_pb_factor;

  int i_aq_mode; /* psy adaptive QP. (X264_AQ_*) */
  float f_aq_strength;
  int b_mb_tree; /* Macroblock-tree ratecontrol. */
  int i_lookahead;

  /* 2pass 多次压缩码率控制 */
  int b_stat_write; /* Enable stat writing in psz_stat_out */
  char *psz_stat_out;
  int b_stat_read; /* Read stat from psz_stat_in and use it */
  char *psz_stat_in;

  /* 2pass params (same as ffmpeg ones) */
  float f_qcompress; /* 0.0 => cbr, 1.0 => constant qp */
  float f_qblur; /*时间上模糊量化 */
  float f_complexity_blur; /* 时间上模糊复杂性 */
  x264_zone_t *zones; /* 码率控制覆盖 */
  int i_zones; /* number of zone_t's */
  char *psz_zones; /*指定区的另一种方法*/
  } rc;

  /* Muxing parameters */
  int b_aud; /*生成访问单元分隔符*/
  int b_repeat_headers; /* 在每个关键帧前放置SPS/PPS*/
  int i_sps_id; /* SPS 和 PPS id 号 */

  /*切片(像条)参数 */
  int i_slice_max_size; /* 每片字节的最大数,包括预计的NAL开销. */
  int i_slice_max_mbs; /* 每片宏块的最大数,重写 i_slice_count */
  int i_slice_count; /* 每帧的像条数目: 设置矩形像条. */

  /* Optional callback for freeing this x264_param_t when it is done being used.
  * Only used when the x264_param_t sits in memory for an indefinite period of time,
  * i.e. when an x264_param_t is passed to x264_t in an x264_picture_t or in zones.
  * Not used when x264_encoder_reconfig is called directly. */
  void (*param_free)( void* );
} x264_param_t;

这个是老版本的,新的x264好像新增了一些参数。

猜你喜欢

转载自blog.csdn.net/qq_41248872/article/details/83446375
今日推荐