iOS音视频底层(三)之音视频编码原理-H.264编码原理

998 阅读17分钟

本文主要内容

一.视频相关基础内容
二.视频相关概念
三.H.264基本概念
四.H.264编码原理

一.视频相关基础内容

1、像素 Pixel

简单地说,像素、分辨率等都是用来描述显示画面的精细程度或者清晰程度。我们知道点构成线、线构成面,图像(图片和视频)也是这样。图像由很多很多个小点构成,这些小点我们称之为像素,也叫像素点。相同物理面积下,像素点越多,显示的图像就越清晰,像素点越少,显示的图像越模糊。在很多情况下,它们采用点或者方块显示。举个例子,一张人像照片,如果有2000万个像素点,可能连毛孔都看得很清晰,如果只有100万个像素点可能鼻子眼睛都会模糊,这就是用像素的多少来描述图片的清晰程度。我们通常说的1000万像素、2000万像素、1亿像素指的就是图像的像素点总数。 如下图1和图2,图2是将图1放大11倍的效果,可能看到很多小方块,这些小方块就是像素点。正常状态下因为它们太小看不到。
图1 image.png 图2
image.png

2、分辨率 Resolution

视频分辨率是指视频成像产品锁成图像的大小或尺寸,表达式为:水平像素数✖️垂直像素数。常见的图像分辨率有QCIF(176×144) 、CIF(352×288)、D1(704×576)、720P(1280×720)、1080P(1920*1080)。摄像机成像的最大分辨率是由CCD或CMOS感光器件决定的。现在摄像机基本支持修改分辨率,是通过摄像机自带软件裁剪原始图像生成的。

3、帧率 Frame Rate

一帧就是一副静止的画面,连续的帧就形成动画,如电影等。我们通常所说的帧数就是在1秒钟时间里传输的图片的帧数,通常用fps(Frames Per Second)表示。每一帧都是静止的图像,快速连续地显示帧便形成了运动的假象,还原了物体当时的状态。高帧率可以得到更流畅、更逼真的动画。每秒钟帧数(fps)越多所显示的动作就会越流畅。一般来说,图像帧率设置为25fps或30fps已经足够。

4、码流 Data Rate

码流是指视频图像经过编码压缩后在单位时间内的数据流量,也叫码率,是视频编码中画面质量控制中最重要的部分。同样分辨率下,压缩比越小,视频图像的码率越大,画面质量越高。``。

分辨率、帧率、码流之间的关系:

  • 帧率与流畅度成正比;
  • 分辨率与图像大小成正比;
  • 分辨率一定时,码率和清晰度成正比;
  • 码率一定时,分辨率与清晰度成反比。

二.视频相关概念

1、视频文件格式

文件格式这个概念我们比较熟悉,比如常见的word文档的文件格式是.doc,图片的文件格式是.jpg或png等。对于视频来说,常见的文件格式有.mov、.avi、.mpg、vob、 .mkv、.rm、.rmvb等。文件格式通常表现为文件在操作系统上存储时的后缀名,它通常会被操作系统用来与相应的打开程序关联,比如.doc文件系统会默认调用word打开,.avi或者.mkv文件系统会调用视频播放器打开等。 同样是视频,为什么会有.mov、.avi、.mpg等多种文件格式呢?那是因为它们是通过不同的方式实现了“视频”。

2、视频封装格式

视频封装格式,简称视频格式,相当于一种储存视频信息的容器,里面包含了封装视频文件所需要的视频信息、音频信息和相关的配置信息(视频和音频的关联信息,如何解码等配置)。一种视频封装格式的直接反映就是对应着相应的视频文件格式。如下为主要的视频文件封装格式:

