音视频基础知识整理

视频是包含了画面和声音的一个整体,是采用了一些复杂的算法将画面和声音数字信号进行编码存储,并通过解码算法再进行画面和声音的还原播放。

视频文件格式

文件格式其实就是为了让系统中的应用程序识别并关联这些文件,让相应的文件由相应的应用程序打开。比如你双击一个.mp4文件,就会打开播放器并播放该文件。

所以我们常见到的.avi .mp4 .rmvb .mkv等都是视频的文件格式。它由 系统中得播放器程序关联。你可以随意改扩展名,但是视频本身的内容不会变,只是关联启动的应用程序可能会变。并不是说将一个.avi的视频后缀改为.mp4他就变成MP4格式的了。

视频封装格式

封装格式(也叫容器),就是将已经编码压缩好的视频轨和音频轨按照一定的格式放到一个文件中,也就是说仅仅是一个外壳,或者把它当成一个放视频轨和音频轨的文件夹也可以。

同样,封装格式一样不影响视频画质。它只负责把内部的视频轨和音频轨集成在一起,只起到一个文件夹(或者压缩包)的作用,并没有对视频轨和音频轨造成影响。

几种常见的封装格

image-20210607112412856

视频编码格式

所谓视频编码方式就是指能够对数字视频进行压缩或者解压缩(视频解码)的程序或者设备。也可以指通过过特定的压缩技术,将某个视频格式转换成另一种视频格式。

常见的编码格式

1,MPEG系列(由ISO[国际标准组织机构]下属的MPEG[运动图象专家组]开发 )视频编码方面主要有:

  1. MPEG-1第二部分(MPEG-1第二部分主要使用在VCD上,有些在线视频也使用这种格式。该编解码器的质量大致上和原有的VHS录像带相当。)2) MPEG-2第二部分(MPEG-2第二部分等同于H.262,使用在DVD、SVCD和大多数数字视频广播系统和有线分布系统(cable distribution systems)中。)

  2. MPEG-4第二部分(MPEG-4第二部分标准可以使用在网络传输、广播和媒体存储上。比起MPEG-2和第一版的H.263,它的压缩性能有所提高。)4) MPEG-4第十部分(MPEG-4第十部分技术上和ITU-T H.264是相同的标准,有时候也被叫做“AVC”)最后这两个编码组织合作,诞生了H.264/AVC标准。ITU-T给这个标准命名为H.264,而ISO/IEC称它为MPEG-4 高级视频编码(Advanced Video Coding,AVC)。

2,H.26X系列 (由ITU[国际电传视讯联盟]主导)包括H.261、H.262、H.263、H.264、H.265。

  1. H.261:主要在老的视频会议和视频电话产品中使用。

  2. H.263:主要用在视频会议、视频电话和网络视频上。

  3. H.264:H.264/MPEG-4第十部分,或称AVC(Advanced Video Coding,高级视频编码),是一种视频压缩标准,一种被广泛使用的高精度视频的录制、压缩和发布格式。

  4. H.265:高效率视频编码(High Efficiency Video Coding,简称HEVC)是一种视频压缩标准,H.264/MPEG-4 AVC的继任者。HEVC被认为不仅提升图像质量,同时也能达到H.264/MPEG-4 AVC两倍之压缩率(等同于同样画面质量下比特率减少了50%),可支持4K分辨率甚至到超高画质电视,最高分辨率可达到8192×4320(8K分辨率),这是目前发展的趋势。

其他系列:AMV · AVS · Bink · CineForm · Cinepak · Dirac · DV · Indeo · Video · Pixlet · RealVideo · RTVideo · SheerVideo · Smacker · Sorenson Video · Theora · VC-1 · VP3 · VP6 · VP7 · VP8 · VP9 · WMV。因为以上编码方式不常用,不再介绍。

视频为什么要进行编码?

视频是连续的图像序列,由连续的帧构成,一帧即为一幅图像。
由于人眼的视觉暂留效应,当帧序列以一定的速率播放时,我们看到的就是动作连续的视频。
这么多连续的图像数据如果不经过编码的数据量太大了。

看一组数据

