光是一种人类肉眼可见(接受)的电磁波,属于可见光谱的一部分。在科学上,光有时泛指所有类型的电磁波,如图2-3所示。光由一种称为光子的基本粒子构成,具有粒子性与波动性,即所谓的波粒二象性。
人类肉眼所能感知的可见光仅占整个电磁波谱的一小部分,其波长范围为390~760 nm(1 nm=1.0×10 −9 m)。
颜色是视觉系统对可见光的感知。研究表明,人类的视网膜上有3种对红、绿、蓝光敏感程度不同的锥体细胞。这3种锥体细胞对不同频率的光有不同的感知反应,同样,它们对不同亮度的光的感知也有所不同。
图2-3 光谱
可以通过以下量度值来衡量颜色。
● 饱和度(saturation):指颜色的纯洁程度,即颜色鲜艳程度。完全饱和的颜色是指没有掺杂白光的颜色,例如单一波长产生的光谱色就是完全饱和的。
● 明度(brightness):是视觉系统对物体辐射或者发光量的感知属性。因为明度很难度量,所以国际照明委员会定义了一个相关的物理量——亮度(luminance)。亮度与辐射的能量有关。明度的一个极端是黑色(无光)和白色,在这两个极端之间是不同深浅的灰色。
● 光亮度(lightness):是视觉系统对亮度的感知响应。光亮度可用作颜色空间的一个维度。光亮度用于描述反射或者透射表面,而明度则主要用于发光体。
颜色空间是一种表示和生成颜色的数学方法,使颜色得以形象化。颜色通常使用代表3个参数的三维坐标来定义,这些参数描述颜色在颜色空间中的位置,但并不告诉我们颜色的类型。颜色的具体类型要取决于所使用的坐标系统。常见的颜色空间如下。
1)RGB颜色空间
RGB是一种颜色标准,代表红色(Red,R)、绿色(Green,G)、蓝色(Blue,B)这3种颜色。所有颜色都可以通过这3种颜色通道的变化及其相互叠加得到。RGB是目前运用最广泛的颜色系统之一。
RGB有256级亮度,用数字0~255表示,能够组合出256×256×256(16777216)种不同的色彩,也被称为24位色(2 24 )。目前LCD和CRT显示器大都采用RGB。
在RGB模式下,每种RGB成分都可使用从0(黑色)到255(白色)的值。例如,亮红色使用R值246、G值20和B值50。当3种成分值相等时,产生灰色;当3种成分的值均为255时,结果是纯白色;当3种成分的值均为0时,结果是纯黑色。颜色与三基色之间的关系如表2-2所示。
表2-2 颜色与三基色之间的关系
2)CMY颜色空间
CMY是青色(Cyan)、品红色(Magenta)和黄色(Yellow)的简写,代表一种相减混色模式。这种方法产生的颜色之所以称为相减色,是因为它通过减少反射光来减少视觉系统识别颜色所需要的光量。由于彩色墨水和颜料的化学特性,仅用3种基本色混合得到的黑色并不是纯黑色,因此,在印刷术中,常常会加一种真正的黑色墨水(black ink),形成CMYK模型。每种颜色分量的取值范围为[0,100]。CMY常用于纸张彩色打印。
3)YUV颜色空间
在彩色电视技术中,亮度信号和两个色差信号分别用Y、C1、C2彩色表示。C1和C2的含义与具体的应用有关。例如,在NTSC彩色电视制式中,C1、C2分别表示I、Q两个色差信号;在PAL彩色电视制式中,C1、C2分别表示U、V两个色差信号;在CCIR 601数字电视标准中,C1、C2分别表示Cr、Cb两个色差信号。所谓色差是指基色信号(红R、绿G、蓝B)与亮度信号之差。根据美国国家电视标准委员会的标准,当白光的亮度用 Y 来表示时,它和红、绿、蓝三色光的关系可用下式描述:
Y =0.3 R +0.59 G +0.11 B
这是常用的亮度公式。色差U、V是由 B - Y 、 R - Y 按不同比例压缩得到的。如果由YUV颜色空间转换为RGB颜色空间,只须进行相应的逆运算。与YUV颜色空间类似的还有Lab颜色空间,它也是用亮度和色差来描述颜色分量的,其中,L代表亮度,a和b分别代表不同的色差分量。
例如,在PAL彩色电视制式中,PAL的YUV颜色空间与RGB颜色空间的转换关系如下:
Y =0.299 R +0.587 G +0.114 B
U =−0.147 R −0.289 G +0.436 B
V =0.615 R −0.515 G −0.100 B
当连续的图像变化每秒超过24帧时,根据视觉暂留的原理,人眼无法分辨出单独的静态画面,从而感知到的是平滑连续的视觉效果,这种连续的画面序列被称作视频。
帧是影像中的最小单位,相当于电影胶片中的每一格镜头。一帧就是一幅静止的画面,而连续的帧序列构成了视频。
帧速率是指每秒传输的图片数量,也可以理解为显示器每秒刷新的次数。帧速率越高,动作的显示越流畅。
转码是将一段多媒体内容,包括音频、视频,从一种编码格式转换为另一种编码格式的过程。
视频编码是视频文件中采用的压缩算法,其主要目的是将视频像素数据(如RGB、YUV等)压缩为视频码流,从而减少视频的数据量。
由于压缩(编码)后的内容不能直接使用,使用(观看)时需要进行解压缩,恢复为原始信号,这个过程被称为“解码”或者“解压缩”。
场频又称为刷新频率,是显示器的垂直扫描频率,指显示器每秒能显示的图像次数,单位为Hz。场频一般为60~100 Hz。屏幕刷新频率越高,图像闪烁越少,画面质量越高,观看者的视觉体验也越好。
人眼的视觉暂留为每秒16~24次,因此,只要屏幕画面每秒更新30次或更频繁,就能创造出画面连续不变的错觉。
一个完整的视频文件由音频和视频两部分组成,它们由封装格式和编码格式构成。常见的视频文件格式如AVI、RMVB、MKV、WMV、MP4、3GP、FLV等,其实只是封装标准或者外壳。
外壳的核心是编码文件。编码文件经过封装后,形成常见的MP4、AVI等视频文件。例如,H.264、MPEG-4等是视频编码格式,而MP3、AAC等是音频编码格式。
例如,将一个H.264视频编码文件和一个MP3视频编码文件按AVI标准封装,将得到一个以AVI为扩展名的视频文件。部分技术先进的容器还可以同时封装多个视频、音频编码文件,甚至封装字幕,如MKV封装格式。MKV文件能够包含多种语言的音轨和字幕,满足不同用户的需求。
封装格式的相关内容如下。
● 封装格式(也叫容器)是将编码压缩好的视频和音频轨道按照一定的格式放入一个文件中,相当于为这些轨道提供一个外壳。封装后的文件可以被视为一个包含视频和音频轨道的文件夹。
● 通俗来说,视频轨道相当于饭,而音频轨道相当于菜,封装格式则是盛放饭菜的碗或锅。
● 封装格式与专利紧密相关,关系到推出封装格式的公司的经济利益。
● 封装格式使得字幕、音频和视频组合起来,形成一个完整的视频文件。
● AVI、RMVB、MKV、ASF、WMV、MP4、3GP、FLV等都是常见的封装格式。
图2-4展示了视频封装格式。
图2-4 视频封装格式
通常播放网络视频需要经过如下操作。
● 解协议:将流媒体协议的数据解析为标准的封装格式数据。这些协议在传输音视频数据的同时也会传输一些控制信号。在解协议的过程中会去除控制信号,仅保留音视频数据。
● 解封装:将输入的封装格式数据分离成音频流编码压缩数据和视频流编码压缩数据。
● 解码:将视频流/音频流编码压缩数据解码成非压缩的原始数据。编码压缩的视频数据可以被输出为非压缩的颜色数据,如RGB、YUV420P等;编码压缩的音频数据可以被输出为非压缩的音频采样数据,如PCM等。
● 音视频同步:根据解封装模块在处理过程中获取的参数信息,同步解码出来的视频数据和音频数据。然后将同步后的视频数据和音频数据发送至系统的显卡和声卡进行播放。
网络视频的播放过程如图2-5所示。
图2-5 网络视频的播放过程
软件编码(简称软编)/软件解码(简称软解):由CPU处理。
硬件编码(简称硬编)/硬件解码(简称硬解):由GPU等专用芯片处理。
软编使用CPU进行处理,优点是调节能力强。相对于硬编,通过参数调整,软编可以在同一码率下产生更清晰的视频。此外,软编的兼容性更好,可以适配所有设备。然而,软编的缺点是性能差,处理速度不如硬编快,且功耗较高。
目前在移动应用的大部分业务场景中,采用的编码策略是:在移动端优先使用硬编生成高质量的视频流,然后将视频发送到服务器。服务器进行软编,将原视频转码为多路不同码率的视频,并通过CDN(Content Delivery Network,内容分发网络)将视频分发给播放端。对于某些运行安卓操作系统的低端设备,如果由于硬件问题而对硬编的支持不完善,可以使用软编,或者在硬编出错的情况下切换为软编。当然,针对一些性能较好的高端设备或者编码需求不高的业务场景,也可以优先考虑使用软编。例如,在录制15 s短视频的场景中,由于视频录制的时间比较短并且机器的性能比较高,因此不用担心CPU的消耗,可以使用软编进一步提高视频的清晰度。