大家都有在网络上观看视频的经历,与观看本地视频不同,通过网络看看视频的时候常常会发生卡顿,那么,发生卡顿的原因是什么呢?
网络视频从服务端到用户端通常会经过如下流程:
视频源 -> 视频编码(转码)-> 网络传输 -> 播放器解码 -> 渲染到屏幕。
这个过程中的每一步都有可能导致视频出现卡顿,接下来主要分析视频编码步骤对播放卡顿产生的影响。
1、视频编码的基本原理:
我们在屏幕上看到的视频都是由一幅幅时间上间隔很小的图片组成的,当这些图像间隔小到一定程度的时候,人眼就能看到连续的画面。我们把一张图片称为一帧,把一秒内出现的图片的张数称为帧率(通常互联网视频的帧率为25帧)。
由于相邻两帧的时间间隔非常近,连续的帧之间在时间上存在着很大的冗余信息。目前大部分的视频编码技术都是用图像编码方法对第一帧进行编码,然后用某种方式描述接下来的帧相对于附近的帧有什么区别(例如,上一帧左上角的一小块图片跑到了这一帧的什么位置),最后对这些描述信息进行熵编码(类似霍夫曼编码)。可以看到,对于视频的第一帧,不需要参考其他任意帧就能够将该帧还原出来,我们把这样的帧称为I帧。对于那些需要依赖前面的帧才能解码出来的帧,称为P帧。在实际应用中,为了利于迅速解码视频的某一帧,视频中会插入很多I帧,而不仅仅把第一帧作为I帧。
视频文件的大小除以是视频的时长定义为码率。码率是视频清晰度的重要指标,一般来说,码率越高,清晰度越高。也许大家习惯以分辨率来表示视频的清晰度,但实际上,单以分辨率表示视频的清晰度仅仅在视频没有经过编码才有效。当视频没有经过编码时,如果分辨率越高,那么视频图像的细节越清晰。但如果视频经过编码,被限制在一定码率内,编码器就必须舍弃掉一部分细节,即使视频的分辨率非常高,在有限的码率下视频也会变得非常模糊。在某些情况下,对一定码率的视频,稍微低一些的分辨率有可能反而比高分辨率的效果更好。
2、流媒体:
在观看网络视频时,用户一边下载一边观看视频,而不要等整个视频文件下载到自己的计算机上才可以观看,我们把这种技术称为流媒体技术。为了达到这个目的,需要先在用户端先创建一个缓冲区,播放器的下载模块不断从网络下载数据到缓冲区,而播放器的解码模块不断的从缓冲区读取数据,解码并渲染到显示器上。当缓冲区不为空时,视频将保持流畅播放。
我们假设用户下载视频数据的速度是固定的,那么用户下载到的视频数据是一条随时间而线性增加的直线。播放器播放的视频数据也是一条随时间而增长的曲线。我们可以将这两条线画到一张图上,如图1所示:
图1:用户下载数据与视频播放曲线
图1中,蓝色直线代表用户下载数据随时间的变化,红色曲线代表播放器所需数据随播放时间的变化。注意到红色曲线并不是从时间0开始的,因为播放器开始需要缓冲一部分视频才开始播放。图中蓝色和红色的线相交的地方会发生卡顿。若需要用户一直不发生卡顿,必须使红色的曲线一直位于蓝色的直线之下。
3、CBR、VBR、ABR:
图1红色的播放数据曲线是一根伪造的数据曲线,并不是真实视频的数据。对于真实的视频,这个红色的曲线是有编码器的码率控制方式确定的。目前主要的码率控制方式有3种,分别为CBR(Constant Bitrate)、VBR(Variable Bitrate)、ABR(Average Bitrate)。
CBR:指的是码率基本均匀的分布在了视频的每个时间点上。由于码率是均匀分布的,所以,播放器所需数据随播放时间的变化曲线也为一条直线。很明显,CBR的视频是非常适合网络播放的,因为在有一定缓冲的情况下,只需要略小于视频码率的视频下载速度就能流畅播放了,如图2所示,对于这个长度为45s,码率为2180kbps的CBR视频,在有5s缓冲的条件下,只需要2000kbps的稳定下载速度,就能流畅播放该视频。
图2:流畅播放CBR所需下载速度
但CBR在现实中用得非常少,因为CBR有一个致命的缺点:从前面视频编码的基本原理可知,当视频画面处于相对静止的时候,用于描述P帧与相邻帧的差值所需的数据量是非常小的,因此对于这样的画面,实际上不需要太多的码率,但对于运动比较剧烈的画面,相邻帧之间的差别也非常大,需要较多的码率才能描述清楚相邻帧的差别。如果采用了CBR,那么,在视频画面变化较缓慢的地方,视频会非常清晰,在视频画面变化较大的地方,视频会变的非常模糊,满是马赛克。因此,现实中一般都不采用CBR的方式。
VBR:指的是码率是可以任意波动的。当使用这种方式时,对变化较快的画面,通常会分配较多的码率,对变化较小的画面,分配较小的码率。在编码的时候,编码器可以先对视频进行一次扫描,分析哪部分视频需要分配较多的码率,哪部分视频需要分配较小的码率。在得到分析结果后,再根据得到的码率分配进行编码,这样得到的编码视频可以保持视频所有时间清晰度基本相同。对于非网络播放的视频,VBR是非常合适的。但对网络视频来说,VBR由于码率波动过于剧烈,很容易造成用户卡顿。
ABR: ABR是介于CBR和VBR之间的一种码率控制方式。ABR没有对视频提前扫描的过程,而是在编码的过程中进行码率分配,所以,在指定码率下,码率并不是在全局上最优分配的,而是尽量在局部动态分配码率。
4、实例分析
让我们看看具体视频的码率情况,我们以腾讯视频《中国好声音3》中剪辑下来的《贝加尔湖畔》为例。
图3展示的是该视频的码率随时间的变化曲线。为了更能看清楚码率的变化,没有把每一帧的码率都画出来,而是取了长度区间为11s的滑动平均。可以看出,该视频的码率并没有非常大的波动,大部分控制在750kbps~1500kbps之间。另外,视频处于某个高码率的时间也不会太长,应该采用了ABR的码率控制方式。
图3:《贝加尔湖畔》码率分布
为了流畅播放该视频,需要找一条下载直线,正好与视频的播放曲线相切。图4展示了在5s缓冲的条件下,所需要的下载直线。如图中所示,该视频的平均码率是980kbps,为了能够流畅播放完整个视频,需要用户的下载速度至少为1154kbps。
图4:流畅播放视频所需用户带宽
在实际观看过程中,用户很可能会拖动视频,而不是从头一直看到结束,因此,视频的播放可能从任意点开始。为了保证在任意点拖动都能够流畅播放,用户需要更高的下载速度。图5展示了在任意点流畅播放该视频所需要的下载速度。回到图3,可以看到在靠近100s的地方,视频的码率有一段时间较高,反应到图5的播放曲线中,这一段就较为陡峭(播放曲线实际上为码率分布曲线的积分)。如果用户拖动到这个时间点,为了保证流畅播放,用户必须保证下载速度为1333kbps,为视频平均码率的1.36倍。
图5:从任意点开始流畅播放视频所需条件
使用同样的方法分析爱奇艺、搜狐、优酷视频,为了从任意点流畅播放视频,所需用户带宽基本上都在视频平均码率的1.3~2.0倍之间,在魔2的编码过程中,我们尽量把这个比例控制在1.5倍之内。
综上所述,在播放视频过程中,并不是下载速度大于视频码率就能完全保证流畅播放,视频的特点及编码技术决定了在编码时必须对码率波动采取一定的折中,作为折中的后果就是用户需要付出1.3~2.0倍的下载速度代价。
扩展阅读:
1、 www.powercam.cc/slide/225. 这是一个台湾人关于视频编码基本原理的介绍,短短40多分钟将一些基本的概念描述的非常清楚。
2、www.coursera.org/course/digi…. coursera为数不多关于视频处理的课程,讲授视频压缩、处理的基本知识。
3、www.ffmpeg.org/.一个开源免费跨平台的…