截屏2022-08-18 11.07.29.png

  • AVI格式:对应的文件格式为.avi,英文全称Audio Video Interleave,即音频视频交错格式,是微软公司于1992年11月推出、作为其Windows视频软件一部分的一种多媒体容器格式。这种视频格式的优点是图像质量好,无损AVI可以保存alpha通道。缺点是体积过于庞大,并且压缩标准不统一,存在较多的高低版本兼容问题。

  • DV-AVI格式:对应文件格式为.avi,英文全称Digital Video Format,是由索尼、松下、JVC等多家厂商联合提出的一种家用数字视频格式。非常流行的数码摄像机就是使用这种格式记录视频数据的。它可以通过电脑的IEEE 1394端口传输视频数据道电脑,也可以将电脑中编辑好的视频数据回录到数据摄像机中。

  • WMV格式:对应的文件格式是.wmv、.asf,英文全称Window Media Video,是微软推出的一种采用独立编码方式并且可以直接在网上实时观看视频节目的文件压缩格式。在同等视频质量下,WMV格式的文件可以边下载边播放,因此很适合在网上播放和传输。

  • MPEG格式:对应的文件格式有.mpg、.mpeg、.mpe、.dat、.vob、.asf、.3gp、.mp4等,英文全称Moving Picture Experts Group,是由运动图像专家组指定的视频格式,该专家组于1988年组建,专门负责视频和音频标准制定,其成员都是视频、音频以及系统领域的技术专家。MPEG格式目前有三个压缩标准,分别是MPEG-1、MPEG-2和MPEG-4。MPEG-4是现在用的比较多的视频封装格式,它为了播放流式媒体的高质量视频而专门设计的,以求使用最少的数据获得最佳的图像质量。

  • Matroska格式:对应的文件格式是.mkv,Matroska是一种新的视频封装格式,它可将多种不同编码的视频及16条以上不同格式的音频和不同语言的字幕流封装到一个Matroska Media文件中。

  • Real Video格式:对应的文件格式是.rm、.rmvb,是Real Networks公司所制定的音视频压缩规范称为Real Media。用户可以使用RealPlayer根据不同的网络传输速率制定出不同的压缩比率,从而实现在低速率的网络上进行影像数据实时传送和播放。

  • QuickTime File Format格式:对应的文件格式是.mov,是Apple公司开发的一种视频格式,默认的播放器是苹果QuickTime。这种封装格式具有较高的压缩比率和较完美的视频清晰度等特点,并可以保存alpha通道。

  • Flash Video格式:对应的文件格式是.flv,是由Adobe Flash延伸出来的一种网络视频封装格式,被很多视频网站所采用。

3、容器(视频封装格式文件)

封装格式:就是将已经编码压缩好的视频数据和音频数据按照一定的格式放到一个文件中,这个文件被称为容器。可以理解为是一个“外壳”。 通常在容器中不仅仅只存放音视频数据,还会存放一些视频同步的元数据,如字幕。一般情况下,多种数据需要用到不同的程序进行处理,但是文件在传输和存储时,这些数据都是被绑定在一起的。

常见的视频容器格式:

  • AVI:是当时为对抗Quicktime格式(mov)而推出的,只能支持固定CBR恒定比特率编码的声音文件;
  • MOV:是Quicktime封装;
  • VMV:微软推出的,作为市场竞争;
  • mkv:万能封装器,有良好的兼容和跨平台性、纠错性,可带外挂字幕;
  • flv:这种封装方式可以很好的保护原始地址,不容易被下载到,目前一些视频分享网站都采用这种封装方式;
  • MP4:主要应用于mpeg4的封装,主要在手机上使用。

4、音视频编解码方式

视频编解码的过程是指对数字视频进行压缩或解压缩的过程。

在做视频编解码时,需要考虑以下因素的平衡:视频的质量、用来表示视频所需要的数据量(即码率)、编解码算法的复杂度、针对数据丢失和错误的鲁棒性(Robustness)、编辑的方便性、随机访问、编码算法设计的完美性、端到端的延时以及其他因素。

