AV1码率控制

AV1源码:libaom-2.0.0

一、什么时候会计算码率?encoder_init 和 encoder_ctrl_maps
二、如何计算初始化的编码比特数?
    encoder_init  和 设置 rc_control 时会调用 av1_change_config 进行码率计算与设置:帧的比特率是如何分配的?
    1、encoder_init --> create_context_and_bufferpool --> av1_create_compressor --> init_config --> av1_change_config --> av1_new_framerate
    --> av1_rc_update_framerate
    2、update_extra_cfg-->av1_change_config

    av1_rc_update_framerate:计算平均带宽,最大、最小带宽,

    平均带宽:avg_frame_bandwidth = target_bandwidth(250) / framerate(30);
    最小带宽:min_frame_bandwidth = FRAME_OVERHEAD_BITS(200) 对于relatime:固定值

    MAX_MB_RATE = 250
    MAXRATE_1080P = 2025000
    每个宏块的比特数:(宽*高)/ (16*16)

    max1 = 每个宏块的比特数 * MAX_MB_RATE
    maxMB = max(max1, MAXRATE_1080P);
    vbr_max_btis = avg_frame_bandwidth * two_pass_vbrmax_section(2000,可设置) / 100;
    最大带宽:max_frame_bandwidth = max(maxMB, vbr_max_btis);
    
三、计算了最大、最小和平均帧比特数后,如何计算当前帧的实际目标比特?
    
    1、求每帧的实际目标数
        keyframe:
            如果设置了系数:rc_max_intra_bitrate_pct(默认值:300)
                t1 = avg_frame_bandwidth * 25;
                t2 = avg_frame_bandwidth * rc_max_intra_bitrate_pct / 100;
                target = min(t1, t2);
            否则:
                target = t1
        
        非keyframe:
            GOP的第一帧(非IDR帧):baseline_gf_interval=8(默认值)
                t1 = (avg_frame_bandwidth * baseline_gf_interval * 10 )/ (baseline_gf_interval + 10 -1)
            非GOP第一帧:
                t1 = (avg_frame_bandwidth * baseline_gf_interval) / (baseline_gf_interval + 10 -1)
                
            t2 = min_frame_target = min(min_frame_bandwidth, avg_frame_bandwidth >> 5)
            target = max(t1, t2) 即:如果比帧最小目标比特还小,则该帧的目标比特为t2.
            
    2、如果没有缩放,则当前帧的目标比特数 = target;如果有缩放,则当前帧的目标比特数 = target * 缩放系数,

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值