以往我们说起来编码效率优化,都是想得如何去优化编码器里面的算法,但是netflix的一些做法给了我们新的启示,也许不用费劲去研究编码算法,只是改变一下编码器的用法,一样能获得更高的编码效率,节省更多的带宽。
一、Per-Tiitle Encoding
2015年的时候,netflix推出了per titile encoding方案,简单来说就是依据每个视频的特性,比如时间复杂度和空间复杂度,来决定服务端编码的码率级别,不同于以往给所有视频统一码率级别的编码方式,这种方法可以更好的平衡质量和带宽。
很显然,对于小猪佩奇这样的动画片,画面简单,没有复杂的运动,我们可以用很少的码率达到很高的质量,但是对于复仇者联盟这样的电影,打斗场面丰富,就需要相应的稍高的码率了。
netflix没有专门去研究时间复杂度,空间复杂度,码率与主观质量之间的关系,而是采用了一种更加简单粗暴的方法,如下图。将一个片源按照不同分辨率码率组合进行编码,计算psnr值,画出r-d曲线图
图中红色曲线是r-d曲线的凸包,对于每个分辨率的曲线,最接近凸包的点即为编码效率最好的点,这些点就选为最终的分辨率-码率参数。
效果如何呢?参考下图
这是对一个普通电影的优化效果,这部电影的复杂度适中,中间的黄色栏是采用固定码率级别时的情况,右边表格的绿色部分分别展示了使用per title encoding后所节省的码率以及相应的psnr值,平均下来可以在不降低质量的前提下减少20%码率。
再来看动画片的情况,如下图
因为动画片的复杂度很低,所以甚至可以减少至原来码率的30%
推荐一个Per-Titile技术的视频讲解链接
视频讲解链接如下:
Per-Title Encoding: Netflix-Style Optimization for Quality and CDN Costs
Netflix文章如下:
https://medium.com/netflix-techblog/per-title-encode-optimization-7e99442b62a2
我们原来在学校做的类似系统:
https://blog.csdn.net/leixiaohua1020/article/details/46754977
到了2016年,netflix又提出了新的方案,基于他们的并行编码框架,视频是一个一个chunk进行编码的,于是他们将per title进一步细化到了chunk的级别,分析每一个chunk的复杂度,赋予每一个chunk不同的码率,更进一步的提升编码效率。原文摘录如下:
In our parallel encoding pipeline, the video source is split up into a number of chunks, each of which is processed and encoded independently. For our AVCMain encodes, we analyze the video source complexity to select bitrates and resolutions optimized for that title. Whereas our AVCMain encodes use the same average bitrate for each chunk in a title, the mobile encodes optimize the bitrate for each individual chunk based on its complexity (in terms of motion, detail, film grain, texture, etc). This reduces quality fluctuations between the chunks and avoids over-allocating bits to chunks with less complex content.
文章链接如下
https://medium.com/netflix-techblog/more-efficient-mobile-encodes-for-netflix-downloads-625d7b082909
在这篇文章中,netflix还提出了他们所做的一些编码参数上的调整方法:
- 使用avc high profile代替avc main profile,更多设备已经支持high profile了,同时high profile也包含更多高级的编码算法,压缩率更高
- More consecutive B-frames:更长的b帧长度
- Larger motion search range:更大的运动搜索范围,减少帧内编码
- Increased random access picture period:更长的gop
效果如何呢?在这里以前面提到的per title encoding为基准,如下图
在达到相同psnr的前提下,可以在per title encoding的基础上节省15%的码率。
https://medium.com/netflix-techblog/dynamic-optimizer-a-perceptual-video-encoding-optimization-framework-e19f1e3a277f
基于前面的两项工作,netflix更进一步,利用镜头分割算法,可以把优化的单元进一步细化到片源中的每一个镜头,即所谓的shot based encode,针对每一个镜头的特点给出最好的编码方案。而其中的理论原理,其实和2015年时的per title encoding差不多,是利用r-d曲线的凸包来完成的。
如下图
用各种分辨率和码率编码一个shot,计算distortion,画出r-d曲线,然后寻找该曲线的凸包,如下图,最后所选取的码率-分辨率组合一定是凸包曲线上的点
根据不同的需求,确定每一个镜头的编码参数,把这些镜头拼在一起,即得到最终的码流,如下图
那么效果如何呢?在这里以第二节提到的per chunk encoding为基准,如下表,表中AVCHi-Opt为shot based encoding,AVCHi-Mobile为chunk based encoding,在相同主观质量的前提下,可以再减少17%的码率。
当然,shot based encoding将编码流程的复杂度提高了一个量级,对此netflix也有专门讲解他们对编码流程做了那些优化,如下
https://medium.com/netflix-techblog/optimized-shot-based-encodes-now-streaming-4b9464204830
最后,我们把眼光转向国内,可以看到,国内的厂商也开始做类似的工作了,比如优酷大肆宣传的窄带高清2.0,基本的思路和上面一样,并没有做特别多的编码器优化,只是更合理的使用编码器而已。