4.1 常见视频编码方式

  • H.26X系列:由国际电传视讯联盟远程通信标准化组织(ITU-T)主导,包括H.261、H.262、H.263、H.264、H.265。

    • H.261:主要用于老的视频会议和视频电话系统。是第一个使用的数字视频压缩标准。实质上说,之后的所有的标准视频编解码器都是基于它设计的;
    • H.262:等同于MPEG-2第二部分,使用在DVD、SVCD和大多数数字视频广播系统和有线分布系统中。
    • H.263:主要用于视频会议、视频电话和网络视频相关产品。在对逐行扫描(一种对位图图像进行编码的方法,通过扫描或显示每行或每行像素,在电子显示屏上“绘制”视频图像的两种常用方法之一,另一种是隔行扫描)的视频进行压缩的方面,H263比它之前的视频编码标准在性能上有了较大的提升。尤其是在低码率端,它可以在保证一定质量的前提下大大的节约码率。
    • H.264:等同于MPEG-4第十部分,也被称为高级视频编码(Advanced Video Coding简称AVC),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。该标准引入了一系列新的能够大大提高压缩性能的技术,并能够同时在高码率端和低码率端大大超越以前的诸标准。
    • H.265:被称为高效率视频编码(High Efficiency Video Coding简称HEVC),是一种视频压缩标准,是H.264的继任者。HEVC被认为不仅提升图像质量,同时也能达到H.264两倍的压缩率(等同于同样画面质量下比特率减少了50%),可支持4K分辨率甚至到超高画质电视,最好分辨率可达到8192x4320(8K分辨率),这是目前发展的趋势。
  • MPEG系列:由国际标准组织机构(ISO)下属的运动图像专家组(MPEG)开发。

    • MPEG-1第二部分:主要使用在VCD上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的VHS录像带相当;
    • MPEG-2第二部分:等同于H.262,使用在DVD、SVCD和大多数数字视频广播系统和有线分布系统中;
    • MPEG-4第二部分:可以使用在网络传输、广播和媒体存储上。比起MPEG-2第二部分和第一版的H.263,它的压缩性能有所提高;
    • MPEG-4第十部分:等同于H.264,是这两个编码组织合作诞生的标准。
  • AMV、AVS、Bink、CineForm等。

4.2 常见音频编码方式

视频中除了画面通常还有声音,所以就涉及到音频编解码。视频中常用的音频编码方式如下:

  • AAC:英文全称Advanced Audio Coding,是Fraunhofer llS、杜比实验室、AT&T、Sony等公司共同开发,在1997年推出的基于MPEG-2的音频编码技术。2000年,MPEG-4标准出现后,AAC重新集成了其特性,加入了SBR技术和PS技术,为了区别于传统的MPEG-2 AAC又称为MPEG-4 AAC。
  • MP3:英文全称MPEG-1 or MPEG-2 Audio Layer III,是曾经非常流行的一种数字音频编码和有损压缩格式,它被设计用来大幅降低音频数据量。在1991年,由德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。MP3的普及,曾对音乐产业造成极大的冲击与影响。
  • WMA:英文全称Windows Media Audio,由微软公司开发的一种数字音频压缩格式,本身包括有损和无损压缩格式。

5、视频编解码方式和视频封装格式关系

可以把视频封装格式看作是一个装着视频、音频、视频编解码方式等信息的容器。一种视频封装格式可以支持多种视频编解码方式。比如QuickTime File Format(.mov)支持几乎所有的视频编解码方式,MPEG(.mp4)也支持相当广的视频编解码方式。当我们看到一个视频文件名为test.mov时,可以知道它的视频文件格式和视频封装格式分别是.movQuickTime File Format,但是无法知道他的视频编解码方式。专业的说法可以是以A/B的方式,A是视频编解码方式,B是视频封装格式。比如,一个H.264/MOV的视频文件,它的封装方式是QuickTime File Format,编码方式是H.264。

6、直播/小视频中的编码格式

  • 视频编码格式:

    • H.264编码的优势:低码率、高质量的图像、容错能力强、网络适应性强,具有很高的数据压缩比率,在同等图像质量下,H.264的压缩比是MPEG-2的2倍以上,MPEG-4的1.5-2倍;
    • 举例:原始文件的大小如果为88GB,采用MPEG-2压缩标准压缩后变成3.5GB,压缩比为25:1,而采用H.264压缩标准压缩后变成879MB,压缩比为102:1。
  • 音频编码格式

    • AAC是目前比较热门的有损压缩编码技术,并且衍生了LC- AAC、HE-AAC、HE-AAC v2三.种主要编码格式;
    • LC-AAC是比较传统的AAC,主要应用于中高码率(>=80kbit/s)的场景编码;
    • HE- AAC主要应用于低码率(<=48kbit/s)场景的编码;
    • 在小于128kbit/s的码率下表现优异,并且多用于视频中的音频编码;

