码率控制(二):CRF详解

在上一篇文章码率控制(一):理解码率控制模式(x264,x264,vpx)已经介绍过CRF(Constant Rate Factor)了,本篇文章进一步介绍CRF的原理。CRF是x264和x265默认的码率控制模式,在libvpx中也可以使用CRF。CRF取值在0到51间。取值越小质量越好压缩率越低,取值越大压缩率越高质量越低。

CRF在进行码率控制时不会试图达到某个特定码率,而是要保持稳定的质量。码流的大小将由源视频的复杂度决定。

对于x264,CRF建议取值在18到28间,默认为23。

ffmpeg -i input.mp4 -c:v libx264 -crf 23 output.mp4

对于x265默认为28。

ffmpeg -i input.mp4 -c:v libx265 -crf 28 output.mp4

libvpx没有默认值,它的CRF取值范围为0到63。对于1080p视频建议取值31。

ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 31 -b:v 0 output.mkv

如果你无法确定需要的CRF值,你可以从默认值开始慢慢尝试。如果质量低于预期则减小CRF,如果文件太大则增大CRF。每当CRF增大/减小6,文件尺寸将减半/加倍。

CRF应该用于离线场景以达到最优效果。

码率如何变化?

为了让你直观了解不同分辨率视频的码率与CRF的关系,下面给出了复杂度不同的4段1分钟视频的平均码率(MBit/s)与CRF的关系。编码器为x264。

可以看出不同分辨率的视频的码率和CRF都满足对数关系。

CRF vs CQP

CQP模式在编码时会保持每帧的QP不变,例如设定QP=18,则整个序列每帧的QP都为18(依据帧类型不同会有QP offset,但是影响不大)。而CRF会通过动态调整每帧的QP保持质量恒定,例如编码是设定CRF=18,对于运动多的帧QP可能增加到20,运动少的帧QP可能会减小到16。

下图是QP和CRF等于17和23时,每帧比特数的变化。

可以看到CRF的比特数总是少于QP,意味着保持质量的同时CRF能节省比特。

为什么运动如此重要?

相比运动物体,人眼对于静止物体能感知到更多细节。因此,编码器可以对运动物体采用更大的压缩(去除更多细节),对静止物体采用更小的压缩(保留更多细节)。

人眼视觉系统会被运动分散注意力,且运动物体在屏幕上停留时间少,所以能觉察到的失真少。而静止物体在屏幕停留时间长有足够时间观察,且无法分散注意力,所以能觉察到的失真多。

用什么评价指标?

如果你用PSNR等简单的评价指标比较视频质量,你可能会发现CRF的质量低于CQP。但是人眼主观观察可以发现CRF的质量不低于甚至高于CQP的质量。这是因为PSNR等指标不考虑感知质量,仅考虑每帧的统计结果。可以使用VQM或VMAF进行主观评价。

翻译自:https://slhck.info/video/2017/02/24/crf-guide.html

感兴趣的请关注微信公众号Video Coding

码率控制(二):CRF详解相关推荐

  1. IdentityServer4实战 - 基于角色的权限控制及Claim详解

    一.前言 大家好,许久没有更新博客了,最近从重庆来到了成都,换了个工作环境,前面都比较忙没有什么时间,这次趁着清明假期有时间,又可以分享一些知识给大家.在QQ群里有许多人都问过IdentityServ ...

  2. CORS跨域资源共享(二):详解Spring MVC对CORS支持的相关类和API【享学Spring MVC】

    每篇一句 重构一时爽,一直重构一直爽.但出了问题火葬场 前言 上篇文章通过我模拟的跨域请求实例和结果分析,相信小伙伴们都已经80%的掌握了CORS到底是怎么一回事以及如何使用它.由于Java语言中的w ...

  3. DFT - 对芯片测试的理解(二) 详解

    DFT - 对芯片测试的理解(二) 详解 参考: https://www.docin.com/p-2014360649.html The basic view of DFT scan chain 这图 ...

  4. [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution)

    [深入浅出Cocoa]之消息(二)-详解动态方法决议(Dynamic Method Resolution) 罗朝辉 (http://www.cnblogs.com/kesalin/) 本文遵循&quo ...

  5. ViewPager 详解(二)---详解四大函数

    前言:上篇中我们讲解了如何快速实现了一个滑动页面,但问题在于,PageAdapter必须要重写的四个函数,它们都各有什么意义,在上节的函数内部为什么要这么实现,下面我们就结合Android的API说明 ...

  6. RxJS 系列之二 - Observable 详解

    查看新版教程,请访问前端修仙之路 RxJS 系列目录 RxJS 系列之一 - Functional Programming 简介 RxJS 系列之二 - Observable 详解 (本文) RxJS ...

  7. 十二、详解计算网络中的流量控制和差错控制、HDLC

    十二.详解计算网络中的流量控制和差错控制 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动 ...

  8. 32.深度解密三十二:详解影响QQ群整体排名的那些秘密

    网络营销推广技术.技巧深度解密(三十二)指南: 1.本文档适合零基础以及互联网营销推广人员,主要讲解营销QQ群排名的一些问题. 2.原创版权文档,任何抄袭或者全部.部分模仿都是侵权行为. 3.敬畏法律 ...

  9. java控制excel_利用Java控制EXCEL实例详解

    利用Java控制EXCEL实例详解发布者:本站     时间:2020-05-06 15:05:43 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵 ...

最新文章

  1. boost:从0到1开发boost(linux、clion)
  2. 重命名某文件夹下所有文件的名字 python3
  3. VPGAME 的 Kubernetes 迁移实践
  4. html的文档类型三种,XHTML文档类型
  5. Bootstrap中DropDown插件显示下拉列表,点击下拉列表区域,不会再自动关闭。
  6. hwclock: Open of /dev/rtc failed, errno=19: No such device.
  7. SQL学习--Select(一)TOP、派生表、连接、谓词
  8. 影响历史进程的三只苹果
  9. Pyinstaller打包过程中报错“AttributeError: 'str' object has no attribute 'items''”问题解决
  10. maven 构建spring boot + mysql 的基础项目
  11. 深度优先遍历,广度优先遍历
  12. 手把手入门C语言—输入数组
  13. 特斯拉看位置说服务器错误,特斯拉App惊现大面积宕机!车主集体发飙,官方处理太弱智了...
  14. U-Boot启动过程完全分析(转)
  15. Python OpenCV 横向平铺图像制作长图
  16. Nginx缓存问题导致的数据异常解决
  17. 利用多condition动态管理池化的异步资源背景,干货满满
  18. 15个自学视屏网站,
  19. 电动汽车智能充电桩的设计应用 具体功能介绍
  20. TS流压縮音频的自动增益控制方法

热门文章

  1. 87: 企业监控系统部署 、 搭建Harbor私有仓库 、 总结和答疑
  2. 推荐算法评测方法总结
  3. 如何将计算机的名称改成英文翻译,电脑中的文档怎么进行中英文的翻译
  4. 计算机net是什么意思翻译,net是什么意思_net翻译_读音_用法_翻译
  5. 《奇葩说》詹青云:熬过那些日子,你才有资格过不被人左右的人生
  6. 网络流之最大流算法——EK算法(通俗讲解)
  7. far在c语言中作用,C语言中的far关键字
  8. 孙子兵法——【12】(百家讲坛观后记录)
  9. PMP除了应征PM职位外哪些职位可能会用到呢?
  10. Shader学习23——描边+辉光