x264码率控制

一、什么是视频码率?

           视频码率是视频数据(视频色彩量、亮度量、像素量)每秒输出的位数。一般用的单位是kbps。

 

二、设置视频码率的必要性

        在视频会议应用中,视频质量和网络带宽占用是矛盾的,通常情况下视频流占用的带宽越高则视频质量也越高;如要求高质量的视频效果,那么需要的网络带宽也越大;解决这一矛盾的钥匙当然是视频编解码技术。评判一种视频编解码技术的优劣,是比较在相同的带宽条件下,哪个视频质量更好;在相同的视频质量条件下,哪个占用的网络带宽更少。
        是不是视频码率越高,质量越好呢?理论上是这样的,然而在我们肉眼分辨的范围内,当码率高到一定程度,感觉没有什么差别。所以码率设置有它的最优值,H.264(也叫AVC或X.264)的文档中,视频的建议码率如下:


视频大小 分辨率 建议码率
480P 720X480 1800Kbps
720P 1280X720 3500Kbps
1080P 1920X1080 8500Kbps



x264的码率控制
一. 为什么要进行码率控制呢
因为一视频在编码之后可能出现一种情况,即一段固定时间,如5秒钟的输出比特数变动很大, 比如一个是10M, 而另一个是100K, 这样的码率变化使视频的传输很困难. 我们应该尽量让它们缩小一点差距, 如2M和1M.

二. 产生输出比特万码率波动的原因
1. 时间冗余和空间冗余的随机性
2. 变长编码

三. 码率控制的类型
1. 可变比特码率控制(可以通过增加缓冲区来达到平滑播放)
2. 恒定比特码率控制(不可以通过增加缓冲区来平滑, 要求时延要绝对小)

四. 码率控制性能指标
1. 码率
2. 延时
3. 缓冲区状态

五. 编码参数
人眼视觉系统对高频信号变化不敏感,部分高频信息丢失不会降低主观视频质量,主流的视频编码算法正是采用了量化方法消除视频信号的生理视觉冗余,获得比无损压缩更高的压缩比而又不会带来视频质量的显著降低。
1. 变换系数
2. 量化参数(rate control中常提到的Qp就是指的这个,quantum parameters,也是量化系数)
3. 运动矢量 (帧间编码模式)


  1. struct x264_ratecontrol_t
  2. {
  3.     /* constants */
  4.     int b_abr; //是否是自适应码率:booladaptive bit rat
  5.     int b_2pass;//是否采用2pass方式.
  6.     /* 2pass 是变码率(VBR)压缩的一项关键技术,意思是通过两次分析来压缩一个文件。
  7.      * 第一次分析影片各部分的动作快慢及分配相应的码率并作以相应记录,
  8.      * 第二次再根据第一次的记录进行压缩,这样就能让码率得到最佳分配,
  9.      * 从而在指定文件大小或规定码流内最大限度的提高视频质量。*/
  10.     int b_vbv;//是使用视频缓冲检验器Video Buffer Verifier. 参http://baike.baidu.com/view/1519233.htm
  11.     int b_vbv_min_rate;//是否使用vbv最小码率
  12.     double fps;//每秒多少帧
  13.     double bitrate;//比特率,每秒多少比特
  14.     double rate_tolerance;
  15.     int nmb;                    /* 每帧的宏块数*/
  16.     int qp_constant[5];//内定的量化系数值, 对不同 *片* slice而不同.

  17.     /* current frame */
  18.     ratecontrol_entry_t *rce;        //当前帧的码率控制条目
  19.     int qp;                     /* 当前帧的量化系数 */
  20.     int qpm;                    /* 当前宏块的量化系数 */
  21.     float qpa;                  /* 宏块的平均量化系数 */
  22.     int qp_force;                                /* 还不清楚做何做用 */

  23.     /* VBV stuff 与视频缓冲区检验器相关的 */
  24.     double buffer_size;                        //缓冲区大小
  25.     double buffer_fill_final;   /* 上一个完成的帧实际使用的缓冲区大小 */
  26.     double buffer_fill;         /* 计划的缓冲区大小, 就是处理的所有帧都算上可能出现的最大缓冲区使用量 */
  27.     double buffer_rate;         /* 每帧过后要加在buffer_fill上的比特数 */
  28.     predictor_t *pred;          /* predict frame size from satd */

  29.     /* 自适应码率相关的 */
  30.     int    last_satd;
  31.     double last_rceq;
  32.     double cplxr_sum;           /* sum of bits*qscale/rceq */
  33.     double expected_bits_sum;   /* sum of qscale2bits after rceq, ratefactor, and overflow */
  34.     double wanted_bits_window;  /* target bitrate * window */
  35.     double cbr_decay;
  36.     double short_term_cplxsum;
  37.     double short_term_cplxcount;
  38.     double rate_factor_constant;
  39.     double ip_offset;
  40.     double pb_offset;

  41.     /* 2pass stuff */
  42.     FILE *p_stat_file_out;
  43.     char *psz_stat_file_tmpname;

  44.     int num_entries;            /* number of ratecontrol_entry_ts */
  45.     ratecontrol_entry_t *entry; /* FIXME: copy needed data and free this once init is done */
  46.     double last_qscale;
  47.     double last_qscale_for[5];  /* last qscale for a specific pict type, used for max_diff & ipb factor stuff  */
  48.     int last_non_b_pict_type;
  49.     double accum_p_qp;          /* 用于决定I帧的量化系统 */
  50.     double accum_p_norm;
  51.     double last_accum_p_norm;
  52.     double lmin[5];             /* 五种类型的帧的最小量化等级 */
  53.     double lmax[5];
  54.     double lstep;               /* 每帧的量化值改变的最大副度 */
  55.     double i_cplx_sum[5];       /* estimated total texture bits in intra MBs at qscale=1 */
  56.     double p_cplx_sum[5];
  57.     double mv_bits_sum[5];
  58.     int frame_count[5];         /* 每种类型帧的计数 */

  59.     /* MBRC stuff */
  60.     double frame_size_planned;
  61.     predictor_t *row_pred;
  62.     predictor_t row_preds[5];
  63.     predictor_t *pred_b_from_p; /* predict B-frame size from P-frame satd */
  64.     int bframes;                /* # consecutive B-frames before this P-frame */
  65.     int bframe_bits;            /* total cost of those frames */

  66.     int i_zones;
  67.     x264_zone_t *zones;
  68.     x264_zone_t *prev_zone;
  69. };







你可能感兴趣的:(x264码率控制)