zoukankan      html  css  js  c++  java
  • [译]CRF和QP的区别

    本文翻译自 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编码来决定对于某一特定源,应该用某种码率去编码。确保对于复杂场景有足够的码率去使用,而又不超过用户的带宽。

  • 相关阅读:
    为什么会决定进行分库分表,分库分表过程中遇到什么难题,如何解决的?
    MySQL主从复制什么原因会造成不一致,如何预防及解决?
    PyQt5(2)、垃圾分类小程序(2)——初代窗口程序可执行文件
    垃圾分类小程序(1)——实现查找垃圾的类别
    python上的数据库sqlite3——插入多行数据
    pandas.DataFrame——pd数据框的简单认识、存csv文件
    Beautiful Soup 4.2.0 doc_tag、Name、Attributes、多值属性
    第一个爬虫——豆瓣新书信息爬取
    Decorator——Python初级函数装饰器
    正则表达式——字符类、分支条件、分组
  • 原文地址:https://www.cnblogs.com/sunny-li/p/9979796.html
Copyright © 2011-2022 走看看