问题背景:

无论是查线上一些花屏、卡顿,​​马赛克​​问题,还是进行码率自适应的功能开发,抑或进行客户端播放器的JitterBuffer的优化,都需要编码器发送端的配合。我们需要在编码速度、网络带宽,视频质量方面做一个权衡,进而选择更符合场景的码控调整方案,同时目前比较热门的ROI编码,编码场景的自适应学习都跟这部分内容有关系。本文介绍下常见视频编码器码率控制方案,具体的编码器可能在实现和使用上有所差异,具体在调用API和阅读源码时需要进行进一步分析和了解。



背景知识:

视频编码过程中,有一个重要步骤:量化,量化属于有损压缩过程。量化基本决定了视频的码率,视频的码率又从一定程度上决定了视频的质量。量化值QP越大则量化的粒度越高,压缩率越大,码率更小,视频质量越低,呈现出来就是马赛克比较大,画面不细腻,画面比较模糊。反之,压缩率低,码率大,质量高,画面细腻,细节丰富。

所以选择一个适合场景的视频码控方案很重要,调整视频输出码率其实就是在视频编码速度、网络带宽以及视频质量之间做一个平衡。有时网络带宽很受限,就要优先考虑码率大小优先的码控方案,有些对视频质量要求很高,要高清视频,那就要选择质量优先的模型。


整体来说选择视频编码码率控制方案,可以通过下面个因素权衡得出

1. 视觉质量稳定性,利于视觉主观质量,比如清晰度,流畅度,细节等,这点和人眼的视觉原理有关,选择人眼主动质量感受最高的模型;

2. 即时输出码率,相当于每帧编码输出比特数,要考虑网络带宽因素,随着移动互联网发展,也需要考虑wifi和无线网这块的影响;

3. 输出视频文件大小可控,利于传输,存储,要看系统的空间大小;

4. 编码速度,不同的码控模型也影响了编码速度,对于低延时、实时场景要考虑,因为不同的码控方案,计算的复杂度不同,带来的编码延时也有影响;

5. 对于移动设备还需要不同编码方式耗电量要求,因为不同模型会影响编码和解码复杂度,进而在移动设备编码和播放需要的耗电量不同;



码率介绍:

下面介绍不同的码率控制模型和适用场景:

 

CQP:固定QP,最简单的码率控制方式,每帧图像都按照一个特定的QP来编码,每帧编码后的数据量有多大是未知的,既不是码率优先模型也不是质量优先模型,不过是实现最简单的模型;

适用场景:一般不建议使用这种方式,因为这种方式不考虑编码内容的复杂性,用相同的压缩比处理每一帧。出来的视频质量码率都不固。个人觉得只有那种非常简单的场景,比如静止不变的场景运动量很小的场景可以尝试用,一遇到复杂场景,码率波动就非常大。或者在算法研究或者验证可以使用。

特点

·瞬时码率会随场景复杂度波动;

·编码速度快,调控最简单,每帧的QP值相同;

·x264和x265中支持CQP模式,libvpx不支持;

·H.264中QP范围是[0, 51]。QP值越大表示越大的量化步长,编码视频的质量越低。QP为0表示进行无损编码;



CRF:(Constant Rate Factor)恒定码率系数。把某一个”视觉质量”作为输出目标。通过降低那些耗费码率但是又难以用肉眼察觉的帧(高速运动或者纹理丰富)的质量提升那些静态帧的码率来达到此目的。

特点:帧间QP变化,帧内宏块的QP变化,输出码率未知,各帧输出的视觉质量基本恒定,这种方式相当于固定质量模式+限制码率峰值的方式。

 

适用场景:适用于对视频质量有一定要求的场合,CRF值可以简单理解为对视频质量期望的一个输出固定值,希望无论是在运动复杂场景下还是在静止简单情况下,都希望有一个稳定的主观视频质量可以选择该模式,该模式是视频质量优先模型。视频质量可以简单理解为视频的清晰度,像素的细腻程度和视频的流畅度。

特点

·与恒定QP类似,但追求主观感知到的质量恒定,瞬时码率也会随场景复杂度波动,视频帧之间或者内部宏块之间的QP值都不一样;

·对于快速运动或细节丰富的场景会适当增大量化失真(因为人眼不敏感),反之对于静止或平坦区域则减少量化失真;

·CRF是x264和x265的默认码率控制方式,也可用于libvpx;

·CRF值越大视频压缩率越高,但视频质量越低,各codec的CRF取值范围一般[0-51],但是一般默认值x264用23,x265库默认为28;

