摘要: 这一次的世界杯,与以往世界杯最大的区别在于,有不少互联网用户观看直播,而不是在电视上。在互联网观看直播,互联网的网络条件不同,观众会看不一样码率的视频。因此主要分享下阿里云在直播中怎么作码率控制。
在本月的重庆云栖大会飞天技术汇专场中,阿里云高级算法专家黄海宇分享了题为《超大规模直播码率控制》的议题,从生产的链路角度来讲世界杯怎么让观众看到更加清晰的视频。算法
这一次的世界杯,与以往世界杯最大的区别在于,有不少互联网用户观看直播,而不是在电视上。在互联网观看直播,互联网的网络条件不同,观众会看不一样码率的视频。因此主要分享下阿里云在直播中怎么作码率控制。网络
分享分三个部分,首先讨论一下为何要关注码率控制、其次是宏观上怎么作码率控制,最后是介绍下微观上怎么作码率控制。并发
咱们先看一下个直播的一个简单的过程。优化
世界杯一般会拿到一个很是高清的直播源,它的码率很是大,不太适合在互联网上直接传输。因此整条链路中会有一个视频内容的再生产的过程,这个再生产的过程最重要的就是视频的转码,将这个转成不一样分辨率的几个档位。好比说咱们看视频有流畅的、标清、高清、超清的视频,这些都是为了让不一样网络的用户能够流畅的观看视频。在进行转码之后,视频流会通过CDN放大,不少用户会进行观看。阿里云
其中,码率控制是发生在转码这个环节,就是把高清视频进行解码再进行从新编码,视频的转码是一个有损的压缩的过程,把原来的视频进行处理,将里面的细节进行忽略,这样可以以一个更低的带宽去知足用户播放流畅的需求。编码
第一,码率控制对清晰度有影响。咱们一般的概念是清晰度越高码率越高,要求用户的下行的带宽更高。spa
第二,码率控制影响用户流畅度的影响,用户播放的网络各不相同,当用户的带宽大于视频码率时,才够流畅播放。视频
第三,码率控制的影响是成本的影响,在整个世界杯直播的过程当中,最大的费用在CDN带宽上,CDN的总带宽消耗为不一样的码率以及这种码率并发在线人数的乘积之和。ip
因此咱们的问题是用户的网络是有限的,咱们如何在有限的网络下最好的控制码率,提供给用户最清晰的视频。get
下图是一个在世界杯期间直播的例子,左边是另一个直播平台作的一个视频直播,右边是优酷上面的。能够清楚的看到左边的视频在抢角球的场景是很模糊的,而右边的视频是看起来比较光滑和细腻的,这两个视频是相同的码率,左边是1080P的2.5M,右边是720P的2.5M,可是为何会出现这样的场景?
咱们先看一下整个视频编码的过程是怎么样的:
下图上面这条线是一个1080P的视频转成1080P的视频进行播放的一个流程,首先是解码,这一步是不会有视频清晰度的损失的;而后是视频的编码,好比说一个视频25帧,须要把这25帧的图像编码成3M的1080P的图像,在这个过程当中,为了保证输出码率为3M,有大量的细节损失;第三步是这个视频通过了CDN网络的传输到达用户的播放器,用户会进行解码播放,这一步是没有信息的损失。最后一步是播放器的渲染,这一步也没有信息损失。
咱们再来看720P转码,通过1080P的视频解码,下采样到720P,720P编码,传输,解码,最后在播放器端进行上采样,从新编成1080P以及渲染的过程。这个过程当中有两次的视频清晰度的损失,第一次是发生在上采样以及下采样的过程当中,这个信息其实是一个固定的损失,它和咱们的采样算法有关系;第二是在720P的图像编码成3M的视频中发生的。为何1080P不如720P清晰,是由于在720P编码中,咱们能够把720P的每个象素都描述得很是清晰,这部分的信息损失加上采样的信息损失只和小于1080P编码时的信息损失。
因此总结一下咱们须要控制码率。码率控制的目的就是在必定的带宽条件下,须要使每个比特都可以发挥它的做用,把它分配到最须要他的地方,从而提高用户的观看体验。
说到把每个比特分配到最须要它的地方,一般会有不少方式,在整个编码过程当中什么地方有信息的损失,就能够在哪里作。好比:
第一是在分辨率作文章,对给定的码率,能够选择不一样的分辨率进行调整。
第二是在帧率作文章,对给定的码率,能够选择不一样的帧率。
第三是在视频中码率在不一样的帧间进行码率分配,对于复杂的场景,分配更多码率,对于简单的场景,分配较少的码率。
第四是在帧内进行码率分配,在一帧以内,根据图像的复杂程度和人眼敏感程度进行码率分配。
在世界杯实现的场景中,要考虑到播放器的兼容性,使用的是分辨率、帧间码率,帧内码率的优化手段。
首先看一下在宏观的码率选择上,如何去根据码率选择一个最佳的分辨率。
这是一个对世界杯的视频作的试验,采用不一样的分辨率来进行编码,相同的码率进行编码。上图能够看到信息的损失量,咱们能够在相同的码率下,随着咱们的分辨率的增高,实际上视频的清晰度逐渐升高。到了一个最高点之后,反而会因为视频的分辨率的增长,它的清晰度会下降。这也验证了以前咱们看到例子。
因此根据这样一条曲线能够获得分辨率和码率的模型,对于任何一个分辨率能够找到一个最佳的码率。在实际上世界杯的这个场景中,咱们把视频分红了不少码率,在给定的任意一个码率上咱们都能找到相应的分辨率。
若是关注过阿里云的直播,会看到转码的建议上会给出不少不常见的分辨率,好比说432P、648P这样的分辨率,这些分辨率一般能在相应档位的码率上获得很好的清晰度。
说到微观上的码率控制的时候,第一件事情就是如何将码率在不少帧间进行分配。
上图给出了多种码率分配的算法,第一个算法是传统的CBR,就是说无论视频的变化是怎么样,统一采用相同的码率对视频进行编码,尽可能作到每一秒的码率是相同的。CBR是途中的红线,咱们能够看到实际上视频清晰度的损失波动很是大,在红线中能够看到高的时候能够很是高,低的时候很是低。在播放的时候确定不但愿可以看到一个清晰度剧烈抖动的视频,这对人眼的观看是极其糟糕的,因而咱们尝试用一种叫CQP的方式进行视频编码,这实际是肯定了视频编码的量化步长,这个状况下能够获得清晰度相对稳定的视频。可是采用这种编码不是没有代价的,采用CBR时码率比较稳定,可是采用CQP,在画面比较复杂的地方,为了把这个清晰度提升,码率就会很是高,能够看到,在右图中,CQP(绿线)的码率飙到了12mbps,这对普通用户来讲显然是不能够接受的。因此最终采用了VBR+VBV的方式。当使用VBR+VBV的控制策略之后,蓝线比红线的码率质量波动会稍微好一点,VBV模型也能保证用户带宽在达到VBV指定最大码率时,视频必定可以流畅播放。
VBR在大规模直播中也会带来一些问题,这张图是在世界杯的开幕式的时候一张CDN的带宽的分布图,横坐标是时间,纵坐标是CDN的带宽。
这个图就能够看到两个很是明显的波动,第一个发生在中场休息,第二个发上在23:00,开幕式结束,比赛正式开始前。第一个波动很好解释,由于中场休息时不少观众离开,中途的精彩进球会回来一部分观众,下半场开始又有不少观众继续观看。在前面的波谷就不太好解释了,经过观察了码率的分布图,咱们发现当时码率很是低,实际上,在这段时间正好是普京讲话,这是一个相对静止的画面,因为采用了VBR,码率发生了剧烈的波动,从而引发带宽剧烈波动。
这种波动对一般的直播是没有问题的,不一样的用户在看不一样的直播,因此码率的峰值叠加起来会趋向于码率的平均值。可是世界杯的场景下,有70%的流量都观看相同的直播内容, CDN的带宽很是高,这使得CDN的带宽随着码率的波动而波动。一般的CDN一般会使用当前的水位来评估一个新进用户应该放在什么CDN节点,或者说根据一些历史的情况估计CDN放在什么节点。在世界杯中,这个问题经过CDN引入新型的调度策略来解决。
帧内码率分配考虑的是如何在一帧图像内对码率分配,以获得最好的视觉效果,咱们会根据人眼的关注点来调整码率分配。在上图中,人眼关注的重点毫无疑问是梅西的头像,人眼可能会对后面虚化的内容不关注。因此在作转码处理的时候,会优先考虑这个图像的聚焦区在那里,在这些地方提升它的码率。另外一方面,人眼对规则的纹理很是敏感,这部分也须要分配更多的码率,而在脱焦区域,咱们会适当的减小一些码率。经过上述手段,整个视频的码率没有上升,但人眼的主观感受会更清晰。
本文做者:樰篱
本文为云栖社区原创内容,未经容许不得转载。