三.H.264基本概念

H.264是现在广泛采用的一种编码方式。关于H.264相关的概念,从大到小排序依次是:序列、图像、片组、片、NALU、宏块、亚宏块、块、像素。

1、图像

H.264中,图像是集合的概念,顶场底场都可以称为图像。一帧通常就是一幅完整的图像。 当采集视频信号时,如果采用逐行扫描,则每次扫描得到的信号就是一幅图像,也就是一帧。 如果采用隔行扫描(奇数、偶数行),则扫描下来的一帧图像就被分为两部分,每一部分都称为场,根据次序分为顶场底场。 帧和场的概念又带来了不同的编码方式:帧编码、场编码。逐行扫描适合于运动图像,对于运动图像采用帧编码更好;隔行扫描适用于非运动图像,对于非运动图像采用场编码更好。

截屏2022-08-18 19.35.14.png

截屏2022-08-18 19.35.26.png

2、片Slice、NALU、宏块

  • 每一帧图像可以分为多个片

  • NALU:全称Network Abstraction Layer Unit,网络提取层单元。是用来将编码的数据进行打包的,一个分片(Slice)可以编码到一个NALU单元,不过一个NALU单元中除了容纳分片编码的码流外,还可以容纳其它数据,比如序列参数集SPS。对于客户端其主要任务则是接收数据包,从数据包中解析出NALU单元,然后进行解码播放。

  • 宏块Macroblock,分片是由宏块组成。

3、颜色模型

3.1 RGB颜色模型

开发场景中使用最多的应该是RGB模型。

截屏2022-08-18 19.48.08.png

在RGB模型中每种颜色需要3个数字,分别表示红色R、绿色G、蓝色B,通常一个数字占用1字节,所以一种颜色需要24bits

3.2 YCbCr颜色模型(YUV一种)

假设定义一个亮度Luminance的概念来表示颜色的亮度,那它就可以用含R、G、B的表达式表示为:

Y = kr*R + kg*G + kb*B
* Y即亮度,kr、kg、kb为R、G、B的权重值。

这时定义一个色度Chrominance的概念来表示颜色的差异。

Cr = R - Y
Cg = G - Y
Cb = B - Y
* Cr、Cg、Cb分别表示在R、G、B上的色度分量。

上述模型就是YCbCr颜色模型基本原理。 YCbCr是属于YUV家族的一员,是在计算机系统中应用最为广泛的颜色模型。在YCbCr中Y是指亮度分量,Cb是蓝色色度分量,Cr指红色色度分量。

在YUV中Y表示亮度,即灰阶值,U和V则是表示色度。
YUV的关键是在于它的亮度信号Y和色度信号U、V是分离的。那就是说即使只有Y信号分量而没有U、V分量,仍然可以表示出图像,只不过图像是黑白灰度图像。

从ITU-R BT.601-7标准中拿到推荐的相关系数,可以得到 YCbCr 与 RGB 相互转换的公式:

Y = 0.299R + 0.587G + 0.114B
Cb = 0.564(B - Y)
Cr = 0.713(R - Y)
R = Y + 1.402Cr
G = Y - 0.344Cb - 0.714Cr
B = Y + 1.772Cb

此时YCbCr仍然用了3个数字来表示颜色,会节省bit吗?结合视频中的图像和图像中的像素表示来说明

  • 假设图片由如下像素组成:

截屏2022-08-18 20.10.22.png

  • 一幅图片就是一个像素阵列。每个像素的3个分量的信息是完整的,YCbCr 4:4:4。