·如果你不确定要使用什么CRF,从默认值开始,并根据对输出的主观印象进行更改。如果质量没有足够好则较低的CRF。如果文件太大了则选择更高的CRF。更改±6会导致码率大小的一半/两倍左右的变化,±1会导致码率10%左右的变化。

 


CBR:(Constant Bit Rate)恒定码率,一定时间范围内比特率基本保持的恒定,属于码率优先模型。

适用场景:一般也不建议使用这种方式,虽然输出的码率总是处于一个稳定值,但是质量不稳定,不能充分有效利用网络带宽,因为这种模型不考虑视频内容的复杂性,把所有视频帧的内容统一对待。但是有些编码软件只支持固定质量或者固定码率方式,有时不得不用。用的时候在允许的带宽范围内尽可能把带宽设置大点,以防止复杂运动场景下视频质量很低,如果设置的不合理,在运动场景下直接就糊的看不成了。

特点

·码率稳定,但是质量不稳定,带宽有效利用率不高,特别当该值设置不合理,在复杂运动场景下,画面非常模糊,非常影响观看体验;

·但是输出视频码率基本稳定,便于计算视频体积大小;

 


VBR:(Variable Bit Rate)可变码率,简单场景分配比较大的QP,压缩率小,质量高。复杂场景分配较小QP。得到基本稳定的视觉质量,因为人眼人眼本来就对复杂场景不敏感,缺点在于输出码率大小不可控。

有两种调控模式:质量优先模式和2PASS二次编码模式。

质量优先模式:

不考虑输出视频文件的大小,完全按照视频的内容复杂程度来分配码率,这样视频的播放效果质量最好。

二次编码方式2PASS:

第一次编码检测视频内容的简单和复杂部分,同时确定简单和复杂的比例。第二遍编码会让视频的平均码率不变,复杂的地方分配多bit,简单地方分配少bit。这种编码虽然很好,但是速度会跟不上。

适用场景:VBR适用于那些对带宽和编码速度不太限制,但是对质量有很高要求的场景。特别是在运动的复杂场景下也可以保持比较高的清晰度且输出质量比较稳定,适合对延时不敏感的点播,录播或者存储系统。

特点

·码率不稳定,质量基本稳定且非常高;

·编码速度一般比较慢,点播、下载和存储系统可以优先使用,不适合低延时、直播系统;

·这种模型完全不考虑输出的视频带宽,为了质量,需要多少码率就占用多少,也不太考虑编码速度;


ABR:(Average Bit Rate)恒定平均目标码率,简单场景分配较低bit,复杂场景分配足够bit,使得有限的bit数能够在不同场景下合理分配,这类似VBR。同时一定时间内,平均码率又接近设置的目标码率,这样可以控制输出文件的大小,这又类似CBR。可以认为是CBR和VBR的折中方案,这是大多人的选择。特别在对质量和视频带宽都有要求的情况下,可以优先选择该模式,一般速度是VBR的两倍到三倍,相同体积的视频文件质量却比CBR好很多。

 

适用场景:ABR在直播和低延时系统用的比较多,因为只编码了一次,所以速度快,同时兼顾了视频质量和带宽,对于转码速度有要求的情况下也可以选择该模式。B站的大部分视频就选择了该模式。

 

特点:

·视频质量整体可控,同时兼顾了视频码率和速度,是一个折中方案,实际用的比较多;

·使用过程一般要让调用方设置,最低码率、最高码率和平均码率,这些值要尽可能设置合理点;



上面介绍了几种码率调控方案,在不同的编码器中有不同的叫法和称呼,细节可能不一样。但是基本都是通过影响QP的大小,然后进一步影响量化过程的颗粒程度实现的。具体在使用时需要进一步参考具体编码器实现。

一般优先使用ABR,在速度,码率大小,质量方面都能取得比较满意的平衡。其它VBR、CBR、CRF都有自己的场景,在使用时需要有条件使用。



总结思考:

今天介绍的视频码控方案,是很多上层技术的基础。其中码率自适应技术、根据场景都动态调整编码参数和RIO感兴趣区域编码等技术都建立在对编码过程中码控方案的选择和细化上,进而影响了编码的量化程度和量化颗粒,最终在视频质量、速度和带宽之间取得比较满意的平衡点。同时这些模型在不同的编码库如x264或者x265上,参数设置是互斥的,有时会因为参数设置不当造成码率失效,设置的参数不起作用,这点也需要特别注意。

其次,这块内容熟悉后,对一些线上问题的排查也很有好处。清楚调整帧率、分辨率等参数的调整副作用。也欢迎后台留言分享你实际项目这块的相关内容。


视频码控:CBR、VBR和ABR_码率