FFmpeg入门详解:音视频流媒体播放器原理及应用
上QQ阅读APP看书,第一时间看更新

1.1.1 视频简介

图像是人对视觉感知的物质再现。三维自然场景的对象包括深度、纹理和亮度信息。二维图像主要包括纹理和亮度信息。视频本质上是连续的图像。视频由多幅图像构成,包含对象的运动信息,又称为运动图像。总之,视频是由多幅连续图像组成的。

1.数字视频

数字视频可以理解为自然场景空间和时间的数字采样表示。数字视频的系统流程包括采集、处理、显示这3个步骤,如图1-1所示。

(1)采集:通常使用照相机或摄像机。

(2)处理:包括编解码器和传输设备。

(3)显示:通常用显示器进行数字视频的渲染。

图1-1 数字视频系统的原理流程示意图

2.帧率与码率

视频(Video)泛指将一系列静态影像以电信号的方式加以捕捉、记录、处理、存储、传送与重现的各种技术。当连续的图像变化每秒超过24帧画面以上时,根据视觉暂留原理,人眼无法辨别单幅的静态画面,看上去是平滑连续的视觉效果,这样连续的画面叫作视频。视频技术最早是为电视系统而发展的,但现在已经发展为各种不同的格式以方便消费者将视频记录下来。网络技术的发达也促使视频的记录片段以串流媒体的形式存在于因特网之上并可被计算机接收与播放。视频与电影属于不同的技术,后者是利用照相术将动态的影像捕捉为一系列的静态照片。常见的视频格式有AVI、MOV、MP4、WMV、FLV、MKV等。

帧(Frame)就是视频或者动画中的每张画面,而视频和动画特效就是由无数张画面组合而成的,每张画面都是一帧。视频是由许多静态图片组成的,视频的每张静态图片就叫一帧。视频帧又分为I帧、P帧和B帧。I帧即帧内编码帧,大多数情况下I帧就是关键帧,是一个完整帧,是无须任何辅助就能独立完整显示的画面。P帧即前向预测编码帧,是一个非完整帧,通过参考前面的I帧或P帧生成画面。B帧即双向预测编码帧,参考前后图像帧编码生成,通过参考前面的I/P帧或者后面的P帧来协助形成一个画面。只有I帧和P帧的视频序列,如I1P1P2P3P4I2P5P6P7P8,包括I帧、P帧和B帧的序列,如I1P1P2B1 P3P4B2 P5I2B3 P6 P7。

帧率(Frame Rate)是用于测量显示帧数的量度,单位为f/s(Frames per Second),即每秒显示的帧数或赫兹(Hz)。帧率越高,画面越流畅、逼真,对显卡的处理能力要求越高,数据量越大。前面提到每秒超过24帧的图像变化看上去是平滑连续的,这是针对电影等视频而言的,但是针对游戏来讲24f/s是不流畅的。

码率即比特率,是指单位时间内播放连续媒体(如压缩后的音频或视频)的比特数量。在不同领域有不同的含义,在多媒体领域,指单位时间播放音频或视频的比特数,可以理解成吞吐量或带宽。码率的单位为b/s,即每秒传输的数据量,常用单位有b/s、Kb/s等。比特率越高,带宽消耗得越多。通俗一点理解码率就是取样率,取样率越大,精度就越高,图像质量越好,但数据量也越大,所以要找到一个平衡点,用最低的比特率达到最低的失真。

3.视频压缩编码

视频为什么需要编码,关键就在于一个原始视频,如果未经编码,则文件大小非常庞大。以一个分辨率为1920×1080像素,帧率为30fps的视频为例,共有1920×1080=2 073 600像素,每个像素占24b(假设采取RGB24)。也就是每张图片为2 073 600×24=49 766 400b。8b(位)=1B(字节),所以,49 766 400b=6 220 800B≈6.22MB。这才是一幅1920×1080像素图片的原始大小(6.22MB),再乘以帧率30。也就是说,1s视频的大小是186.6MB,1min大约是11GB,一部90min的电影,约为1000GB(约1TB)。

视频产生之后涉及两个问题,包括存储和传输。如果按照100Mb/s的网速(12.5MB/s),下载刚才的那部电影,则大约需要22小时。为了看一部电影,需要等待22小时,这是用户不能接受的。正因为如此,专业的视频工程师就提出,必须对视频进行压缩编码。数据编码是指按指定的方法将信息从一种格式转换成另一种格式。视频编码就是将一种视频格式转换成另一种视频格式。视频编码和解码是互逆的过程,如图1-2所示。

图1-2 视频编码

编码的终极目的是压缩,市面上各种各样的视频编码方式都是为了让视频变得更小,有利于存储和传输。视频编码是指通过特定的压缩技术,将某个视频格式的文件转换成另一种视频格式。视频数据在时域和空域层面都有极强的相关性,这表示有大量的时域冗余信息和空域冗余信息,压缩编码技术就是去掉数据中的冗余信息。

去除时域冗余信息的主要方法包括运动补偿、运动表示、运动估计等。运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,可有效地减少帧序列冗余信息。运动表示是指不同区域的图像使用不同的运动向量来描述运动信息,运动向量通过熵编码进行压缩(熵编码在编码过程中不会丢失信息)。运动估计是指从视频序列中抽取运动信息,通用的压缩标准使用基于块的运动估计和运动补偿。

去除空域冗余信息的主要方法包括变换编码、量化编码和熵编码。变换编码是指将空域信号变换到另一正交向量空间,使相关性下降,数据冗余度减小。量化编码是指对变换编码产生的变换系数进行量化,控制编码器的输出位率。熵编码是指对变换、量化后得到的系数和运动信息进行进一步无损压缩。