发明名称 一种码率控制方法
摘要 本发明提供的一种码率控制方法,根据当前帧的图像类型,采用帧级码率控制和宏块级码率控制来对图像进行编码。本发明提供的一种码率控制方法,控制精度高,主观图像质量好,同时计算复杂度很低,不仅适合各种软件应用,而且也适合硬件的实时工作。
申请公布号 CN100448297C 申请公布日期 2008.12.31
申请号 CN200510110106.8 申请日期 2005.11.08
申请人 上海广电(集团)有限公司中央研究院 发明人 李国平;赵海武;陈勇;李萍;侯钢;王国中
分类号 H04N7/32(2006.01) 主分类号 H04N7/32(2006.01)
代理机构 上海新天专利代理有限公司 代理人 衷诚宣
主权项 1.一种码率控制方法,其特征在于,包含以下步骤:步骤1、在帧级码率控制中,以每个图像组GOP为单位,计算每个图像组的比特B<sub>gop</sub>:步骤1.1、根据信道目标码率R和帧率F,计算每个图像组的比特B<sub>gop</sub>:<maths num="0001"><![CDATA[<math><mrow><msub><mi>B</mi><mi>gop</mi></msub><mo>=</mo><msub><mi>B</mi><mrow><mi>ful</mi><mi>ln</mi><mi>ess</mi></mrow></msub><mo>+</mo><msub><mi>S</mi><mi>gop</mi></msub><mo>&times;</mo><mrow><mo>(</mo><mfrac><mi>R</mi><mi>F</mi></mfrac><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>1</mn><mo>)</mo></mrow></mrow></math>]]></maths>在上式中,B<sub>fullness</sub>是缓存中剩余的比特数,S<sub>gop</sub>为每个图像组GOP中的图像帧数;步骤1.2、对缓存中剩余的比特数B<sub>fullness</sub>初始化为0;步骤2、根据当前帧的图像类型可为I图像,P图像或B图像,计算当前图像帧所分配的比特B<sub>cur_frame</sub>:B<sub>cur_frame</sub>=P<sub>cur</sub>×(B<sub>gop</sub>-B<sub>cur_gop_used</sub>)/(P<sub>ip</sub>×P<sub>pb</sub>×F<sub>i</sub>+P<sub>pb</sub>×F<sub>p</sub>+F<sub>b</sub>)(2)在上式中F<sub>i</sub>,F<sub>p</sub>,F<sub>b</sub>分别为I图像和P图像以及B图像的帧数,P<sub>ip</sub>为I图像相对于P图像的比特分配权重参数,P<sub>pb</sub>为P图像相对于B图像的比特分配权重参数,P<sub>cur</sub>为当前帧的权重参数,B<sub>cur_gop_used</sub>表示当前图像组已经使用的比特;初始化B<sub>cur_gop_used</sub>,,F<sub>i</sub>,F<sub>p</sub>,F<sub>b</sub>,并且设定P<sub>ip</sub>,P<sub>pb</sub>的值;步骤3、计算当前图像帧的目标平均量化系数Q<sub>cur_ave</sub>:如果前一帧图像已经使用的比特数为B<sub>prev_frame</sub>,前一帧图像非零离散余弦变换系数的个数为N<sub>prev_frame</sub>,则当前帧中非零离散余弦变换系数的个数为:N<sub>cur_frame</sub>=B<sub>cur_frame</sub>×N<sub>prev_frame</sub>/B<sub>prev_frame</sub>    (3)如果一帧离散余弦变换系数的个数为N<sub>total_frame</sub>,前一帧图像的平均量化系数为Q<sub>prev_ave</sub>,则当前图像帧的目标平均量化系数为:Q<sub>cur_ave</sub>=Q<sub>prev_ave</sub>+W×(N<sub>prev_frame</sub>-N<sub>cur_frame</sub>)/(N<sub>total_frame</sub>-N<sub>prev_frame</sub>)(4)在上式中W为权重系数,其值由用户根据不同情况定义;步骤4、宏块级码率控制:步骤4.1、如果当前图像中已经编码宏块使用的比特为B<sub>cur_frame_used</sub>,则剩余宏块所分配的比特为:B<sub>cur_frame_rest</sub>=B<sub>cur_frame</sub>-B<sub>cur_frame_used</sub>                        (5)如果已编码宏块中的非零离散余弦变换系数的个数为N<sub>cur_frame_used</sub>,则未编码宏块的非零离散余弦变换系数的个数为:N<sub>cur_frame_rest</sub>=B<sub>cur_frame_rest</sub>×N<sub>cur_frame_used</sub>/B<sub>cur_frame_used</sub>  (6)步骤4.2、如果剩余宏块的离散余弦变换系数的个数为N<sub>total_frame_rest</sub>,则当前宏块的非零离散余弦变换系数的平均数为:N<sub>cur_mb_ave</sub>=N<sub>cur_frame_rest</sub>/N<sub>total_frame_rest</sub>                     (7)步骤4.3、计算当前宏块的非零离散余弦变换系数的个数N<sub>pred_mb</sub>:在编码宏块中,宏块之间存在相关性,根据已经编码宏块的非零离散余弦变换系数的个数,或者根据当前宏块离散余弦变换系数的总数和当前宏块零离散余弦变换系数的预测数,来预测出当前宏块的非零离散余弦变换系数的个数,即:<maths num="0002"><![CDATA[<math><mrow><msub><mi>N</mi><mrow><mi>pred</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>=</mo><munderover><mi>Pred</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mrow><mo>(</mo><msub><msup><mi>N</mi><mi>i</mi></msup><mrow><mi>prev</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>8</mn><mo>)</mo></mrow></mrow></math>]]></maths>N<sup>i</sup><sub>prev_mb</sub>表示在当前宏块之前编码宏块的非零离散余弦变换系数的个数;<maths num="0003"><![CDATA[<math><mrow><msub><mi>nZ</mi><mrow><mi>pred</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>=</mo><munderover><mi>Pred</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>N</mi></munderover><mrow><mo>(</mo><msub><msup><mi>nZ</mi><mi>i</mi></msup><mrow><mi>prev</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>)</mo></mrow><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>9</mn><mo>)</mo></mrow></mrow></math>]]></maths>nZ<sup>i</sup><sub>prev_mb</sub>表示在当前宏块之前编码宏块的零离散余弦变换系数的个数,nZ<sub>pred_mb</sub>为当前宏块的零离散余弦变换系数的预测数;N<sub>pred_mb</sub>=N<sub>mb</sub>-nZ<sub>pred_mb</sub>    (10)在上式中,N<sub>mb</sub>表示当前宏块的离散余弦变换系数的总数,Pred()代表预测方法,N代表这种预测方法所需要的以前编码宏块的个数,<img file="C2005101101060004C2.GIF" wi="405" he="118" />表示根据所有的N<sup>i</sup><sub>prev_mb</sub>经过选择的预测方法预测后可以得到N<sub>prev_mb</sub>,<img file="C2005101101060004C3.GIF" wi="430" he="118" />表示根据所有的nZ<sup>i</sup><sub>prev_mb</sub>经过选择的预测方法预测后可以得到nZ<sub>pred_mb</sub>;步骤4.4、如果当前编码宏块的前一个宏块的量化系数为Q<sub>prev_mb</sub>,则当前编码宏块的量化系数为:<maths num="0004"><![CDATA[<math><mrow><msub><mi>Q</mi><mrow><mi>cur</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>=</mo><msub><mi>Q</mi><mrow><mi>prev</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>+</mo><mfrac><mrow><mi>W</mi><mo>&times;</mo><mrow><mo>(</mo><msub><mi>N</mi><mrow><mi>pred</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>-</mo><msub><mi>N</mi><mrow><mi>cur</mi><mo>_</mo><mi>mb</mi><mo>_</mo><mi>ave</mi></mrow></msub><mo>)</mo></mrow></mrow><mrow><mi>Max</mi><mrow><mo>(</mo><msub><mi>N</mi><mrow><mi>total</mi><mo>_</mo><mi>frame</mi><mo>_</mo><mi>rest</mi></mrow></msub><mo>-</mo><msub><mi>N</mi><mrow><mi>pred</mi><mo>_</mo><mi>mb</mi></mrow></msub><mo>,</mo><msub><mi>N</mi><mrow><mi>total</mi><mo>_</mo><mi>frame</mi><mo>_</mo><mi>rest</mi></mrow></msub><mo>-</mo><msub><mi>N</mi><mrow><mi>cur</mi><mo>_</mo><mi>mb</mi><mo>_</mo><mi>ave</mi></mrow></msub><mo>)</mo></mrow></mrow></mfrac><mo>-</mo><mo>-</mo><mo>-</mo><mrow><mo>(</mo><mn>11</mn><mo>)</mo></mrow></mrow></math>]]></maths>在上式中Max为两者取最大值算子,W为权重系数,其值由用户根据情况定义;将Q<sub>cur_mb</sub>限制在[Q<sub>cur_ave</sub>-step,Q<sub>cur_ave</sub>+step]范围内,其中step是量化系数的跳跃系数,由用户根据需要定义;步骤4.5、宏块编码;步骤4.6、当前宏块编码完成后,更新已经编码宏块所使用的比特B<sub>cur_frame_used</sub>,和已经编码宏块的非零离散余弦变换系数的个数N<sub>cur_frame_used</sub>,如果当前图像所有宏块编码完成,则到步骤5,否则到步骤4.1;步骤5、当前图像帧编码已完成,更新B<sub>cur_gop_used</sub>,B<sub>prev_frame</sub>,N<sub>prev_frame</sub>,Q<sub>prev_ave</sub>,判断当前图像组GOP中所有的帧图像的帧编码是否完成,是,则到步骤6,否则到步骤2;步骤6、将当前缓存中剩余的比特数赋值给当前图像组GOP的参数B<sub>fullness</sub>,如果所有图像组的编码均完成,则结束,否则到步骤1。
地址 200233上海市宜山路757号2楼