前言
随着互联网的发展以及智能终端的普及,视频已成为用户获取信息、休闲娱乐的重要媒体渠道。原始视频的信息数据量往往很大,对网络传输及本地存储都带来了很大的挑战,可以通过视频编解码器对原始视频进行压缩和解压处理,达到快速的传输和存储的效果。
目前广泛应用的H.264视频编码标准于2003年发布,并在之后的十年内得到了极大的普及,随后,H.265视频编码标准也于2013年首推,但它的普及却是困难重重,主要原因是专利收费主体不明及标准太高。直到现在,市面上仍有很多视频类应用采用H.264来进行压缩,可以说,即使过去了快20年,H.264编码标准依旧占据着视频编码的半壁江山。
x264开源编码器
说到H.264视频编码标准就不得不提x264了,它是基于H.264开发的一个开源编码器。自2003年开始,有很多视频编码领域的大牛不断地对x264项目进行开源共建。x264是一个极为成功的开源项目,降低了很多音视频项目开发的门槛,让音视频行业在近几年里得到了很大程度的发展。无论在工具集支持方面,还是工程优化方面,x264都是目前当之无愧最好用的开源H.264编码器。但是,在使用作为开源软件的x264的同时也存在着一定的法律风险,因为它遵循的是GPL(General Public License, 通用性公开许可证)开源协议,该协议指出任何软件及其衍生软件的使用、修改及发行前需要提供相应的源代码,方能获得上述权限。这是什么意思呢?简单来说,如果我们将GPL这样的通用性公开许可证用于商业软件产品,那么这类软件的所有代码都需要开源,这对任何一个商业企业而言都是不可接受的。举个例子,在2007年,Linux社区成员指责华硕公司没有遵守GPL开源协议,导致华硕公司最终公布了其运行Linux操作系统的完整源代码和所有核心数据!
OpenH264开源编码器
尽管x264的实用性众所周知,可由于前文所提及的x264 License协议潜在的法律风险,一个免费无风险的编码器已成为业务的更好选择。OpenH264是思科公司基于H.264标准开发的一个开源编码器,与x264不同的是其使用的BSD许可证允许将软件修改后的衍生软件以闭源形式发行,在商业应用中使用中不会带来法律风险。OpenH264是一个适用于实时场景的编码器,对一些实时通信场景中的工具集支持也较为完善,如SVC、长期参考帧等。但针对线上的场景,OpenH264依然无法满足要求,缺失了一些重要功能,如ROI、智能参考帧等。此外,与x264相比,OpenH264在编码效率、编码速度等方面存在差距。固定QP模式下的OpenH264编码速度比x264慢至少10%,比I帧编码速度慢了50%左右,同时存在高于5%的编码效率损失。从码控稳定性来看,在固定码率的模式下,OpenH264的码率控制容易出现呼吸效应(连续帧之间的质量差距较大),存在码率波动大、码率不精准等情况,种种因素使得OpenH264也并非一个最优选择。
O264RT编码器优化
O264RT是我们研发的高效率H.264编码器,支持Windows/ Mac/ Linux/ Android/ iOS等多个平台。我们从功能支持、编码效率以及编码速度提升等方面对O264RT进行了大量优化,接下来分别介绍下这几部分的优化点。
图1 O264RT支持的操作系统和处理器
功能支持
感兴趣区域(Region of Interest,ROI)编码在摄像头场景下非常有效,其基本思想是通过一些算法检测出人眼比较关注的区域(如直播场景下主播所在的区域),我们称之为感兴趣区域。该编码基于检测结果重新分配码率,通过提高感兴趣区域所分配的码率及减小其他区域码率的方式,在总码率不变的情况下提升主观编码质量。下面是一个感兴趣区域编码的示例图:
图2 原始编码方案(左) ROI编码方案(右)
智能参考帧也是实时通信中一个非常有用的技术,一般来说,为了达到最优的编码效率,往往会选择最近的帧作为参考帧,也就是我们常说的IPPP参考结构。但是当网络发生丢包时,IPPP参考结构中的某个帧的丢失将会导致后续的帧无法解码,引起卡顿、黑屏等问题,往往只能通过申请I帧来恢复。智能参考帧就是这种场景下的解决方案,编码器的参考帧选择更加灵活,且可以通过网络/解码端的反馈信息来去除掉一些传输失败或解码失败的参考帧,从而可以快速恢复丢包引起的卡顿现象。如下图所示,由于第四帧参考了第三帧,因而当第三帧解码失败时,第四帧也无法正确解码(此处存在信息反馈延迟的问题),但是,在第五帧编码之前可获得先前延迟反馈的信息,它将直接参考第二帧,因此可以正确解码恢复,整个过程不需要引入额外的I帧。
图3 智能参考帧编码方案
性能优化
码率控制是编码器中很重要的一个模块,通过动态调节编码的一些参数保证输出码率与预期码率接近,在实时通信(尤其是带宽受限的条件下)非常有用。针对码率控制模块,我们做了大量优化,支持SVC下分层码率的设置与调节。并且对码率分配、VBV buffer等算法进行调整,一方面提升码控性能、降低呼吸效应(尤其是低码率场景),另一方面提升码控精度(尤其是分层码率精度)。
此外,还支持帧内预测I8x8、Transform8x8等。随着现在各类业务场景分辨率的逐渐提升,选择大的块进行预测或者变换效率是更高的,因此加入这些工具集可以帮助我们提升编码效率、节省带宽。
图4 I8x8示意图
近年来,由于屏幕分享类场景的增多,用户对特殊优化的需求增大,如整像素搜索、十字搜索等。屏幕分享中画面突变会更多一些,因此需要支持VBR的码率控制算法,有些场景下基于时间戳的码率控制也是非常有必要的。
速度优化
相比于后台版本,用于端上的版本显然对性能要求会更高,包括CPU占用、内存占用、编码延时等。为了减少CPU占用,需要对编码器进行大量的速度优化,主要包含模式决策剪枝、SIMD、内存拷贝pingpong buffer逻辑等。
结语
目前该编码器已在公司内部开源,作为端上版本供内部产品使用。未来,我们将会持续迭代更新,做进一步的优化,如支持YUV444提升屏幕分享的质量、与网络端联合调优提升弱网环境下的流畅性等。我们将秉承公司的使命与愿景,一切以用户价值为依归,推动科技创新与技术发展,欢迎有志之士加入讨论!
请随时与我们联系并分享您的需求:
腾讯多媒体实验室
medialab@tencent.com