热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

x264源码分析与应用示例(三)——浅谈码率控制的优化问题

打算写几篇文章记录一下学习x264源码的成果,主要包含两个方面的内容,一是基本的x264视频编码流程,二是x264中的码率控制࿰

打算写几篇文章记录一下学习x264源码的成果,主要包含两个方面的内容,一是基本的x264视频编码流程,二是x264中的码率控制,之前分析过JM和HM的码率控制,但是x264的码率控制一直没看,这回也算是补上了。然后再以两个实际问题为例介绍通过研究源码后给出的解决方案,一个是如何修改编码参数获得更好的视频质量的问题,一个是修改源码改进x264码率控制算法的问题。

本文包含以下内容,由于这部分内容比较复杂,这么多年也都是大家研究的重点,我这里只做一个简单的介绍。

1、如何简单的通过修改命令行参数来优化码率控制的结果

2、如何从算法角度通过修改源码来优化码率控制的结果

首先需要明确的是,评价一个码率控制的结果好坏,基本上要看三点内容:1、码率是否准确 2、实时性如何;一半来说x264的2pass模式的码率控制效果最好,但却是完全不适合于实时应用的,另一种通过abr+vbv也能近似实现cbr的,只不过是一种平均码率上的constant(但是很多时候运营商是按照最大占用带宽来收费的,所以这种平均码率上的constant也有其不足之处),那么对于这种情况不同的vbv size就会对实时性造成影响了 3、质量;如果能够通过优化,实现同样码率下更好的质量,自然是最好的,这里的质量评价方法既可以用客观方法(PSNR、SSIM等)也可以进行主观评价实验来验证


简单的通过修改命令行参数来优化码率控制

x264的众多命令行参数中有哪些是和码率控制相关的呢?不了解的读者可以参见这篇文章。不过既然之前已经带着大家分析过源码了,是不是也可以试一下自己直接在源码里找出相关的命令行参数呢~

为了弄明白各个参数对最终结果的影响,可以通过反复修改命令进行编码来实验一下。这里我举一个简单的例子,在都使用2pass方法的前提下,修改参数(不同的GOP大小;是否开启宏块树码率控制mb_tree;不同的量化器曲线压缩参数qcomp;不同的自适应量化强度aq_strength;不同的rc-lookahead值)来比较最后的PSNR。首先使用如下的初始命令行。我这里用了ffmpeg,和x264相关的参数都在x264_opts后面了,我这里只是因为对ffmpeg的命令行更熟悉,其实和直接用x264是一样的。

 

ffmpeg -y -i test.mp4 -vcodec libx264 -tune animation -b:v 600k -pass 1 -x264opts keyint=500:bframes=16:b-adapt=1:b-pyramid=normal:open_gop=0:rc_lookahead=250:ref=9:me=hex:me_range=16:subme=9:psy_rd=0.90:trellis=1:deadzone-intra=11:deadzone-inter=21:threads=6:direct=auto:mbtree=0:qpmin=16:qpmax=56:qcomp=0.10:aq-mode=1:aq-strength=0.9:8x8dct=1 -f mp4 NUL && ffmpeg -y -i 1.mp4 -vcodec libx264 -b:v 600k -tune animation -pass 2 -psnr -x264opts keyint=500:bframes=16:b-adapt=1:b-pyramid=normal:open_gop=0:rc_lookahead=250:ref=9:me=hex:me_range=16:subme=9:psy_rd=0.90:trellis=1:deadzone-intra=11:deadzone-inter=21:threads=6:direct=auto:mbtree=0:qpmin=16:qpmax=56:qcomp=0.10:aq-mode=1:aq-strength=0.9:8x8dct=1 testout.mp4 2>testout.txt

A、使用这样的命令行对四部不同的动画片(都没有激烈的打斗画面)进行编码,都编码为600k,PSNR结果如下

序列1  43.93
序列2  46.672
序列3  42.384
序列4  41.46


B、在初始命令基础上验证不同GOP大小的影响,可以看到虽然动画适合采用长GOP,但是过长也会降低质量

keyint   250      500
序列1 44.401 43.93
序列2 46.659 46.672
序列3 42.415 42.384
序列4 41.534 41.46
 

C、在初始命令基础上验证开启宏块树码率控制的影响,可以看到开启之后会提升质量

mbtree      开        关
序列1    45.788 43.93
序列2    48.378 46.672

D、在初始命令基础上验证不同的量化器曲线压缩参数的影响,参数越大,越趋近于使用固定QP,可以看到该参数不适宜取得太大

qcomp    0.1          0.3          0.5      0.7          0.9
序列1   43.982   43.972   43.955   43.93    43.898
序列2   46.71     46.699   46.684   46.672  46.672
序列3   42.241   42.326   42.376   42.336

E、在初始命令基础上验证不同的自适应量化强度的影响,强度越大,对平坦区域的压缩质量越差,可以看到,对动画片,非常适合设置较小的量化强度

aq-strength     0.1          0.3         0.5          0.7       0.9          1.1         1.3        1.5           1.7       1.9
序列1          45.112   44.951    44.653    44.307   43.93     43.423   42.889   42.412    41.931  41.47
序列2          48.273   47.909                   47.103                 46.21     45.715   45.201    44.621  44.007

F、在初始命令基础上验证不同的rc-lookahead的影响,该参数对应于码率控制时可用的帧的数量,仅对码率控制精确程度有影响,对最终质量无影响,也是因为测试的动画类视频帧间差距不大的结果

rc-lookahead      40       100     150      250
序列1              43.93    43.93  43.93  43.93

G、再简单说一下其他几个很有意思的参数

subq:设置亚像素估计的复杂度,值越高复杂度越高,估计越准确,同时,值大于8时才会显著增加估计时间

i_qfactor:设置平均的I帧的量化器相比P帧量化器增值。更高的值意味着更高的I帧质量,过高的值会增加编码时间

trellis:使用网格编码量可以增进编码效率

fast_pskip:P帧的早期跳过决策,会增加耗时,同时质量提升不多

 


修改源码、算法来优化码率控制

待续……

 

关注公众号,掌握更多多媒体领域知识与资讯

文章帮到你了?可以扫描如下二维码进行打赏~,打赏多少您随意~

 

 

 


推荐阅读
  • 本文介绍了某点评网的搜索策略,包括名称和地址的匹配策略,模糊匹配的方法以及不同口音和拼音的近似发音。同时提供了一些例子来说明这些策略的应用。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
水灵ruru
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有