视频技术发展到现在已经有100多年的历史,虽然比照相技术历史时间短,但在过去很长一段时间之内都是最重要的媒体。
由于互联网在新世纪的崛起,使得传统的媒体技术有了更好的发展平台,应运而生了新的多媒体技术。而多媒体技术不仅涵盖了传统媒体的表达,又增加了交互互动功能,成为了目前最主要的信息工具。
在多媒体技术中,最先获得发展的是图片信息技术,由于信息来源更加广泛,生成速度高生产效率高,加上应用门槛较低,因此一度是互联网上最有吸引力的内容。
然而随着技术的不断进步,视频技术的制作加工门槛逐渐降低,信息资源的不断增长,同时由于视频信息内容更加丰富完整的先天优势,在近年来已经逐渐成为主流。
人眼能看到东西是因为光线进入了眼睛,打在视网膜上,而视网膜上的神经和大脑相连。
当我们提到一张图片是“黑白”的时候,或者说“黑白电视”的时候,实际上并不代表它只有黑色和白色两种颜色,一个很容易理解的事情是,从白变成黑,如果这个过程是连续的,那么过程中会出现我们管它叫“灰色”的颜色。我们很容易定义“黑”,没有光线进入眼睛的时候,那就是黑;但是相对的,“白”就会更复杂一些。举个简单的例子,比如我们手上有一个能发出白光的灯泡,当对灯泡通电的时候,它就会发出白色的光。但是大家都知道,“灯泡”这种东西,根据耗电量的不同,有亮一些的和暗一些的各种不同的规格。如果当我们看到第一个灯泡发出的光,说它是白色;那当第二个更亮的灯泡亮起来的时候,我们还会说第二个灯泡发出的光是更亮的白色。于是在“白色”这个颜色上面,多了个“亮”这样的属性。在显示器上,我们通常会将它能够显示的最大亮度叫做“白色”,能显示的最低亮度叫做“黑色”。
从黑色到白色的变化过程可以简单看作是一条线段,一端是“黑”、另一端是当前设备能发出的最大亮度的“白”。那么可以把黑的那一个点记为0,白的那一个点记为1,大于0而小于1的部分就成为了“灰”。可以用一个数字来表示只有黑白的颜色。
光线会刺激人眼内的锥状细胞,这些细胞通过视神经和大脑相连。不同的细胞对不同波长的光有不同的敏感度。这些对不同波长的光敏感的细胞主要分为三种,一种对波长在560nm左右的光敏感、一种对530nm左右的光敏感而另一种对420nm左右的光敏感。这些波长分别对应红色、绿色、蓝色三种颜色的光。平时说的人类的眼睛只能识别这三种颜色的光就来源于此。自然界的光是由许多不同波长的光组合而成,但只要能还原其中红绿蓝(也就是Red、Green、Blue,简称RGB)的部分,对人眼看起来是没有区别的。所以在针对人类的应用中,可以只记录红绿蓝三种分量的数据。
基于这种理论,就可以把上面那个“黑白”的记法进行扩展,从一条线段变成三条线段,分别记录红色光的强度、绿色光的强度和蓝色光的强度。如此,用一个数字可以用来表示黑白的颜色,而用三个数字就可以表示出彩色了。注意,虽然这里说是三条线段,但并不代表三条线段的顶端所代表的的光的强度是相同的,因为在定义中,当红、绿、蓝“等量”(比如,都是1.0)混合的时候,产出的颜色为白色。这里的等量并不是指三种频率的光的强度相等,而是强度的比例为某种固定的比例。
尽管如此,”红色、绿色、蓝色“这样的描述仍然不够准确。事实上,看同一个频道的节目,不同的电视机显示出来的颜色虽然大致一样但又略有偏差的事情或许大家都遇到过:有的电视鲜艳一些,有的土一些,还有的偏红、偏蓝。为了规范统一,国际电信联盟无线电通信部门(ITU-R)利用国际照明协会的XYZ色彩表示方式来定义了R、G、B分别是什么颜色,以及等量混合的时候的白色是什么颜色。在不同的标准里,R、G、B事实上可以表示不同的颜色,开发中常遇到的标准可以搜索白皮书里的具体参数定义。例如 BT.601、BT.709 中对 RGB 的定义和 sRGB 标准相同。
人眼对于亮度和颜色的感受是由不同的细胞完成,对亮度的感受比较敏感而对色度的感觉比较迟钝,所以在需要节省存储空间的时候,可以为亮度保存更准确的数据,为色度保存更不准确的数据。YUV的数据表示形式很适合这种场景。
YUV保存的彩色数据,可以看作给黑白图像上色。其中Y通道保存的就是这张黑白图像,而U和V就是给黑白图像上色。因为人眼对亮度敏感,所以Y部分的数据可以保存得精度比较高,而U和V就可以保存得相对模糊。
在RGB中,不论是R还是G还是B,其中一个通道亮度比较高,这个颜色看起来就会比较亮。所以计算亮度的时候,R和G和B都有参与。RGB和YUV之间互相转换的公式如下
其中,R、G、B的范围是 0 ~ 1,Y的范围是 0 ~ 1,UV的范围是 -1 ~ 1。Kr Kb Kg 是三个常系数,根据选用标准的不同而不同,可以在对应标准的白皮书中找到,例如 BT.601、BT.709、BT.2020。用错标准的时候,从YUV转成RGB并显示会导致偏色。为了检查偏色,通常会使用 ARIBColorBars、PM5544 等测试卡来进行检查。其中PM5544可能大家会比较熟悉。
根据公式可知,这是一个三元一次方程组,把方程2、3中的Y使用方程1代入,就可以得到从RGB计算YUV的方法;给出YUV解方程组,可以得到RGB。它们之间就是这么互相转换的。
在实际开发过程中,YUV的取值范围有两种不同的标准。例如用8bit来表示YUV数据的时候,一种标准是使用完整的0~255范围,而另一种是使用Y的16~235、UV的16~240范围。前者被叫做Full Range,或者PC Range。后者被叫做Partial Range,或者TV Range。后者反而比较常见。
光电转换是通过光伏效应把光能量转换为电能的过程。例如在数码相机中,光线通过镜头,打在感光元件上,感光元件产生电能,输送给芯片进行进一步的处理和保存。当要显示图像的时候,芯片会将存储的数据加载进来,然后将电信号通过显示屏等元件转换为光信号给人观看。
在液晶屏幕普及之前,人们普遍使用的电视机和电脑显示器都是俗称“大屁股”的阴极射线管屏幕。这种设备的原理是通过电子轰击屏幕上的荧光涂层,使之发出不同亮度不同颜色的光来显示画面,这个叫做电光转换。但在这个过程中人们发现,将电压提升一倍之后,画面的亮度并没有简单地提升一倍,它们之间存在一种非线性的函数关系。通常屏幕的亮度和输入电压的关系是,亮度约为输入电压的2.2到2.4次方,称之为电光转换函数。
因为存在这种转换函数关系,光信号通过摄像机转换为电信号的时候也要做一次转换来抵消电光转换函数,称之为光电转换函数。光电转换函数接近于电光转换函数的逆函数。
对于光电转换和电光转换,搜索关键字 OETF 和 EOTF 可以找到相关的资料。标准动态范围(SDR)视频来说,对应白皮书标准BT.1886;对于高动态范围(HDR)的视频来说,光电转换是需要特别关注的一个过程,与SDR差别较大,对应白皮书:BT.2100。
选用适当的光电和电光转换函数可以提升数据保存的效率,因为人眼对光强度的敏感也不是线性的,当光线比较暗的时候,很小的强度不同人眼可以感觉到;但是当光很强的时候,同样小强度的变化,人眼就感觉不到了。所以可以设计这样一种光电转换曲线,它在光弱的时候,电信号的变动大一些;当光比较强的时候,同样程度的变化,体现在电信号的变化上更小。
也叫做“深度”(depth)。保存所谓“光的强度”的时候,有个“保存精度”的问题。我们都知道,计算机内数据的保存和处理,都是二进制数字。那么用几个二进制数据保存这些数据,就是“精度”。平时会说的 8bit 10bit 就是属于这个范畴。8bit 指的是用8个二进制数来表示采集到的光的强度,那么它就能够保存 2的8次方 一共 256 种不同的情况;如果使用的是 10bit 来保存,那么这里是 1024。假设这里保存的是黑白形式的数据,那么在 8bit 下,0代表黑色,255代表白色;如果在 10bit 下,那么0代表黑色,1023代表白色。如果保存的是彩色形式的数据,那么就是三个数字。
将许许多多不同颜色的点铺满一个面,就形成了一张画面。
说到分辨率很多人会认为这就是画面有多大。但是其实这不太准确,因为一张画面有多大实际上是取决于你显示器有多大,或者显示图片的窗口开了多大。就像家里买电视看电视节目,以前小时候家里电视是14寸的那么电视节目显示出来就是14寸、买21寸的那么电视节目显示出来就是21寸。电视节目并不会因为你买的是14寸的电视就显示不完整,也不会因为你买的是21寸的电视它就只在电视屏幕上的一小块地方显示。
那么有没有什么办法可以更直观地对分辨率有概念?假想一下,现在有个电视屏幕,上面显示的内容是黑白相间的条纹,就像斑马那样。这个条纹越来越密越来越密,到最后变成一条条的细线,再细下去就看不清了。那么我有这样一个画面,画面上的内容就是黑白相间的条纹,这个条纹越来越密越来越密,到最后黑色和白色的条纹糊在了一起,这种情况下就再也没有办法数清楚到底有多少根黑色线、多少根白色线了。这个极限状态就是它的分辨率。
在电脑上,因为有像素的概念,所以可以直接用像素来表示分辨率。黑白相间的条纹最多能显示多少个,就取决于有多少个像素。因为在多媒体领域,像素的形状并不总是正方形的,所以同样分辨率的一张画面,可以是不同比例的。
宽高比指的是画面的宽度和高度的比例。虽然大多数情况下,这与横向的分辨率和纵向的分辨率的比例是相同的,但并不总是相同的。一个例子,在DVD时代,碟片上保存的画面都是720x480分辨率的,但是画面的高宽比却有4:3和16:9两种。这就是像素形状不是方形的情况。通常描述高宽比的时候,会用到“采样比例(Sample Aspect Ratio)”、“像素比例(Pixel Aspect Ratio)”、“显示比例(Display Aspect Ratio)”这样的概念,这些比例都是宽和高的比。所以 横向分辨率÷纵向分辨率×采样比例=显示比例。
最常见的RGB数据是每个采样(或者说像素)使用三个8bit整数分别表示红、 绿、蓝通道的信号强度,这样每一个像素就是3个字节。整张画面上的像素,按照从左到右的顺序保存一行的所有像素,保存完一行保存下一行。因为每个像素是24bit,所以也会写成RGB24的。同理,也有保存的顺序是反过来的BGR24,区别只在于先存放蓝色通道的数据。根据需要,有的时候会多一个辅助通道Alpha,根据Alpha通道存放的位置不同,于是也有 ARGB32、RGBA32、BGRA32、ABGR32 之类之类。
例如,一个4x4的画面,保存下来的数据大概长这样:
RGB RGB RGB RGB
RGB RGB RGB RGB
RGB RGB RGB RGB
RGB RGB RGB RGB
实际开发中经常会遇到的另一个点是,每一行数据的后面还会带一些其他数据,比如用来让每一行数据的字节数都是某个整数的整倍之类。在保存这种数据的数据结构里,除了高和宽,就还会有一个叫 stride 的属性,用来表示每一行到底几个字节。在读写指定位置的像素数据的时候,如果不按照这个 stride 来定位所在的行,就会出现读写的数据偏了的情况。
有的地方写的是I420,是同一种东西。作为另一种典型的格式,YUV的保存方式常见的与RGB是不同的。常见的YUV数据保存方式,是先存所有像素的Y通道数据,然后存U通道,再存V通道。然后Y和U和V还不一定就是存在连续的内存空间里,而是可能为三个不同的内存块。不在内存中表示,或者需要存盘、通过管道传输之类的时候,就是Y后面跟着U、U后面跟着V这样的存储方式。
上述4x4的画面,保存下来的数据就是:
YYYY
YYYY
YYYY
YYYY
UUUU
UUUU
UUUU
UUUU
VVVV
VVVV
VVVV
VVVV
但是前面说到,人眼对亮度敏感,对色度更没那么敏感,所以YUV420P8在保存数据的时候,U和V的分辨率会小于Y的分辨率:高和宽都是一半。例如这个4x4的画面,如果YUV三个通道拆开来看,那么只有Y通道是完整的4x4数据,U和V都是2x2数据。所以实际上保存的数据是:
YYYY
YYYY
YYYY
YYYY
UU
UU
VV
VV
而YV12则是把其中的U和V位置互换了一下。
通过这种方式缩减,就从一个像素占用24bit(3个字节)变成了一个像素平均占用12bit(1.5个字节),数据量一下子减少了一半。但是因为人眼对色度不敏感,所以其实不太能看出来。
此外也有YUV420P10,YUV420P12,YUV420P16等保存方式,把原本8bit保存的数据扩展到了10bit、12bit或者16bit,使其具有更高的精度。但是不管是10bit、12bit还是16bit,保存的时候都是占用2个字节。10bit会用低10位,前面补0;12bit会有低12位,前面补0;16bit占用完整的2个字节。
和RGB的数据一样,YUV数据在实际开发中也会遇到 stride 的问题,也要按照同样的方法操作,否则也是一样读偏了或者写偏了。
NV12和NV21是更换了数据保存方式的YUV420P8。它保存的Y通道的分辨率也是全量的,保存的UV通道的分辨率是横向和纵向分别为Y通道的一半。但是它只有两个通道、而不像YUV420P有三个通道。U和V数据是在第二个通道里交错存放的。还是以上面的4x4画面为例,保存的数据是:
YYYY
YYYY
YYYY
YYYY
UVUV
UVUV
如果是NV21,那么是:
YYYY
YYYY
YYYY
YYYY
VUVU
VUVU
一系列连续的图片按照一定的速度进行顺序播放,人眼看起来就像是画面中的东西在动,这就形成了视频。
简单的理解帧就是为视频或者动画中的每一张画面,而视频和动画特效就是由无数张画面组合而成,每一张画面都是一帧。帧率的单位是FPS(frame per second),即每秒多少帧。
色阶的意思,就是颜色从无到最大时,中间的过渡梯级有多少。假如说亮度的黑白信号,色阶为2时,那么它就只有两种颜色,全白和全黑。同样的RGB三基色中,每种颜色都有色阶。8bit数据能够存储256个色阶,那么RGB三基色就可以实现1677万种颜色,也就是24位色。
注:计算机颜色体系中有32位色,实际上是24位色之外增加了一个8位的Alpha透明层,所以也叫RGBA。
那能不能使用更高的色阶呢?大于256级色阶好不好?当然好了,不过一般的显示器不支持。但是的确是有高色阶的显示器,目前色阶最高的显示器可以支持10bit颜色信息,也就是1024级色阶。当然价格是不可想象的!
一般民用的低端显示器采用的TN型液晶面板,都是6bit的,也就是RGB每种颜色只有64级,一共可以显示颜色只有26万种。当然你可以选择32位色模式,只不过它的1677万种颜色,是通过插值换算出来的,并不是真正的1677万种颜色。真正支持1677万种颜色的显示器,其实也不是很便宜的。
视频编码最重要的目的也是为了进行数据压缩,以此来降低数据传输和存储成本。除了前面说的用YUV表示、并把UV的分辨率降低之外,还有很多其他的手段。
基于画面存储方式的例子,可以得知尽管使用了YUV420P方式存储画面,但平均一个像素也会占用12bit。那么一张1280x720分辨率的画面,就会占用1280x720x12=11059200bit;而在一秒钟有30帧的场景下,一秒钟的画面就占了11059200x30=331776000bit,换算过来约40MB。这是一个很大的数,平时看的24分钟一集的动画片,就要55.6GB。这对于存储和传输都会造成很大的压力。所以需要采用编码压缩技术来减少数据量。
视频压缩是一个专业性非常强、非常复杂的领域,门槛也很高。通常做开发的时候,是调用现有的编码器,调节它的参数,不会涉及到编码器内部的改动。所以对其原理只要有简单的了解就能应付大多数场景了。
视频压缩有别于平时说的文件压缩。文件压缩大多会采用类似7z、ZIP等格式,对应LZMA、Inflate算法。这些算法都是“无损压缩”算法,翻译过来就是解压后得到的数据,和压缩前的数据是完全一致的。视频压缩虽然也有无损压缩,但更多时候使用的是有损压缩,顾名思义解压后得到的数据和压缩前的数据,从数据层面来说不完全一样,但是画面的内容,从人眼来看,是差不多的。压缩的时候,又要损又要人眼不太看得出来,那么这用的是什么手段……
先从简单一些的图片压缩开始。大家都用过JPG格式,也见过JPG压缩压过头了,图片上出现方块、颜色溢出,甚至还有经典的“你表情包都绿了”。这里有损压缩靠的是离散余弦变换,有兴趣的同学可以自己去搜索和学习离散余弦变换是什么东西,这里只最简单带过一下。假设我现在有一张 8x8 的黑白图片,那么这个图片就一共64个像素。我们把这64个像素的亮度(灰度?)记作y1 y2 y3 ... y64。
那我现在再来64个方程,如下:
k1_1*x1 + k2_1*x2 + k3_1*x3 + ... + k64_1*x64 = y1
k1_2*x1 + k2_2*x2 + k3_2*x3 + ... + k64_2*x64 = y2
k1_3*x1 + k2_3*x2 + k3_3*x3 + ... + k64_3*x64 = y3
....
k1_64*x1 + k2_64*x2 + k3_64*x3 + ... + k64_64*x64 = y64
如果k的值全部已知,得到64个未知数64个方程,可以把里面的x1 x2 x3 ... x64解出来。如果现在有两个人A和B,他们事先都定好k的值,随后A把算出来的这些x告诉B,B套入上面的公式,就能算出y。
因为上面的式子实在太多了,为了简化,就用向量来表示,所以上面那一串就可以等价地写成:
(k1_1, k1_2, k1_3, ... k1_64)*x1 + (k2_1, k2_2, k2_3, ... k2_64)*x2 + ... + (k64_1, k64_2, k64_3, ... k64_64)*x64 = (y1, y2, y3, ... y64)
太长了不方便看,所以写成下面形式:
k1*x1 + k2+x2 + k3*x3 + ... + k64*x64 = y
从64个y的值变成64个x的值,有什么好处呢?为了说明这个问题,我们先来定义这些 k 的值。
下图是一个有64个小格子的图,每个格子一共有8x8一共64个像素。因为这些k都是64维的向量,所以用k1代表第一个格子里的内容,按照右图顺序类推,一直到k64代表最后一个格子的内容。然后k1_1代表第一个格子里的第一个像素,k1_2代表第一个格子里的第二个像素,以此类推。亮暗代表不同的值,全白为1、全黑为0。
套入上述方程组可以求出x1 x2 ... x64。然后这64个x的值,传给了另一个人。这个人收到这64个x的值之后,要套入上面的方程把y的值算出来。如果把算的过程表示出来的话:
k1*x1
k1*x1 + k2*x2
k1*x1 + k2*x2 + k3*x3
...
k1*x1 + k2*x2 + k3*x3 + ... +k64*x64
动画中,最左边的块是每一步的计算结果,中间的块代表 k 乘以 x 的值,最右边的块代表k的值。可以看到,随着计算一步一步进行,计算结果在视觉上会越来越接近原画面。那么如果我不传64个值,只传63个,虽然画质损失了,但是收到的人能看出来是字母A,那不就少了传输一个数值的需要了吗?不过实际操作中不是这样,实际操作中,越后面的系数对应的未知数,会保存精度越低的值;对压缩的需求越大保存的精度越低,这就是有损压缩的基本原理。
在有损压缩完了之后,还会过一遍无损压缩。JPG使用的无损压缩方式是最小生成树。这个算法对于科班的计算机专业的学生来说,是课上老师会教的东西。我尝试用一个很简单的说法来说,就是本来我一个文件,比如是1000个字节,每个字节8个比特,就是8000比特。那如果我现在发现我这文件里全写的都是大写字母A和大写字母B,没别的东西,那我直接用0来代表A、1来代表B,每个字节变成了1个bit,文件就从8000bit变成了1000bit,变成原来的1/8了。这个算法的原理是在文件中,越经常出现的文字用越少比特数来表示、越不经常出现的文字用越长的比特数来表示,原本固定的一个字节8个bit就变成了1个字节不一定多少个bit,两边都约定好到底每个字节怎么表示,需要保存的内容就变少了。并不是所有编码都用的最小生成树,其他格式的编码也会有其他的无损压缩算法。
JPG里用的技术相对较少,现在用的视频编码里还要再多很多技术。比如其中有一个技术就是,如果一个画面里有很多长得一样的东西,它会记录类似“把哪个块复制到哪里哪里”这类的信息,于是这些块里面的数据就只要记录一次就够了。这种情况叫做“空间上的冗余“。
视频由许许多多这样的图片组成,因为除了场景切换之类的情况外,视频这一帧的内容对比上一帧有一部分是没有变化的,又有一部分是画面上的物体在移动。那么如果下一张画面里,通过记录“哪里的东西,现在运动到了哪里”来保存和前一帧对比后有不同的数据,那么数据量可以大大减少。
比如《魔法少女小圆》的片头动画,在这个场景中,中间的人物是不动的,但是左下角的云在飘。将编码器记录的运动数据可视化之后,可以看到这些数据确实是“左下角的云在朝着左下角运动”。
视频编码与压缩,是数字化视频非常重要的技术,以至于它直接影响到视频在各个领域的应用。如果没有视频编码技术的不断提高,我们今天也不可能在方方面面享受到视频的便利性。
首先,视频编码是一项非常复杂的工程,远超过对音频和图像压缩的难度。其次,视频编码是一个多级压缩的过程,而非单一压缩方案。当然如果不是有着这么复杂的一项工程,视频文件远比我们想象的要大的多。我们来举一个例子:
按照CCIR 601的视频信号采集标准,一个标准PAL制式电视信号转换成数字信号,按照常见的非专业级采样标准4:2:0(你想支持更高的也不行啊,民用级的设备做不到更高的采样率),则每秒钟产生的视频内容所生成的数字文件为21MB。那么1分钟的视频文件有多大呢?1260MB那么大。
那如果按照RGB色彩表达方式,720×576分辨率,每个采样点3个基色,每个基色是8bit数据,每秒25帧画面。得出来的结果是720×576×3×8×25=237.3Mbit=29.67MByte。那么1分钟的视频就是1780MB……我想从来没有用户见到过1分钟的视频会生成这么大的文件吧。这还仅仅是标清,如果是高清1080P的话,那就是69.5TB!!
从上面的例子可以看出,即便是不压缩视频,采用YUV颜色来存储信息,比起使用RGB颜色来存储信息,容量还是要小一些的。所以也可以说YUV颜色方式算是视频编码的最初一级压缩方法。
如果每一帧的视频画面,按照RGB颜色保存的话,文件会非常大。例如PAL制视频画面所产生的文件有1.2MB。
如果将每帧的视频画面压缩,那么可能大大减小视频的文件大小。而我们所知的最常见图像压缩算法就是jpeg。JPEG 是Joint Photographic Experts Group(联合图像专家小组)的缩写,是第一个国际图像压缩标准。
首先JPEG压缩是对图像的YUV色彩分量进行分别编码,所用的编码主要算法是DCT(DCT for Discrete Cosine Transform,离散余弦变换)。它是与傅里叶变换相关的一种变换,它类似于离散傅里叶变换(DFT for Discrete Fourier Transform),但是只使用实数。DCT是一种非常高压缩率低失真的压缩算法,可以将图像压缩至1/5到1/10大小,而且画质基本没有太大变化。
那么利用JPEG压缩算法,原本每帧图像大小为1.2MB,现在就变成了180KB左右,减小了很多。而每秒钟的视频大小就变成了4.4MB,1分钟的视频就是263MB。顿时小了很多。使用这种算法的视频编码方式叫做Motion JPEG,也叫MJPEG。注意,视频压缩里面也有个比较知名的方法叫做MPEG,但不等同于MJPEG,两者截然不同。
虽然通过JPEG算法,可以将视频变小了好几倍,但是还是比较大。对于传输来说和存储来说,门槛还是太高了,只能适合像广播电视行业这种专业机构使用。
那么还有什么办法可以把视频文件压缩的更小呢?那就是帧间压缩方法。
说到帧间压缩,那必须提到一个组织。MPEG(Moving Picture Experts Group,动态图像专家组)是ISO(International Standardization Organization,国际标准化组织)与IEC(International Electrotechnical Commission,国际电工委员会)于1988年成立的专门针对运动图像和语音压缩制定国际标准的组织。
现在知道了吧,MPEG其实是一个组织的名字。当然这个组织有很多有代表性的压缩算法,都是以MPEG-X命名的。所以大家也就习惯的把MPEG称作压缩方法。
首先,运动压缩采用的是帧间压缩法。而什么是帧间压缩法呢?
由于视频是由很多帧的画面集合组成,而鉴于运动的特性,在很短的间隔时间内运动幅度很小。另外就是运动的画面中,存在很多并没有运动的画面信息。甚至有时候拍摄的画面有很多帧图像之间几乎没有变化。这样重复的记录这些没有变化的图像信息,简直是太浪费了。
帧间压缩,就是尽可能的剔除那些相邻画面中没有变化的内容信息。举个例子,比如画面是一个人骑自行车,背景不变,而骑自行车的人从画面一端跑到另外一端。那么这个时候,就可以把没有遮盖到的背景部分,只保存一份就行了。剩下的只是记录人骑自行车的整个动态画面就OK。
当时原理上比较简单,实现起来就比较困难了。帧间压缩的时候首先要用到关键帧和非关键帧的概念。关键帧就是指你要保存画面上所有数据的那一帧图像,并且以这个图像作为参考。关键帧后面每一帧都会比照关键帧和此前一帧的画面,记录画面改变的地方,去掉重复的信息。
早期的压缩算法就是采取这种策略,比如MPEG-1。它的应用产品大家可能更熟悉——VCD。
这里顺便提一下MP3,MP3的全名叫做MPEG-1 layer3。也就是说MP3压缩格式是MPEG-1压缩标准里面的一个子集。跟MP4是完全不同的概念。
VCD虽然在一张光盘里(650MB容量)可以放得下差不多一部电影的长度,已经是压缩率很惊人了。当然这也是牺牲画面为前提的:
有了VCD产品,国人们是皆大欢喜。这里可以顺带讲一下,VCD机是中国人发明的,那家公司叫万燕。但是呢,VCD技术是飞利浦、SONY、松下、JVC等公司联合制定的标准,而生产VCD芯片的公司是美国的C-CUBE公司。怎么说呢,技术虽然是老外们发明的,不过他们并不看重这项技术,所以就没形成产品。反倒是国人把它发扬光大了。
与此同时,欧美国家其实对VCD是不太感冒的。因为他们还在VHS时代(感兴趣的同学可以搜索一下VHS,以及SONY的betacam与JVC的VHS制式标准大战),而且VCD第一不便宜,第二画质也不高,第三还不能录像只能播放。
其实有了VCD产品之后,对世界还是很震惊的。大家都觉得把一部电影放在一张小小的碟片里面真的很方便。但是VCD画质真的不好,有没有什么新的技术可以做到更小的容量更高的清晰度呢?那就是后来推出的MPEG-2。
MPEG-2这个标准是最早风靡全球的压缩技术,标准制定的时间是1994年(VCD标准是1993年)。虽然已经过去20多年了,却仍然是当今最重要的视频压缩格式之一。除了还有大量的DVD产品以外,更重要的是目前广播电视领域的数字电视DVB-T标准,仍然使用的是MPEG-2压缩标准(在中国)。
MPEG-2相对于MPEG-1有什么提升呢?
1. 画面有了很大的提升,且更加灵活了。MPEG-1几乎所有的应用都集中在VCD上,分辨率很小,且不能改变。MPEG-2可以适合中等清晰度(D1标准、PAL制或者NTSC等制式电视标准)到高清晰度视频内容的展示。也就是说即便是720P、1080P等这样的高分辨率视频,MPEG-2仍然适用。
2. 增加了GOP模式,使用IBP帧结构。原来的帧间压缩方式,在大动态场景下马赛克很严重。到了MPEG-2之后就有了很大的提升,因为使用了参考帧B帧,使用了向前预测帧方式,而且压缩率是可变的。总的来说,就是大动态时候不会有马赛克了。
3. 增加了很多额外的信息,功能更加强大。比如支持更强的交互与命令控制(大家有没有想起来VCD 2.0时候画面有菜单可以选,DVD比这个强大),支持传输流形式(TS,TransportStream,就是可以用于直播,也不怕文件损坏就全完),多音轨而且多声道……
但是MPEG-2也有不足的,主要就是它是面向工业化视频信息生产发行领域的,也就是说只适合电视台、DVD发行商、卫星通信等领域,不适合民用。因为码流真的很大,比MPEG-1要大。虽然一张光盘就可以装的下一整部电影,那是因为光盘的容量从650MB提升到了4.3GB,甚至7.2GB。
最早的视频技术来源于电影,电影技术则来源于照相技术。由于现代互联网视频信息技术原理则来源于电视技术,所以这里只做电视技术的介绍。
世界上第一台电视诞生于1925年,是由英国人约翰贝德发明。同时也是世界上第一套电视拍摄、信号发射和接收系统。而电视技术的原理大概可以理解为信号采集、信号传输、图像还原三个阶段。
摄像信号的采集,通过感光器件获取到光线的强度(早期的电视是黑白的,所以只取亮度信号)。然后每隔30~40毫秒,将所采集到光线的强度信息发送到接收端。而对于信号的还原,也是同步的每隔30~40毫秒,将信号扫描到荧光屏上进行展示。
那么对于信号的还原,由于荧光屏电视采用的是射线枪将射线打到荧光图层,来激发荧光显示,那么射线枪绘制整幅图像就需要一段时间。射线枪从屏幕顶端开始一行一行的发出射线,一直到屏幕底端。然后继续从顶部开始一行一行的发射,来显示下一幅图像。但是射线枪扫描速度没有那么快,所以每次图像显示,要么只扫单数行,要么只扫双数行。然后两幅图像叠加,就是完整的一帧画面。所以电视在早期都是隔行扫描。
跟相机感光原理一样,感光器件是对光敏感的设备,对于进光的强弱可以产生不同的电压。然后再将这些信号转换成不同的电流发射到接收端。电视机的扫描枪以不同的电流强度发射到荧光屏上时,荧光粉接收到的射线越强,就会越亮,越弱就会越暗。这样就产生了黑白信号。
前面说到,由于摄像采集信号属于连续拍摄图像,比如每隔40毫秒截取一张图像,也就是说每秒会产生25副图像。而每个图像就是一帧画面,所以每秒25副图像就可以描述为帧率为25FPS(frames per second)。而由于过去电视荧光屏扫描是隔行扫描,每两次扫描才产生一副图像,而每次扫描就叫做1场。也就是说每2场扫描生成1帧画面。所以帧率25FPS时,隔行扫描就是50场每秒。
模拟时代在全世界电视信号标准并不是统一的,电视场的标准有很多,叫做电视信号制式标准。黑白电视的时期制式标准非常多,有A、B、C、D、E、G、H、I、K、K1、L、M、N等,共计13种(我国采用的是D和K制)。到了彩色电视时代,制式简化成了三种:NTSC、PAL、SECAM,其中NTSC又分为NTSC4.43和NTSC3.58。我国彩色电视采用的是PAL制式中的D制调幅模式,所以也叫PAL-D制式。有兴趣的可以百度百科“电视制式”来详细了解。
另外你可能会发现,场的频率其实是和交流电的频率一致的。比如我国的电网交流电的频率是50Hz,而电视制式PAL-D是50场每秒,也是50Hz。这之间是否有关联呢?可以告诉你的是,的确有关联,不过建议大家自己去研究。如果确实不懂的同学可以@我。
其实有了基础的黑白摄像技术之后,人们就一直想实现彩色摄像。早在1861年,英国物理学家麦克斯韦就论证了所有彩色都可以使用红、蓝、绿三种基色来叠加生成。但是感光器件只是对光线敏感,但是对颜色却无法识别。为了实现对颜色的识别,人们用分光镜加滤光片的方式,将光线分解成为三种基色的纯色模式。然后分别对三个基色的纯色亮度进行采集,然后再把信号叠加实现了对彩色信号的采集能力。
因为原来黑白电视的时候,基本上只需要一路信号就可以还原图像(同步信号后面讲)。但是有了彩色之后,一路信号能否表达一副完整的彩色图像,以及如何表达呢?
彩色电视出现之后,为了兼容早期的黑白电视信号(也就是黑白电视机可以接收彩色信号,但是只显示黑白),科学家引入了YUV色彩表示法。
YUV信号有多种叫法,可以称作色差信号(Y,R-Y,B-Y),也可以称作分量信号(YCbCr,或者Component、YPbPr)。它是由一个亮度信号Y (Luminance或Luma),和两个色度信号U和V组成(Chrominance或Chroma)。黑白电视只使用亮度信号Y,彩色电视可以额外使用两个色度信号,来实现彩色效果。但是YUV信号是怎么来的呢?
首先,是因为考虑到黑白电视兼容,所以基础信号仍然采用亮度信号。而颜色表达本身是通过RGB三基色的叠加来实现的,为了能够将YUV信号可以还原成三基色RGB色彩值,数学家利用了色差算法,即选取一路Cr信号和一路Cb信号。Cr信号是指RGB的红色信号部分与RGB亮度值之间的差异,Cb信号是指RGB的蓝色信号与RGB亮度值之间的差异。所以YUV信号有时候也表达为Y,R-Y和B-Y,所以也叫色差信号。
如果大家平时经常拿手机拍摄视频,你可以把拍摄的视频文件传输到电脑上,然后用MediaInfo软件打开,你会发现很多关于视频的参数信息。而这些参数信息里面,你一定会发现手机拍摄的视频色彩也是使用YUV信号模式。为什么不用RGB来表达?现在早都没有黑白电视了啊?
其实不必考虑兼容性的原因,因为你无论是什么信号模式拍摄的视频,只要是数字化的信息文件形式,都可以与播放设备的信号模式无关。因为播放设备在播放视频文件时需要解码,再进行渲染。这时候不管什么信号模式还是色彩空间,都能转化成设备兼容的方式。
至于为什么YUV信号模式一直会持续至今,最主要的原因不是因为兼容性考虑,而是YUV信号有个巨大的优势,就是节省带宽。这在数字媒体领域是很重要的。
人眼的视觉特点是,人眼对于亮度信号最为敏感,对色度信号敏感度要弱一些。所以可以适当减少色度信号的容量,也不会被人眼观察到差异。就好比音频里面的MP3压缩格式,是将耳朵不敏感的频率信号容量降低或去除掉,以大大降低文件的大小,但是人耳却基本听不到差异。
至于YUV信号是如何做到降低信息容量的,可以看下面的引文:
YUV主要的采样格式有YCbCr 4:2:0、YCbCr 4:2:2、YCbCr 4:1:1和 YCbCr 4:4:4。其中YCbCr 4:1:1 比较常用,其含义为:每个点保存一个 8bit 的亮度值(也就是Y值),每 2x2 个点保存一个 Cr 和Cb 值,图像在肉眼中的感觉不会起太大的变化。所以, 原来用 RGB(R,G,B 都是 8bit unsigned) 模型, 1个点需要 8x3=24 bits(如下图第一个图),(全采样后,YUV仍各占8bit)。按4:1:1采样后,而现在平均仅需要 8+(8/4)+(8/4)=12bits(4个点,8*4(Y)+8(U)+8(V)=48bits), 平均每个点占12bits。这样就把图像的数据压缩了一半。
视频技术发展到了数字化时代,其实原理上并没有太多变化。但是数字化的视频技术,虽然基础原理没有改变,但是各方面的性能和功能有了很大的提升。这些就重点讲一下数字化之后的视频技术有了哪些突破:
前面讲到,实现彩色摄像其实是把光线分解成为三个基色分别取亮度值,但是这种结构比较复杂,成本也高。因为实现彩色摄像需要有一个分光用的棱镜,然后采集光线必须要用到三片感光器件(CCD或CMOS)。这种结构带来第二个不好的地方就是结构会比较庞大,不利于小型化微型化。
后来呢,德国人拜耳发明了一种滤镜,是一种马赛克滤镜。将含三基色的马赛克滤镜覆盖在感光器件上面,这样就可以实现用一片感光器件来采集三种颜色,同时也取消了分光棱镜这种结构。这样下来,不仅成本降低了,结构也简化了。
有了这种技术之后,摄像设备就可以越做越小,现在集成在手机上的摄像头整体厚度只有2~3毫米,尺寸只有1~3毫米。当然在专业领域,高端的摄像机仍然采用分光棱镜加3CCD的技术,原因不是他们不愿意改,而是3CCD的色彩丰度更好。而且专业摄像机CCD技术也从IT型发展到了FIT型,感兴趣的同学可以查看一下SONY公司关于FIT型CCD专业摄像机的介绍来了解。总而言之,就是民用领域和专业领域发展方向不一样,所以路线也不同。
在模拟电视时代,受限于显像管技术原因,采用的是隔行扫描技术来还原图像显示。但是现在都是平板电视了(液晶电视、等离子电视、激光电视),电视的成像方式不再是一条线一条线的扫描,而是一次性全画面呈现。所以现在的视频拍摄一般都没有场的概念,当然为了向前兼容,在视频文件信息中,你会看到扫描模式的参数。利用手机拍摄的视频文件,其扫描模式的参数都是Progressive,就是逐行扫描的意思。
大家都知道模拟和数字的最大差别就是信息存储和传递方式,一个是模拟量一个是数字量化的。那么数字化对于连续过程的量化就必须用到采样过程,也可以理解为片段化。例如音频数字化,就是把音频在每个很小的时间间隔上获取音频的信息然后进行数字量化,最后把所有连续采样的数字量化数据组合,来形成最终的信息。视频也是这样,按照一定的时间间隔,把获取到的图像进行数字量化,然后连续的数字量化的集合就是一段完整的视频文件。
但是视频的采样率并非是大家理解的那样,每秒钟产生25帧的图像,采样率就是25Hz。实际上,ITU(International Telecommunications Union,国际电信联盟)在CCIR 601标准中,对于视频的采样标准有了明确的界定:
fs=13.5MHz
这个采样频率正好是PAL、SECAM制行频的864倍,NTSC制行频的858倍,可以保证采样时采样时钟与行同步信号同步。对于4:2:2的采样格式,亮度信号用fs频率采样,两个色差信号分别用
fs/2=6.75MHz的频率采样。由此可推出色度分量的最小采样率是3.375MHz。
对于NTSC制则是858个样本点。由于电视信号中每一行都包括一定的同步信号和回扫信号,故有效的图像信号样本点并没有那么多,CCIR 601规定对所有的制式,其每一行的有效样本点数为720点。由于不同的制式其每帧的有效行数不同(PAL和SECAM制为576行,NTSC制为484行),CCIR 定义720×484为高清晰度电视HDTV(High Definition TV)的基本标准。实际计算机显示数字视频时,通常采用下表的参数:
电视制式 分辨率 帧率 NTSC 640*480 30 PAL、SECAM 768*576 25
但实际上亮度信号占220级,色度信号占225级,其它位作同步、编码等控制用。如果按f s 的采样率、4:2:2的格式采样,则数字视频的数据量为:
13.5(MHz)×8(bit)+2×6.75(MHz)×8(bit) = 27Mbyte / s同样可以算出,如果按4:4:4的方式采样,数字视频的数据量为每秒40兆字节!按每秒27兆字节的数据率计算,一段10秒钟的数字视频要占用270兆字节的存储空间。按此数据率,一张680兆字节容量的光盘只能记录约25秒的数字视频数据信息,而且即使当前高倍速的光驱,其数据传输率也远远达不到每秒27兆字节的传输要求,视频数据将无法实时回放。这种未压缩的数字视频数据量对于当前的计算机和网络来说无论是存储或传输都是不现实的,因此,在多媒体中应用数字视频的关键问题是数字视频的压缩技术。
由上述引文可知,YUV的采样率和采样精度,是数字视频从模拟向数字化过渡中兼容性的解决方案。延续了模拟视频以行为单位扫描的机制(模拟视频没有分辨率概念,只有行的概念)。由于这套标准是面向数字电视广播系统制定的统一标准,一般只在广播电视领域中才会看到,而在其他的数字化视频体系中基本没有体现。比如你在视频文件信息中找不到关于采样率的参数。
视频分辨率也是数字化视频时代的主要特征,由于模拟视频采用线扫描机制,也就是按行显示图像,而每一行的视频线中并没有进行数字量化,所以模拟视频都是以多少行来界定的。比如PAL制式采用576行,NTSC制式采用480行。
到了数字化时代,为了量化视频的具体信息,就必须对每行的信息进行采样并量化,就形成了分辨率的概念。如果采用PAL制式的视频,每行量化的图像点为768个,那么分辨率就是768×576。也就是说把PAL制的视频图像可以分解为768×576个像素点组成。
虽然简单的看视频分辨率的概念挺简单的,但实际上并没有那么简单。原因就是数字化视频的应用领域非常的多,从最早的广播电视应用,到监控安防,到互联网应用,后来又到了高清数字电视,以及移动互联网等等。而因为涉及的行业很多,每个行业都会制定自己的标准,所以就形成了对视频图像分辨率的定义有了很多标准。我们就拿最常见的广播电视、监控安防为例:
大家在计算机领域也都有接触过分辨率的概念,比如VGA(640×480)、SVGA(800×600)、XGA(1024×768)、SXGA(1280×1024)、SXGA+(1400×1050)、UXGA(1600×1200)、WXGA(1280×800)、WXGA+(1280×854/1440×900)、WSXGA(1600×1024)、WSXGA+(1680×1050)、WUXGA(1920×1200)等等。现在最高的标准是WQUXGA(3840×2400)。这个标准最早是由IBM制定的模拟信号的电脑显示标准,后来被各厂家继续沿用和升级。再后来被VESA标准化组织统一制定。
但是为什么分辨率就不能是简单的数字,非要在前面弄一堆字母呢?
原因在于制定一个输出的分辨率,并不是简单的设置有多少个像素点,而是还要考虑到实现这个像素点成像的方法。包括色阶多少、带宽多大、扫描方式怎样,如果深入的讲还有电路形式、增益控制、时序方式、寻址方式等等。如果没有详细制定这些图像是如何生成的,那么各个厂家之间的产品可能很难兼容,也就不会见到今天如此发达的计算机市场了。
同样的道理,制定标准化的分辨率和实现方式,有助于行业的统一和兼容。
监控安防领域有什么分辨率标准呢?下面请看:
图像格式 | 分辨率 | 色度取样个数 | 色度取样行数 |
Sub-QCIF | 128*96 | 64 | 48 |
QCIF | 176*144 | 88 | 72 |
CIF | 352*288 | 176 | 144 |
Half D1 | 704*288 | 352 | 144 |
D1(4CIF) | 704*576 | 352 | 288 |
16CIF | 1408*1152 | 704 | 576 |
这里解释一下,CIF是 Common Intermediate Format 的缩写,即通用影像传输视频会议(video conference)中常使用的影像传输格式,是ITU H.261协议中的一部分。大家可能发现了,每个分辨率的色度取样个数和行数都是对应分辨率的一半。没错,因为这个标准因为考虑到摄像头的性能和传输的性能影响,采取的是间隔像素采样和隔行扫描机制,而间隔像素采样通过插值进行补齐。
不过这些参数貌似现在很难见到了,为什么呢?很简单,因为监控安防现在都是高清化了,都是D2、D3这种级别的,对应分辨率是720P和1080P这一类。
那么在广播电视领域,对于分辨率的定义又是怎样呢?
前面已经提到了关于PAL制和NTSC制式的视频分辨率标准,另外还有一个SECAM制式,SECAM的分辨率为720×576。那么你会发现SECAM制式和PAL制的行数是一样的,只有每行的分辨率不同。这是由于SECAM调制载波方式不同造成的。
在标清电视时代,对于分辨率方面理解与现在其实有所不同。比如SECAM制式每帧图像是625行,但是分辨率是720×576,也就是只有576行。是因为视频信号传输过程中分帧正程和帧逆程,而帧逆程就是回扫,反向回去。在视频信号正常显示时,需要消除行帧逆程扫描对画面的干扰,所以就变成了576行。
到了高清时代,数字电视推出了HDTV标准,它对于显示分辨率的定义为1280×720逐行扫描,也就是俗称的720P;1920×1080隔行扫描,也就是俗称的1080i;1920×1080逐行扫描,也就是所谓的1080P。
当然高清数字电视已经逐渐普及了,目前正在面向4K高清过渡,也就是所谓的UHDTV(Ultra High Definition Television,超高清数字电视)。UHDTV草案定义了两个分辨率标准,及4K(3840×2160)和8K(7680×4320),支持50Hz、60Hz、和59.94Hz三种帧率,只采用逐行扫描。UHDTV采用正交采样,像素纵横比(PAR)为1:1,显示纵横比(DAR)为16:9。
关于像素纵横比和显示纵横比的概念,相对比较简单,这里就不做解释了。如果不清楚的可以搜索一下,当然同样也可以@我。
信号同步是在广播电视领域中非常重要的技术,如果信号没有同步,导致行扫描时,没有在指定的位置显示图像,则整个显示画面都会出现问题,此时的电视画面一定是没法看的。
要想图像内容在正确的位置显示,就必须提供同步信号来进行约束。而不管是模拟电视时代,还是在数字电视时代,不管是电视机还是显示器都需要信号同步。
同步信号一般有两种,分别为场同步(VSYNC)和行同步(HSYNC)。
专业设备中的专用视频同步接口
虽然有很多设备如电视机的复合信号输入(Composite)、HDMI输入,显示器的DisplayPort输入,专业设备的SDI和HD SDI输入,都没有专门的视频场同步和行同步信号接口,但并不是说这些信号不需要同步。而是这些信号接口把场同步和行同步信号已经调制到了信号中。
也就是说我们平时见到的视频信号接口中,并非只有纯粹的视频信息,还包含了很多的信息,比如同步信号、时钟信号(TC,TimeCode)、CEC控制信号、HDCP版权保护信息、SerialClock设备与分辨率识别信息等。
早期的宽带速度只有1~2Mbps(56K modem和ISDN时代根本就没视频什么事),想要在线播放DVD影片是不可能的(至少5~10Mbps),VCD也不行而且技术上不支持。MPEG组织的科学家就开始研究能够适合在网络上播放的视频压缩方法,也就是后面推出的MPEG-4压缩格式。
MPEG-4很明显的特征就是适合在网络上播放,灵活度更高,功能更加强大:
MPEG-4后来产生了很多衍生压缩算法,比较著名的就是Xvid和Dvix了。其实MPEG-4的知名度不如Xvid和Dvix,因为在那个时期,MPEG-4为了适应互联网较低的带宽速度,大部分应用都是一些低分辨率低码流的视频。而Xvid和Dvix虽然源自MPEG-4体系,但是面向视频文件存档进行了优化,可以比DVD小3~4倍的大小,存储与DVD画质非常接近的视频内容。受到了用户的极大喜爱,以至于在那个时期已经成为盗版影片的必选格式。
曾经互联网视频最大的赢家是Real Network,也是它最早实现了基于互联网的流媒体视频(在线观看)。想当年还在56K Modem窄带时期,Real Network公司就已经提供了视频在线观看功能。笔者曾经在那个还在PSTN上进行拨号的时代,体验过通过realplayer观看NBA的直播。如果以现在的标准来衡量那个时期的产品,那就是延时巨大(经常要loading几分钟)、画质惨不忍睹(分辨率超低,马赛克严重)、经常性的卡顿。
但是随着宽带的逐渐普及,RealMedia的巨大优势得以施展。在那个时期,RealMedia是当之无愧的王者。
首先,RealMedia压缩标准并非是MPEG-4衍生的版本,而是一个私有的压缩标准。这个标准由Real Network公司创立,且独有。RealMedia拥有极大的压缩比,远超MPEG家族。比如说一部标准DVD格式的电影,大约4.3GB容量,如果采用Dvix压缩的话,大概能压缩到700MB,而使用RM格式压缩,连700MB的一半都不到。即便是到了后期的RMVB压缩格式,也基本不会超500MB。
第二,Real Network公司在当时提供了世界上最完善的流媒体系统方案,只不过是收费的。那个时候的竞争对手只有微软的Windows Media Encoder,免费但是功能不完善。而RealMedia Encoder提供了VOD模式和LIVE模式完整的流媒体解决方案,虽然比较贵(印象中大概1万多美金)。
对于商业化应用的企业而言,要想做直播和点播业务,自然RealMedia Encoder服务会更加靠谱。虽然是收费的,但是系统稳定、可靠性强、又有服务支持(Windows Media Encoder只能在MSDN社区寻求帮助,没有技术支持)。所以说那个时期Real公司已经处于垄断地位了。
不过在那个时期,Real公司面临最大的问题是盗版。因为RealMedia的播放器虽然是免费的,但是编码器、解码器、流媒体服务器等等都是收费的。随着real格式日渐盛行,盗版就变得非常猖獗。当然Real公司没有微软那么财大气粗,所以自然要到处封杀。这只能说是在21世纪初期的互联网现状,如果要是放到现在,像Real这种公司风投还不挤破大门?公司的估值少说也得几百亿美金吧。
可惜的是,由于封闭而且收费,加上到处封杀,给了竞争对手很多机会。然后就有了Flash流媒体的崛起。
RealMedia能强大到什么程度呢?在21世纪初一直到2010年之前的差不多十年间,real格式一度成为了互联网视频格式的几乎唯一选择。那时候几乎所有盗版的电影和视频文件,全都是基于RM和RMVB格式的。21世纪以前呢?那是avi的天下,呵呵。
RealMedia的视频压缩主要分为两个阶段,第一阶段就是RM格式,第二阶段是RMVB。由于RM格式虽然压缩率出奇的高,但带来的问题就是画质很差,马赛克严重。随着宽带逐渐普及,人们对画质的要求逐渐提高,加上竞争对手的压力(Dvix和Xvid),RM升级到了RMVB。多出来“VB”这两个字幕,其实指的就是“Variable Bitrate”动态码率或者叫可变码率。关于码率的解释我们在文章最后来做。
RM升级到RMVB之后,一直被诟病的画质问题得到了提升,同时也可以支持较高的清晰度(最大到720P)。但是RMVB推出的时间已经晚于竞争对手,加上商业化的原因,以及更新速度越来越慢。最终消失在互联网的视野中。
不同于RealMedia的全行业流行,Flash Video(以下简称FLV)主要应用在流媒体领域,提供VOD点播和LIVE直播服务。与Dvix和Xvid一起成为了第二阶段的黄金组合。
FLV的压缩编码也不是源自MPEG-4,而是另外一个强大的标准H.26x体系,最早出现在1997年的MacWorld Expo大会上。说来很有意思,FLV天生就和苹果是一对,到最后却被苹果抛弃……
首先,FLV并非是一种压缩编码格式,而是封包格式(比如AVI、MKV、MP4、MOV这些文件,都是一种封包格式。关于封包格式的问题,由于涉及技术过深,在这里暂不作详解。感兴趣的用户可以自己了解掌握,@我也行哦)。FLV采用的视频压缩编码其实有蛮多的,开始是Sorenson Video和Sorenson Video Pro,以及Sonrenson Spark;后来加入了Sorenson MPEG 1/2/4,再后来就是目前最流行的H.264。
其实早期Sonrenson的很多压缩编码格式源自QuickTime压缩编码,也是基于H.263的压缩编码应用。所以我们就不单独介绍这种编码的特点了。
至于FLV在市场上的表现,其实大部分人都可能比较了解。毕竟国内的视频大站,比如优酷土豆、酷6、PPS、PPTV等,早期全都是用的FLV;国外的大站如youtube也是最早的FLV用户。只是随着苹果公司倡导的全面去flash化运动,所有视频大站不得不开始往HTML5转型。
WMV一直是一种不温不火的压缩编码格式,出道很早,但应用很少。早在RealMedia时期,微软就已经推出了WMV压缩格式。并可以配合Windows Media Encoder实现流媒体应用,也可以单独编码以文件形式存储。可以说路数跟Real公司一样,只不过是免费的。
其实Windows Media Encoder(以下简称WME)一直都没有什么起色,属于那种历史悠久但无人知晓的品种。早期在跟RealMedia竞争中处于下风,但至少有不少用户知道。后来有了FLV之后,基本就看不到WME的身影了。
至于WMV的压缩格式,最开始也是一种私有格式。只不过到了WMV 9.0的时候,微软向SMPTE学会提交的标准化方案,并入到了VC-1标准体系中。也就是其他家也可以共享这种编码技术。
在早期的WMV标准里面,比如WMV 7.0,是基于MPEG-4 part2实现的编码算法。最早期的版本没有资料,但是可以看得出,WMV主流的版本主要是基于MPEG-4编码的。
除了知名度很高的MPEG组织(隶属于ISO国际标准化组织下面的部门),还有一个在视频编码压缩领域有突出贡献的组织,那就是VCEG(Video Coding Experts Group,视频编码专家组)。VCEG属于另外一个非常厉害的组织ITU(国际电信联盟)下属的部门,可能大部分人都不知道这个名字,但你一定知道他们提供的标准——H.264。
VCEG组织主要编撰的是H.26x标准体系,主要有H.261,H.263,H.264。
H.261主要是面向视频会议领域的,也主要应用在监控安防领域。前面曾讲到的,都是低分辨率低码流视频。
H.263 算是H.261的加强版本,主要是支持更高的分辨率(16CIF),采用了更高级的运动补偿算法。后期又升级到了H.263+和H.263++,使得算法性能和分辨率等都有了明显的提升。
除了知名度很高的H.264以外,还有一个H.262标准,只不过应用非常少,就不讲了。
目前大家最熟悉的压缩编码格式莫过于H.264了,其实它还有另外一个名称MPEG-4 part10 AVC(Advanced Video Coding)。原因是这个标准不是一家制定的,而是两家世界上最权威的编码专家组织一同来完成的。那就是ITU下面的VCEG组织和ISO下面的MPEG组织。大家有兴趣的话,可以搜索一下ITU,就知道它在世界标准体系里面的重要性了。目前全世界的通信网络标准,比如2G的GSM、3G的WCDMA、TD-SCDMA、CDMA2000,以及4G的FDD-LTE和TDD-LTE都是ITU来发布的。
H.264/MPEG-4 AVC是融合了两家权威组织的知识结晶,是目前世界上最优秀的编码算法。它的特点非常多,我只列举一下大家能感知到的一些特点。更多的内容大家可以自行查阅资料。
大家可能都知道的一个道理,当压缩率越高的时候(同等画质下),编码就越复杂,计算量越高。所以对于H.264的编码和解码,其计算量比过去的MPEG-2、MPEG-4等都高了很多。所以也就会出现较早期的电脑在软解码(CPU解码)H.264视频的时候,容易出现卡顿。就是因为对计算性能要求较高。
但是好在有大量的专用编码解码芯片,以及专门对H.264编解码优化过的GPU(手机GPU和电脑显卡GPU),使得流畅性和速度得到了保障。所以你会发现某些高画质的视频,可能在电脑上播放会很卡,但是在一些机顶盒上播放会非常流畅。
其实在H.264还没流行起来,H.265标准就已经建立了。主要特点是压缩效率进一步提升,对UHDTV的支持,更好的信噪比等等。
目前已经有一部分手机、监控安防设备、视频会议设备开始使用H.265编码格式。预计以后会更多,并且逐渐普及。
说起QuickTime,大家一定会想起苹果公司。没错,quicktime就是苹果公司推出的一整套编码、解码、播放和流媒体解决方案。quicktime的压缩格式早期是私有的,由于早期MAC系列电脑(那时候没有iphone)普及率很低,所以使用quicktime这种格式的非常少,包括他们的流媒体应用。
只是到了后期,随着iphone的大量用户,quicktime才被大家所知。但这个时候苹果早就将quicktime标准加入到了MPEG-4标准体系中,以及后来H.264出现。结果大家都清楚了,苹果目前也在用H.264压缩标准。
其实除了上面讲到的主流非主流的视频压缩编码格式以外,还有很多大家不了解的。因为应用非常少,且现在几乎都是被H.264统一了市场。
简单的说码流就是视频每秒大概产生多大的视频文件,一般以bps(bit per second每秒产生比特数)为单位。其中b代表bit(比特),跟B容易混淆。其实B代表Byte,意为“字节”。1Byte字节=8bit比特。一般存储文件时,通常用B表示;传输文件时,为了表达速度时一般用b表示。
码流常用于视频传输时标记视频属性的,这是因为流媒体,尤其是直播体系中,文件的大小没有太多意义。因为观众可能是随时进来观看的,那么一直等到他观看结束后,才能获取到视频文件的大小。还有一点就是TS流文件不需要从开始读取,它本身就没有文件头尾的概念,可以从任何一个片段开始读取。所以这时候文件大小的意义也不大。
那么为了准确评估视频,需要用到码流这个参数。因为码流代表你每秒需要传输的数据量,需要与你的网络进行匹配。假如你的网络带宽是2Mbps,这代表理想状态下。那么如果你播放码率为1.5Mbps(约等于1500Kbps)的流媒体视频,就很可能会卡顿。主要原因是网络QOS(Quality of Service,服务质量)的问题,它无法保证数据一直都能以最高速度传输,毕竟网络环境很复杂。
在早期的时候,压缩编码标准都采用的是恒定码流编码形式(CBR模式),即每秒钟产生的视频文件大小是完全一样的。例如MPEG-1的码流就是1.5Mbps,那么60分钟的视频产生的文件就是675MB,正好一张VCD光盘的容量。
等到了MPEG-4时代,由于网络环境的复杂性,如果采用恒定码流的策略,在网络速度突然变差的时候,视频就容易卡顿。另外就是视频画面里面如果有存在大动态场景的时候,原先的码流可能会引起画质变差,需要临时降低一下压缩率。所以根据这两种情况的应用,在流媒体直播编码和视频压缩编码时根据实际情况可以采取不同的码流。所以就产生了可变码流编码形式(VBR模式)。
在进行VBR编码时,为了充分提高压缩编码率,可以采用2次压缩法,也就是2pass。但是2次压缩法会大大降低压缩的速度,虽然视频码流更低画质更好,但编码时间也大大拉长。