本文来自时任金山云算法总监朱政在LiveVideoStackCon 2017上的分享,并由LiveVideoStack整理而成。朱政阐述了金山云265方案(KS265)的演进之路,以及他们如何一步步在工程,算法和测试上完善金山云265。目前朱政已成为杭州微帧信息科技的创始人,继续在编解码这条路上探索极致。
文 / 朱政
整理 / LiveVideoStack
概览
金山云265大家或多或少都听过,因为其在某一方面确实有做的比较优秀。作为底层开发的团队,首先我会更加关注代码本身,其次会尽量多和大家分享一些干货。由于我们的技术不是开放和开源的,所以本次会根据金山云265的演进之路来分享一些偏宏观的经验心得和方法。
分享的主要内容为:
1,序章:致敬X264
2,金山云265破茧而出
3,痛点与解决之道
4,未来展望
序章:致敬X264
X264编码器的优秀应该是大家公认的,它号称是视频编码的守望者。X264虽然是一个开源的编码器,但几乎商用的编码器都做不到它那么好。它创造了许多众所周知的工具和名词,如Mbtree,CRF,2PASS。在国内外对X264的使用非常广泛,它繁荣了H.264的内容和生态。另外,如果要做一款非常好的编码器,并具有一定的速度和压缩性能的基础,是需要花很多年时间和精力的,而X264就极大地解放了视频编码底层开发的劳动力。
在这里先展示一下金山云265当前的性能对比:
性能摘要汇总
以Veryfast为例性能摘要
破茧而出
在最开始起步的时候,我们设定的目标就是要与X264复杂度对标,思考如何在保证HEVC高压缩比的情况下,速度和功耗无限接近X264。起初想的就是要从零开始和从实时档次开始做。接下来会给大家介绍我们这四年来的主要工作,会从以下四个方面来介绍:重构与推倒重来,工程化追求极致,算法,测试。
1, 重构与推倒重来
如果我们考虑从HM来改版的话,有一个好处就是工具比较全,但它的缺陷就在于重构优化难以驾驭,要想做实时就非常的难。所以我们就要从零开始,第一次从零开始,首先就要选取一些工具来实现,包括一些压缩性能非常好的复杂工具都需要精心设计。然后就是效仿x264的快速档,不做RDO。但第一次做出的版本,速度很不理想,和x264相比,Superfast档的差距非常大,压缩性能也没有多大的优势。因此,果断推倒重来,进行第二次从零开始。
积累之前的经验教训,对通篇更加熟悉,进行第二次从零开始,重新优化数据结构和算法流程,更加专注于极致契合极限编程,也实现更多的工具。
2, 工程化追求极致
在工程方面,我们投入了很多的精力。我们会进行快速迭代,不断试错,找到突破口;由于当时团队人数不是很多,因此采用小团队结对编程,每个人都要熟系所有的代码;每次都要单元测试先行,严格执行Code Review,每一处代码和数据结构都要精益求精;解码器也要追求极限速度;宗旨就是,不怕麻烦,只怕性能不够,因此几乎是把95%的精力都投入到5%的性能提升上。
下面给大家举个工程优化的例子:
解码器作为编码器的副产品,也耗费了大量的精力。现在已经做到了比OpenHEVC平均提速2倍,并且全标准支持,鲁棒性强。
3, 算法
由于不开源的原因,也就不能给大家分享核心的算法流程,但会在宏观上为大家介绍一下。在算法设计上,我们设定了高目标,一个月一次迭代。目前快速算法约70个,算法相关的配置参数约200个,配置参数应用到API接口的配置方法可能很多用户不知道,所以我们没有完全开放。在做快速算法的过程中,会往里面不断加入好的工具,为了将H.265的压缩性能发挥出来,所以它的一些压缩工具都要尽量用上。下面就是用到的一些快速档次工具集:
整个算法设计过程就是:设计和实验算法,调试bug和不匹配,实现新工具和新Feature优化代码。下面展示快速算法不同档次性价比:
4, 测试永不停歇
测试一方面可以分为性能测试和正确性测试两方面,另一方面也可以分为单元测试,CI测试,算法测试,版本迭代测试。
性能测试就包括了复杂度的性能和压缩性能,具体分为以下方面:
正确性测试也是涵盖多方面的,具体分为以下方面:
讲完上面四个方面,下面就来介绍一下金山云265的发展里程碑:
目前金山云265编码器支持的一些Feature:
痛点与解决之道
金山云265最开始的困难就是研发困难,包括复杂度高,浏览器Flash,JS不支持等,经过我们努力也想出了一些解决的办法。
在用户方面,经常会存在一些难点,比如播放体验差,带宽成本高等,这些使用我们的金山云265就可以得到改善。另外客户经常也会有一些顾虑,我们也都提供了相应的解决办法。
下面就给大家展示一个金山云产品解决方案,这是一个包含云转码,客户端SDK,全面覆盖直播,点播,短视频的解决方案:
未来展望
接下来,要做的事情,就是解决客户的多样化需求和本身编码器不平衡,以及不充分的研发之间的矛盾,所以会从之前着重于实时档,到现在的更关注慢速档,争取在离线转码上面有更好的压缩效率,在中低码率上面也会更多的关注高码率。另外就是在基础设施上面会更多的关注上层建筑,这里只是一个自己的定义,是代码内部的,上层建筑就包括像码控, 场景调优,主观调优,自适应量化,就像阿里云他们做的窄带高清的事情。另外我们还会尝试极致压缩,就是用深度学习在符合现有编码标准的框架里测试,是否能够获得更好的压缩性能。