1)一部全高清1080P 2小时的大片,原始数据量大约为4171G

2)假设图像分辨率为4CIF(704*576),帧频为25f/s.如果不进行压缩,大概需要多大的带宽呢?

如果原始图像为4:2:0的YUV格式数据(这个格式已经为原始数据的最小),

每幅画面的大小为:7045761.5*8 bit = 4.64M,也就是说每一帧为4.64M。

如果想看流畅的视频画面,大概每秒需要传输25帧,也即需要4.64*25M = 116M的带宽。

CIF(352*288)格式也需要116/4=29M 的带宽。也就是说如果不压缩,20M的接入带宽,

连QQ聊天都做不了。

以上的计算,只是想说明一个问题,原始视频的数据量相当大,不可能直接进行实时网络传输,甚至连存储的代价都相当大。

这就需要做视频压缩,也就是说去除掉原始数据中的一些冗余,然后再进行传输或者存储,来减少对带宽和存储空间的需求。

大家现在可以在2-4M的带宽上享受高清实时视频服务,可以在一张4G的蓝光DVD里面存储高清视频,这是因为这些传输或者存在的视频信号已经经过了压缩。

数据的压缩

数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。

数据压缩能够实现是因为多数现实世界的数据都有统计冗余。例如,字母“e”在英语中比字母“z”更加常用,字母“q”后面是“z”的可能性非常小。无损压缩算法通常利用了统计冗余,这样就能更加简练地、但仍然是完整地表示发送方的数据。

一些机制是可逆的,这样就可以恢复原始的数据,这种机制称为无损数据压缩;另外一些机制为了实现更高的压缩率允许一定程度的数据损失,这种机制称为有损数据压缩

视频的压缩

视频图像数据有极强的相关性,也就是说有大量的冗余信息。其中冗余信息可分为空域冗余信息时域冗余信息

压缩技术就是将数据中的冗余信息去掉(去除数据之间的相关性),压缩技术包含帧内图像数据压缩技术、帧间图像数据压缩技术和熵编码压缩技术。

去时域压缩

使用帧间编码技术可去除时域冗余信息,它包括以下三部分:

•- 运动补偿

​ 运动补偿是通过先前的局部图像来预测、补偿当前的局部图像,它是减少帧序列冗余信息的有效方法。

•- 运动表示

​ 不同区域的图像需要使用不同的运动矢量来描述运动信息。运动矢量通过熵编码进行压缩。

•-运动估计

​ 运动估计是从视频序列中抽取运动信息的一整套技术。

•注:通用的压缩标准都使用基于块的运动估计和运动补偿。

去空域压缩

主要使用帧内编码技术和熵编码技术:

•-变换编码

​ 帧内图像和预测差分信号都有很高的空域冗余信息。变换编码将空域信号变换到另一正交矢量空间,使其相关性下降,数据冗余度减小。

•- 量化编码

​ 经过变换编码后,产生一批变换系数,对这些系数进行量化,使编码器的输出达到一定的位率。这一过程导致精度的降低。

•-熵编码

​ 熵编码是无损编码。它对变换、量化后得到的系数和运动信息,进行进一步的压缩。

image-20210607113147211

1
2
3
空域冗余

单帧画面内有很多像素点是一样的,如果存储时一个点一个点的存储,这将带来很大的存储空间的浪费。

image-20210607113251252

image-20210607113314716

1
2
3
帧与帧之间的冗余成为时域冗余

帧1与帧2有很大一部分是一样的,画面内只有部分物体发生了位移或动作变化。随属于不同的画面帧,但存储时如果能共用相同的画面元素,能节省很大一部分存储空间。
视觉冗余

视觉冗余:是指人眼不能感知或不敏感的那部分图像信息。

信息熵冗余 == 熵编码-哈夫曼算法

信息熵冗余:也称编码冗余,人们用于表达某一信息所需要的比特数总比理论上表示该信息所需要的最少比特
数要大,它们之间的差距就是信息熵冗余,或称编码冗余。

知识冗余

人类(头 身体 腿),汽车,房子 不需要记录

知识冗余:是指在有些图像中还包含与某些验证知识有关的信息。

视音频完整的录制编码流程

encode_decode_info

编码的目的,就是为了压缩。各种视频编码方式,都是为了让视频变得体积更小,有利于存储和传输。编码的
核心思想就是去除冗余信息。

图像组(GOP)压缩

•GOP(Group of Picture)

在视频编码序列中,GOP就称为一个图像组。

•GOP中的编码帧

在视频中,每帧代表一幅静止的图像,而压缩是要采取各种压缩算法减少数据的容量。

在视频编码序列中,主要有三种编码帧:I帧、P帧、B帧

I****帧即Intra-coded picture(帧内编码图像帧),也称关键帧不参考其他图像帧,只利用本帧的信息进行编码,是一幅完整的画面。

P****帧即Predictive-coded Picture(预测编码图像帧),利用之前的I帧或P帧,采用运动预测的方式进行帧间预测编码,表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)。

B****帧即Bidirectionally predicted picture(双向预测编码图像帧),提供最高的压缩比,它既需要之前的图像帧(I帧或P帧),也需要后来的图像帧(P帧),采用运动预测的方式进行帧间双向预测编码,换言之,要解码B帧,不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高

I帧
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
I帧特点: (关键帧)
1.它是一个全帧压缩编码帧。它将全帧图像信息进行JPEG压缩编码及传输;
2.解码时仅用I帧的数据就可重构完整图像;
3.I帧描述了图像背景和运动主体的详情;
4.I帧不需要参考其他画面而生成;
5.I帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量);
6.I帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
7.I帧不需要考虑运动矢量;
8.I帧所占数据的信息量比较大。

I帧编码流程:
1.进行帧内预测,决定所采用的帧内预测模式。
2.像素值减去预测值,得到残差。
3.对残差进行变换和量化。
4.变长编码和算术编码。
5.重构图像并滤波,得到的图像作为其它帧的参考帧。

P帧
1
2
3
4
5
6
7
8
9
10
P帧特点

1.P帧是I帧后面相隔1-2帧的编码帧。
2.P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)。
3.解码时必须将I帧中的预测值与预测误差求和后才能重构完整的P帧图像。
4.P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧。
5.P帧可以是其后面P帧的参考帧,也可以是其前后的B帧的参考帧。
6.由于P帧是参考帧,它可能造成解码错误的扩散。
7.由于是差值传送,P帧的压缩比较高。

B帧
1
2
3
4
5
6
7
8
B帧特点

1.B帧是由前面的I或P帧和后面的P帧来进行预测的;
2.B帧传送的是它与前面的I或P帧和后面的P帧之间的预测误差及运动矢量;
3.B帧是双向预测编码帧;
4.B帧压缩比最高,因为它只反映2参考帧间运动主体的变化情况,预测比较准确;
5.B帧不是参考帧,不会造成解码错误的扩散。

GOP的值

•GOP的值指的就是两个I帧之间的距离(两个I帧之间的图像帧数)。

在这个组内只有I帧是一幅完整的画面帧,而P帧和B帧都属于预测编码帧,一个I帧所占用的字节数大于一个P帧,一个P帧所占用的字节数大于一个B帧(如下图所示)。

image-20210607114220152

•两个P帧之间的距离叫一个参考周期(Reference)。

I、B、P示意图

image-20210606220037253

•根据I、P、B帧的定义,I帧属于帧内编码,自己完成就行了。而P帧需要参考前面的帧,B帧前后帧都可以作为参考帧。

•P 帧和 B 帧编码的基本流程为:

(1)进行运动估计,计算采用帧间编码模式的率失真函数(节)值。P 帧 只参考前面的帧,B 帧可参考后面的帧。

(2)进行帧内预测,选取率失真函数值最小的帧内模式与帧间模式比较,确定采用哪种编码模式。

(3)计算实际值和预测值的差值。

(4)对残差进行变换和量化。

(5)若编码,如果是帧间编码模式,编码运动矢量。

注:I、B、P各帧是根据压缩算法的需要,是人为定义的,它们都是实实在在的物理帧,至于图像中的哪一帧是I帧,是随机的,一但确定了I帧,以后的各帧就严格按规定顺序排列。

image-20210607114550043

GOP的影响

•在码率不变的前提下,GOP值越大,P、B帧的数量会越多,平均每个I、P、B帧所占用的字节数就越多,也就更容易获取较好的图像质量;Reference越大,B帧的数量越多,同理也更容易获得较好的图像质量。

•需要说明的是,通过提高GOP值来提高图像质量是有限度的,在遇到场景切换的情况时,H.264编码器会自动强制插入一个I帧,此时实际的GOP值被缩短了。另一方面,在一个GOP中,P、B帧是由I帧预测得到的,当I帧的图像质量比较差时,会影响到一个GOP中后续P、B帧的图像质量,直到下一个GOP开始才有可能得以恢复,所以GOP值也不宜设置过大。

•同时,由于P、B帧的复杂度大于I帧,所以过多的P、B帧会影响编码效率,使编码效率降低。另外,过长的GOP还会影响Seek操作的响应速度,由于P、B帧是由前面的I或P帧预测得到的,所以Seek操作需要直接定位,解码某一个P或B帧时,需要先解码得到本GOP内的I帧及之前的N个预测帧才可以,GOP值越长,需要解码的预测帧就越多,seek响应的时间也越长。

编码带来的优点和问题

•优点

​ 1.视频码率大幅度下降。

​ 2.码率降低的同时清晰度依然很好。

​ 3.同等清晰度下视频的传输有效的节约带宽。

​ 3.码率的降低将直接带来广泛的应用,如实时高清视频直播。2K、4K超清视频。

•问题

1.编码带来的直接问题就是解码。而高压缩率下的编码带来的就是对硬件解码性能的挑战,可能引起硬件负载一直处于高位运行状态。手持设备最直接的感官就是发热。

2.播放器所面临的问题就是对众多不同编码格式的视频进行解码。

最常用的编码标准H.264
1
2
H.264 == MPEG-4 - AVC
HEVC == H.265 [H.264基础上 加入了更多的算法 == 压缩的更小]

image-20210606220153237

H.264分层结构(VCL与NAL)

VCL

1
VCL(Video Coding Layer,视频编码层):负责高效的视频内容表示, VCL数据即编码处理的输出,它表示被压缩编码后的视频数据序列。

NAL

1
2
NAL(Network Abstraction Layer,网络提取层):负责以网络所要求的恰当的方式对数据进行打包和 传送,
是传输层。不管在本地播放还是网络播放,都要通过这一层来传输。

VCL就是被压缩编码后原始数据,在VCL数据封装到NAL单元中之后,才可以用于传输或存储。

image-20210606220350442

NAL(片(宏块))

一帧图片经过 H.264 编码器之后,NAL单元就是装载着这些片(被编码为一个或多个片 slice), 每片包 含整数个宏块(至少一个宏块,最多包含整个图像宏块)。

image-20210606220447005

1
2
3
4
5
6
一般H.264编码器的默认输出为:起始码+NALU(Nal单元)。起始码为:0x00000001或者0x000001。 一个NALU(PPS, I帧,B帧,P帧)
为什么需求起始码,0x00000001或者0x000001 ? 答:因为每一个NALU都需要分隔,要分隔帧操作,就相对于写文章断句一样
为什么 0x00000001或者0x000001。 两种起始码 ?
答:0x00000001 起始码代表:一个NALU里面有很多片。
0x000001 起始码代表: 一个NALU里面一个片可以搞定。 反正你必须明白,遇到0x00000001或者0x000001,就是NALU的起始码来了
每个NALU 包含(起始码 与 1个字节的Nal Header 与 若干整数字节的负荷数据EBSP构成)

NAL类型查找表

image-20210606220547391

PTS与DTS
1
2
DTS表示解码时间戳,在什么时候解码这一帧的数据 ; PTS表示显示时间戳 ,在什么时候显示这一帧。 在没有B帧的情况下,DTS和PTS的输出顺序是一样的。
因为B帧打乱了解码和显示的顺序(要解码B帧需要先解码后面的P帧),所以一旦存在B帧,PTS和DTS就会不 同。

image-20210606220700402

I帧 p b p b p b b p I帧 == GOP

I帧之前分为一组