在学习视频编码技术之前,需要先了解什么是帧:
帧
- 就是影像动画中最小单位的单幅影像画面;
- 一帧就是一副静止的画面,连续的帧就形成动画;
- 简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用FPS(Frames Per Second)表示;
- 每一帧都是静止的图象,快速连续地显示帧便形成了运动的假象;
- 高的帧率可以得到更流畅、更逼真的动画。每秒钟帧数 (fps) 愈多,所显示的动作就会愈流畅。
例如:一个 GIF 图,就是由若干张图片组合而成,每张图像相当于一帧
- 1秒钟之内至少需要16帧画面,播放起来才不会出现卡顿
- 正常开发视频播放通常会采集30帧
这个 GIF 图是由若干张图片组成:
数据流传输
- 数据在网络上是以很小的称为帧(Frame)的单位传输的;
- 未经压缩的视频的数据量巨大,根本没办法保存,更不适合网络中的传输;
- 所以一般情况下,在音视频传输之前,需要进行压缩,也就是编码;
- 数据流的传输过程:视频录制 –> 编码 –> 传输 –> 解码 –>播放。
编码定义:
- 从信息论的观点来看,描述信源的数据是信息和数据冗余之和, 即:数据 = 信息+数据冗余
- 所以要想获取到真实有用的信息,必须去掉 “数据冗余“,这样数据的大小也会减少很多,这种去除冗余信息的过程,我们就称之为压缩编码
空间冗余:图像相邻像素之间有较强的相关性
同一景物表面上采样点的颜色之间通常存在着空间相关性,相邻各点的取值往往相近或者相同,这就是空间冗余。
- 例如,图像中有一片连续的区域,这个区域的像素都是相同的颜色,那么空间冗余就产生了。
- 如果对每一个像素进行单独的存储,必然会非常浪费空间。
时间冗余:视频序列的相邻图像之间内容相似
在视频、动画图像中,相邻帧之间往往存在着时间和空间的相关性。
- 例如,人们在会议室中开会,随着会议的进行,时间在改变,但是背景(房间、家具等)一直是相同的、而且没有移动,变化的只是人们的动作和位置。这里的背景就反映为时间冗余。
- 同样,由于人在说话时产生的音频也是连续和渐变的,因此声音信息中也会存在时间冗余。
- 所以如果对每张图像进行单独的像素存储,在下一张图片中又出现了相同的。那么相当于很多像素都存储了多份,必然会非常浪费空间。
视觉冗余:人的视觉系统对某些细节不敏感
在多媒体技术的应用领域中,人的眼睛是图像信息的接收端。
视觉冗余是相对于人眼的视觉特性而言的,人类的视觉系统并不能对图像画面的任何变化都能感觉到。
通常情况下具有以下特点:
- 对亮度的变化敏感,对色度的变化相对不敏感。
- 对静止图像敏感,对运动图像相对不敏感。
- 对图像的水平线条和竖直线条敏感,对斜线相对不敏感。
- 对整体结构敏感,对内部细节相对不敏感。
- 对低频信号敏感,对高频信号相对不敏感(如:对边沿或者突变附近的细节不敏感)
- ……
因此,包含在色度信号、运动图像、图像高频信号中的一些数据,相对于人眼而言,并不能对增加图像的清晰度作出贡献,被人眼视为多余的,这就是 视觉冗余。
压缩编码的标准
标准化组织:
ITU:International Telecommunications Union VECG:Video Coding Experts Group(国际电传视讯联盟)
- H.26X系列
- H.261:主要在老的视频会议和视频电话产品中使用
- H.263:主要用在视频会议、视频电话和网络视频上
- H.264:H.264/MPEG-4第十部分,或称AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。
- H.265:高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×4320(8K分辨率),这是目前发展的趋势,尚未有大众化编码软件出现
ISO:International Standards Organization MPEG:Motion Picture Experts Group(国际标准组织机构)
- MPEG系列(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发)
- MPEG-1第二部分:MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种格式
- MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD、SVCD和大多数数字视频广播系统中
- MPEG-4第二部分(MPEG-4第二部分标准可以使用在网络传输、广播和媒体存储上。
目前应用最广泛的H.264(AVC)
特点:高压缩高质量和支持多种网络的流媒体传输
在H264协议里定义了三种帧
- I帧:完整编码的帧叫I帧
- P帧:参考之前的I帧生成的只包含差异部分编码的帧叫P帧
- B帧:参考前后的帧编码的帧叫B帧
H264采用的核心算法是帧内压缩和帧间压缩
- 帧内压缩是生成I帧的算法
- 帧间压缩是生成B帧和P帧的算法
H264的压缩方法:
- 分组: 把几帧图像分为一组(GOP:Group of picture(图像组),也就是一个序列),为防止运动变化,帧数不宜取多;
- 定义帧: 将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
- 预测帧: 以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
- 数据传输: 最后将I帧数据与预测的差值信息进行存储和传输。
H264分层设计
- 视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示;
- 网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。
编码方式
编码的方式有两种:
- 软编码:使用 CPU 进行编码,软编码通常使用:ffmpeg+x264
- 硬编码:使用非 CPU 进行编码,如显卡 GPU、专用的 DSP、FPGA、ASIC 芯片等
PS:
ffmpeg:是一套开源的、用于对音视频进行编码&解码&转化计算机程序
x264:x264是一种免费的、开源的、具有更优秀算法的H.264/MPEG-4 AVC视频压缩编码方式
对比:
- 软编码:实现直接、简单,参数调整方便,升级易,但CPU负载重,性能较硬编码低
- 硬编码: 性能高,对CPU没有压力,但是对其他硬件要求较高(如GPU等)
iOS中编码方式:
- 在iOS8之前,苹果并没有开放硬编码的接口,所以只能采用ffpeng+x624进行软编码
- 在iOS8之后,苹果开放了接口,并且封装了
VideoToolBox&AudioToolbox
两个框架,分别用于对视频&音频进行硬编码