在视频编码中,有一个模块是码率控制,即通过选择一系列编码参数,使得视频编码后的比特率满足所需要的速率限制,并且使编码失真竟可能小。该模块严格上不属于视频编码标准,属于率失真优化有两范畴。码率控制分为两个步骤,一个是码率分配,二是确定量化参数;
在实际应用中,存在好几种码率控制方法,分别是CBR,VBR,ABR和CVBR,下面对着四个技术进行展开:
CBR:constant bitrate
顾名思义,以恒定比特率方式进行编码,有运动发生时,由于码率恒定,只能通过增大QP来减少码字大小,图像质量变差,当场景静止时,图像质量又变好,因此图像质量不稳定。这种算法优先考虑码率(带宽)。适合在流式播放中应用。CBR编码的缺点在于编码内容的质量不稳定,容易产生马赛克。因为对于某些较复杂的图像比较难压缩,所以CBR流的某些部分质量就比其他部分差。
具体的,一段视频一共有10分钟,我们设置的码流为1M,那么这个视频中每一秒的画面都是1M码流。
VBR:variable bitrate
顾名思义,即以可变的比特方式进行编码,比特分配根据图像内容的复杂度进行。如果图像细节较丰富或者含有大量的运动,则给其分配大一点的码流,若图像比较平坦,就给其分配较少的码流, 这样既保证了质量,又兼顾带宽限制。这种算法适合图像内容变化幅度较大的情况;
适合的应用场景是媒体存储,不适合网络传输;
ABR:average bitrate
平均比特率,是在CBR和VBR两者之间的一种权衡,即设定一段时间的平均码率,在此时间内,对简单,静态的图像分配低于平均码率的码率,对于复杂的,大量运动的图像分配高于平均码率的码流;
适合网络传输;
CVBR:Constrained VariableBit Rate
是VBR的一种改进方法,对应的Maximum bitRate恒定或者Average BitRate恒定。兼顾了CBR和VBR的优点:在图像内容静止时,节省带宽,有运动发生时,利用前期节省的带宽来尽可能的提高图像质量,达到同时兼顾带宽和图像质量的目的。这种方法通常会让用户输入最大码率和最小码率,静止时,码率稳定在最小码率,运动时,码率大于最小码率,但是又不超过最大码率。比较理想的模型如下:
码率控制:
对帧间图像进行码率控制:
可以根据被参考的重要性来分配码率,如过某个帧经常被参考,则给他分配多点的码率,如果没有被参考,则可以分配少点的码率;
对帧内图像怎么进行码率控制;
细节多的分配少点的码率,比如石头,树枝,运动物体分配少点码率,因为被参考的可能性不大;
如果一个块被选中是帧内模式,怎么改可以让它选择帧间模式;
改lamda?码率控制?不知道;
在做足球直播时,固定码率好还是固定QP好?固定QP好,可以节省码率;
如果固定码率,则在画面静止时会浪费带宽,而固定QP时,画面静止时也不会浪费太多的比特;
转发自https://www.cnblogs.com/sunny-li/p/9979796.html
本文翻译自 https://slhck.info/video/2017/02/24/crf-guide.html ,不当之处,请多指教。
----------------------------正文-------------------------
什么是CRF?
CRF是264和265中默认的质量/码率控制设置。这个值可以在0到51之间,值越低,质量越好,文件大小越大。在x264上面,一般取值为18-28,默认值是23。在ffmpeg中,crf是这么使用的
ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4
在x265中,默认的crf值是28
ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4
如果你不确定要用哪个crf的值的话,请先用默认值,然后根据你对输出质量的主观印象去调整。大约crf的值差别为6就会导致文件大小的加倍或减半。
你应该在线下的文件存储中使用crf的编码,来获取一个最佳的编码方式。对于其他的使用场景,请使用其他的码率控制模式。
------------------------------------------------------------------------------------
CRF和QP
CRF是恒定质量的编码方式,与恒定码率(CBR)是相反的。通常,为了获取恒定质量的编码,我们可以通过用同样的大小去压缩每一个相同类型的帧,即,扔掉相对来说相同数量的信息。用专业术语来说,就是使用相同的量化参数QP。这个量化参数QP定义了从一个像素宏块中丢掉多少信息。通常这将导致整个视频序列的码率不稳定。
不过,这里所说的CRF比恒定量化参数要复杂一点儿。CRF会用将每一帧的压缩不同的大小,为了让主观的质量感受差不多,会用不同的QP。他是通过把运动也考虑进来做到这一点的。在编码中,如果Qp=18,则每一帧都是QP=18,当然根据帧的类型不同会有一些微小的波动,忽略之。设置CRF=18的时候,对于运动比较大的场景,会把QP设得更高一些,对于运动比较比较不剧烈的帧,会降低QP。这会导致比特率的分配随时间变化不同。
例如,下图展示了两个不同的视频(BBB big buck bunny和TOS tears of steal),用不同的等级去编码(17和23),分别用恒定量化参数CQP和恒定质量CRF模式
我们看到,CRF的线总是比CQP的要低,意味着采用CRF模式的时候,可以省比特数,而采用CQP的时候,稍微会浪费一点文件大小。
为什么运动这么重要?
比起运动的物体,人眼对静止的物体会观察到更多的细节。基于这一想法,编码时,对运动物体给更高的压缩率,而对静止的物体保留更多的细节。
用外行的话说,这是因为你的视觉系统会被运动分散注意力,而不会有足够的时间去注意运动物体的细节。用专业术语来讲,运动掩盖了块效应。从另一个方面来说,当一帧运动不够大时,人就会话更多的时间去注意图像的细节了,所以你希望压缩的越少越好。这个时候的压缩噪声对于人眼来说就比较显著了。
你可能会问,那么CQP是不是会取得好的视频质量呢?事实上,感官感受是差不多的,只是CQP的模式会在你不真正注意的区域浪费更多的空间。
从应用的层面来说,很多人都会在单通道的编码使用CRF,另一个采用CRF的原因是这个是开发者x264或x265时默认选择的码率控制模式。
定量的视频质量怎么样呢?
如果你有一些简单的方式可以比较视频质量的话(比如,比较每一帧的PSNR),你会发现CRF的质量比CQP的要差。但是如果你用人眼去主观评价的话,CRF和CQP看起来差不多。它对于人眼比较关注的地方压缩的比较小。客观质量评价可能会比较差,但主观质量还是可以的。
这其实有一个对于简单的质量评价方式psnr或ssim的一个质疑,它不能把运动之类的影响人眼的感受的因素考虑进去,因为他们是逐帧去评价的。一些评价标准,像VQM和VMAF对于评价视频来说是更好的一种方式。
质量和比特率之间是什么关系?
不是所有的视频都是一样好压缩的。运动较少,细节较少的视频是比较容易压缩的,反之相反了。这里说的容易是指,同样的码率的情况下,比较容易达到更好的图像质量。
CRF解决这一问题,对于不同的视频,不同的CRF参数导致不同的码率。事实上,你无法根据码率估计crf的参数。
例如,你把CRF设成23,对于一个视频源,你会得到1500 kb/s,而对于另一个,你会得到1000kb/s,两个看起来质量差不多。事实上,CRF要做的,就是保留确定数量的细节,不管用多少码率。
云编码服务Bitmovin在正式编码之前,也用CRF来评估视频的复杂度。
需要注意一点,如果你的CRF选的太高(比如30),你会看到在运动比较剧烈的地方有很多的块效应,因为这些地方的码率太低了。编码器会对更复杂的区域用QP32,如本文开头提到的,根据你想要的视频质量选择要的CRF参数。
为什么你还是会在电视或者网络上看到很多块效应呢?
为什么呢?问题是对于这些视频,他们用了太低的码率,特别是在广播中,码流是用固定码率去压缩的,这样就不会考虑运动了。因此,一些电视节目在真正复杂的细节的图像处没有采用相应的压缩率,看起来就比较多的块了。
现在的码流处理会更加的智能一些。youtube和neflix用2-pass甚至3-pass的算法,对于后者来说,采用CRF编码来决定对于某一特定源,应该用某种码率去编码。确保对于复杂场景有足够的码率去使用,而又不超过用户的带宽。