截屏2022-08-18 20.11.50.png

  • 对于每个像素点都保留亮度值,但是省略每行中偶素位像素点的色度值,从而节省了bit。YCbCr 4:2:2

截屏2022-08-18 20.13.50.png

  • 以下做了更多的省略,但是对图片质量的影响却不会太大。

截屏2022-08-18 20.14.58.png

4、H.264基本概念

4.1 I帧、P帧、B帧

I帧: 关键帧,采用帧内压缩技术

  • 例如,如果摄像头对着你拍摄,1秒之内实际发生的变化非常少。摄像机一般一秒钟会抓取几十帧的数据,比如动画就是25帧/s,一般视频文件就是30帧/s左右。对于一些要求比较高的,对动作精细度有要求,想要抓捕到完整的动作,高级的摄像机一般是60帧/s。为了便于压缩数据,将第一帧完整的保存下来。如果没有这个关键帧,后面解码数据是完成不了的,所以I帧特别关键。

P帧: 向前参考帧,压缩时只参考前一帧,属于帧间压缩技术。

  • 视频的第一帧会被作为关键帧完整保存下来,而后面的帧会向前依赖,也就是第二帧依赖于第一帧。后面所有的帧只存储与前一帧的差异,这样就能将数据大大的减少,从而达到一个高压缩率的效果。

B帧: 双向参考帧,压缩时既参考前一帧也参考后一帧,属于帧间压缩技术。

  • B帧,既参考前一帧又参考后一帧,这样就使得它的压缩率更高,存储的数据量更小。如果B帧的数量越多,压缩率就越高,是B帧的优点。B帧最大的缺点是,如果是实时互动的直播,B帧就要参考后面的帧才能解码,在网络中就要等待后面的帧传输过来。如果网络状态良好,解码会比较快,如果网络不好,解码会变慢。丢包时还需要重传,因此对于实时互动的直播,一般不会使用B帧;
  • 如果在泛娱乐的直播中,可以接受一定程度的延时,需要比较高的压缩比就可以使用B帧;
  • 如果在实时互动的直播中,需要提高实效性,就不能使用B帧了。

4.2 GOF(Group of Frame)一组帧、GOP(Group of Pictures)画面组

如果在一秒钟内有30帧,如果摄像机或者镜头一分钟内没有发生大的变化,可以把这一分钟内所有的帧画做一组。

  • 什么叫一组帧?就是一个I帧到下一个I帧,这一组的数据,包括B帧/P帧,称为GOF

  • GOP画面组:一组连续的画面。是序列中的一个图片集,用来辅助随机存取。GOP的第一个图像必须为I帧,这样就能保证GOP不需要参考其他图像,可以独立解码。

4.3 SPS/PPS

SPS/PPS实际上就是存储GOP的参数。

  • SPS:Sequence Parameter Set,序列参数集。存放帧数、参考帧数目、解码图像尺寸、帧场编码模式选择标识等,是一组帧的参数集。

  • PPS:Picture Parameter Set,图像参数集。存放熵编码模式选择标识、片组数目、初始量化参数、去方块滤波系数调整标识等,与图像相关的信息。

在一组帧之前首先收到的是SPS/PPS数据,如果没有这组参数的话,无法解码! 如果在解码时发生错误,首先要检查是否有SPS/PPS,如果没有,是应为对端没有发送过来还是因为对端在发送过程中丢失了。 SPS/PPS数据归类到I帧,这2组数据是绝对不能丢的。

5、视频花屏、卡顿原因

在观看视频时,会遇到花屏或者卡顿现象,这个与GOP有关。

  • 如果GOP分组中的P帧丢失就会造成解码端的图像发生错误;
  • 为了避免花屏问题,一般如果发现P帧或者I帧丢失,就不显示本GPP内的所有帧,只到下一个I帧来后重新刷新图像;
  • 因为丢包的这一组帧全部扔掉了,无法刷新屏幕,图像就会卡着不动,即卡顿。
  • 总结来说,花屏是因为丢了P帧或者I帧,导致解码错误。卡顿是因为怕花屏将整组错误的GOP数据扔掉了,直达下一组正确的GOP

