代码如下:
double RateControl::predictSize(Predictor *p, double q, double var)
{
return (p->coeff * var + p->offset) / (q * p->count);
}
根据x264码率控制理论
假定q不变,位率与复杂度成正比,复杂度不变,位率与q成反比,右边coeff是一个常数系数。
x265有如下代码:
double new_coeff = X265_MAX((bits * q - old_offset) / var, p->coeffMin );
假设offset=0,则有
那么有了以上公式,如何衡量公式的准确性和误差:
offset就是衡量上面公式的误差,通过迭代法就可以分别求offset,coeff,bits,可以修正公式的误差值:
预测每帧大小代码(p->coeff * var + p->offset) / (q * p->count);转化公式为
coeff,offset除count,就变成平均coeff,offset,左边通过已编码帧加权平均bits与当前帧的var(satd)和q来缩放到当前的bits,右边是一个偏置项(类似机器学习),表示预测当前帧的大小与实际编码大小的累计加权平均偏移。
参考资料: