音视频-视频格式、H.264

2020-10-13  本文已影响0人  Maji1

常见的视频文件格式:

.mov.avi.mpg.vob.mkv.rm.rmvb ...

视频封装格式

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

下面看下 视频封装格式 对应的 视频文件格式

我们常用的视频封装格式有:AVI、MOV、WMV、mkv、flv、mp4

视频编解码

编码包括软编码和硬编码:

常见视频编码方式:

H264最大的优势:具有很高的数据压缩比率,在同等图像质量下H264的压缩比是MPEG-2的2倍以上,MPEG-4的1.5~2倍。


一种 视频封装格式 可以支持多种 视频编解码方式,比如:
QuickTime File Format(.MOV)支持几乎所有的 视频编解码方式
MPEG(.MP4) 也支持相当广的 视频编解码方式

当我们看到一个视频文件名为 test.mov 时,我们可以知道它的 视频视频文件格式.mov,也可以知道它的视频封装格式是 QuickTime File Format。但是无法知道它的 视频编解码方式

比较专业的说法可能是以 A/B 这种方式,A 是 视频编解码方式,B 是 视频封装格式
比如:一个 H.264/MOV 的视频文件,它的封装方式就是 QuickTime File Format,编码方式是 H.264

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


下面我们来简单介绍一下H.264

H.264

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

H.264视频压缩后会成为一个序列帧,帧里包含若干图像,图像分为很多片,每个片可以分为很多宏块,每个宏块由许多子块组成。这就是H264结构图。

H.264结构中,一个视频图像编码后的数据叫做一帧,一帧由一个片(slice)或多个片组成,一个片由一系列的宏块(macroblock)组成,一个宏块由16x16的YUV数据组成。宏块(macroblock)作为H.264编码的基本单位。

H.264宏块划分

一个编码图像通常划分成若干宏块组成,一个宏块由一个16×16亮度像素和附加的一个8×8 Cb和一个8×8 Cr彩色像素块组成。

每个切片都包括 “切片头 + 切片数据” 。那每个切片数据包括了很多宏块。每个宏块包括了宏块的类型,宏块的预测,残差数据。

H.264 片(Slice

每个图象中,若干宏块被排列成片的形式。片分为I片、B片、P片和其他一些片。

I片只包含I宏块,P片可包含P和I宏块,而B片可包含B和I宏块。

片的目的是为了限制误码的扩散和传输,使编码 片相互间是独立 的。

H.264 NAL Unit

NAL Unit:包含 NAL Unit header(占用8位,一个字节) 和 NAL Unit payload。

注意:H264编码分为了2层:
NAL层:(Network Abstraction Layer 视频数据网络抽象层)
H.264在网络上传输过程中每个包以太网是1500字节,而H.264的帧往往会大于1500字节,所以就要进行拆包,将一个帧拆成多个包进行传输。所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer 视频数据编码层) 对视频原始数据进行压缩.

NAL 单元是由一个NALU头部+一个切片。切片又可以细分成“切片头 + 切片数据”。我们之间了解过一个H.254的帧是由多个切片构成的,因为一帧数据一次有可能传不完。

H.264包含三种帧:

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

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

理解:压缩率高,存储的数据量小。B帧越多压缩率就越高。
实时互动的直播:B帧需要参考后面的帧后才能解码,这样在网络传输中就需要等待后面的帧传输过来。如果网络状态不好解码就会变慢。所以实时互动的直播一般不使用B帧。
泛娱乐的直播中:可以接受一定度的延时,需要比较高的压缩比就可以使用B帧。

场和帧:视频的一场或一帧可用来产生一个编码图像。在电视中,为减少大面积闪烁现象,把一帧分成两个隔行的场。

GOF(Group of Frame)一组帧:

GOF:一个 I帧 到下一个 I帧,这一组的数据,包括B帧、P帧。两个I帧之间是一个图像序列。

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

SPS/PPS

在一组帧之前我们首先收到的是SPS/PPS 数据。如果没有这组参数的话,我们是无法解码的。实际上就是存储GOP的参数。
SPS/PPS数据,我们将其归类到I帧。这2组数据是必需的。

视频花屏/卡顿原因

如果 GOF 分组中的 P帧或者I帧 丢失就会造成解码端的图像发生错误。 为了避免花屏问题的发生,一般如果发现 P帧或者I帧 丢失,就不显示本 GOF 内的所有帧,到下一个I帧来后重新刷新图像。 这时因为没有刷新屏幕,丢包的这一组帧全部扔掉了,图像就会卡在哪里不动。这就是卡顿的原因。

组内宏块查找

参考H264编码原理

帧内预测

参考H264编码原理
帧内压缩是针对于I帧的。因为它解决的是空间的数据冗余,而帧间压缩是解决的时间数据冗余。

H.264码流分层结构图:

参考文章
H264基本概念
H264编码原理
H264码流结构

上一篇 下一篇

猜你喜欢

热点阅读