四.H.264编码原理

1、H.264压缩技术

  • 帧内预测压缩。解决的是空域数据冗余问题。
    什么是空域数据?就是这幅图里数据在宽高空间内包含了很多颜色、光亮,人的肉眼很难察觉的数据我们可以认作冗余,直接压缩掉。

  • 帧间预测压缩。解决的是时域数据冗余问题。 摄像头在一段时间内所捕捉的数据没有较大的变化,针对这一时间内的相同的数据进行压缩,叫作时域数据压缩。

  • 整数离散余弦变换(DCT),将空间上的相关性变为频域上无关的数据,然后进行量化。 傅立叶变换可以把一个复杂波形图变换成许多正弦波,只是它们之间的频率和振幅不一样,如果它们在频率上没有一致性,就可以对其进行压缩处理。

  • CABAC压缩:无损压缩。

2、宏块划分与分组

H.264宏块划分,可以参考下图。

截屏2022-08-19 14.14.22.png

将一个图片左上角用宏块描述,就是宏块为88的元素。取出的颜色,像右边的去描述。 基本图片的宏块划分完成了,是否每个宏块都是88的?当然不是,还有子块划分。
子块划分:

截屏2022-08-19 14.22.23.png

在这个大的宏块里,可以再细化。如果中间这个全部都是蓝色的宏块,就可以用一个色块,更加简单的描述。

  • 对比MPEG2和H.264,发现MPEG2存储时还算比较完整,占用的空间相对较多;而H.264减少了很多空间,重复的颜色就会用简单的色块描述。

帧分组 例如,一个台球从一个位置移动到另一个位置,其桌面背景是一样的,只是球体位置发生了变化,就可以把这一组帧划分为一组。

3、组内宏块查找

实际上如图,将台球从一角滚动到另外一角,相邻的2幅图做组内的宏块查找。将图逐行扫描,扫描到第三行,发现了台球,然后围绕它的周围查找,发现了有类似的图块。

截屏2022-08-19 14.35.38.png

运动估算
把它们放在同一张图中,即台球刚开始的位置1和移动到的位置2,之间有一个运动矢量,包括运动的方向和距离。将所有的图比较,最后形成右图,右图中每一个红色的箭头标注的都是一个运动矢量,很多帧就会形成一个连续的运动估算。

运动矢量与补偿压缩
将连续的运送估算换算成如图。对其进行压缩,所有帧的背景都一样,变换的就是它的运动矢量和台球的数据。实际经过运算后,留下来的就只有运动矢量数据和残差值的数据,经过这样的运算,只需要要存储这些数据,达到压缩的效果,这个过程就是帧间压缩技术的原理。

截屏2022-08-19 14.41.28.png

4、帧内预测

帧内压缩是针对于I帧的,解决的是空间的数据冗余。而帧间压缩解决的是时间数据冗余。帧间压缩技术是将大量在时间轨迹上相同的数据压缩掉,只留下运算估量和残差值。

帧内压缩原理 首先要经过计算,选择用哪种模式,对每一个宏块采用不同的模式运算。当每个宏块都选定了模式之后,就形成了下图效果,每个宏块都选择一个帧内预测的模式,帧内预测一共有9种模式,详细参考H.264系列文章(三)——帧内预测。让每个宏块挑选好模式之后,就可以使用块预测模式,预测完后将得到一张预测图。左边是预测图,右边是原图。 截屏2022-08-19 15.36.25.png

计算的预测图和原图是有差别的,原图比较圆润,预测图相对比较粗糙。根据2张图可以进行差计算。

计算帧内预测残差值 如下图为原图,通过预测与原图的差得出一个结果:灰色图就是残差值。

截屏2022-08-19 15.40.45.png

预测模式与残差值压缩 拿到残差值后,进行压缩。压缩时保存残差数据和每个宏块选择的模式信息数据。解码时,首先通过宏块的模式信息计算出预测图,然后将预测图与残差值进行累积,就能还原原图像,这个过程就是"帧内压缩技术"的原理。