【学习笔记】H264视频编码
【学习笔记】H264视频编码
一、冗余
参考文献:视频编码(1):可能是最详尽的 H.264 编码相关概念介绍丨音视频基础 - 知乎
要对视频进行编码,则主要是研究视频数据中的冗余信息,并对其进行压缩。视频信息主要包括这几个方面的冗余:
1、 空间冗余:在同一张帧之中,相邻的像素之间通常有很强的关连性,这样的关连性即为空间上的冗余信息。
2、 时间冗余:在视频信息中,相邻的帧与帧之间通常有很强的关连性,这样的关连性即为时间上的冗余信息。
3、 编码冗余:视频中不同数据出现的概率不同,欲编码的符号的几率分布是不均匀的。
4、 视觉冗余:人的视觉系统对某些细节不敏感。视觉上的冗余信息是指在人在观看视频时,人眼无法察觉的信息。
二、H264视频编码详解
H.264 采用的核心算法是『帧内压缩』和『帧间压缩』,帧内压缩是生成 I 帧的算法,帧间压缩是生成 B 帧和 P 帧的算法。
帧内压缩也称为空间压缩。当压缩一帧图像时,仅考虑本帧的数据而不考虑相邻帧之间的冗余信息,这实际上与静态图像压缩类似。帧内一般采用有损压缩算法,由于帧内压缩是编码一个完整的图像,所以可以独立的解码、显示。帧内压缩一般达不到很高的压缩率,跟编码 JPEG 差不多。
帧间压缩的原理是:相邻几帧的数据有很大的相关性,或者说前后两帧信息变化很小的特点。也即连续的视频其相邻帧之间具有冗余信息,根据这一特性,压缩相邻帧之间的冗余量就可以进一步提高压缩量,减小压缩比。帧间压缩也称为时间压缩,它通过比较时间轴上不同帧之间的数据进行压缩。帧间压缩一般是无损的。帧差值算法是一种典型的时间压缩法,它通过比较本帧与相邻帧之间的差异,仅记录本帧与其相邻帧的差值,这样可以大大减少数据量。
编码压缩的步骤大致如下:
● 分组,也就是将一系列变换不大的图像归为一个组,也就是一个序列,也就是 GOP;
● 定义帧,将每组的图像帧归分为 I 帧、P 帧和 B 帧三种类型;
● 预测帧,以 I 帧做为基础帧,以 I 帧预测 P 帧,再由 I 帧和 P 帧预测 B 帧;
● 数据传输,最后将 I 帧数据与预测的差值信息进行存储和传输。
三、GOP图像组
GOP(Group Of Pictures)是图像组的概念,它指的是视频编码序列中两个 I 帧之间的距离。通常意义上的 GOP 由 I 帧开始,到下一个 I 帧之前的帧结束。严格意义上讲,这个 I 帧是一个 IDR 帧。
H.264 使用的是封闭 GOP(Closed GOP),即在一个 GOP 中所有帧的解码不依赖该 GOP 外的其他帧,除了第一帧必须是 I 帧,其他帧可以是 P 帧或 B 帧。
● DTS(Decoding Time Stamp):即解码时间戳,这个时间戳的意义在于告诉播放器该在什么时候解码这一帧的数据。
● PTS(Presentation Time Stamp):即显示时间戳,这个时间戳用来告诉播放器该在什么时候显示这一帧的数据。
上图中是一个 GOP 为 15 帧的例子,如果视频的帧率是 15 fps,那么这个 GOP 就是 1s 时长。
关键帧的间隔调节会影响 GOP 的长度,进而影响到读取 GOP 的速度,为防止运动变化,一个 GOP 组内帧数不宜取多。如果关键帧的间隔设置过大的话(GOP 长度过大),在必须用到关键帧的场合就可能被迫使用 B/P 帧来代替,这就会降低画面质量。
四、IDR 帧
IDR 帧全称叫做 Instantaneous Decoder Refresh,是 I 帧的一种。IDR 帧的作用是立刻刷新,重新算一个新的序列开始编码,使错误不致传播。**I 帧有被跨帧参考的可能,但 IDR 帧不会。
比如:
IDR1 P2 B3 B4 P5 B6 B7 I8 B9 B10 P11 B12 B13 P14 B15 B16
这里的 B9 可以跨过 I8 去参考 P5。
IDR1 P2 B3 B4 P5 B6 B7 IDR8 B9 B10 P11 B12 B13 P14 B15 B16
这里的 B9 就不可以参考 IDR8 前面的帧。
H.264 引入 IDR 帧是为了解码的重同步,当解码器解码到 IDR 帧时,立即将参考帧队列清空,将已解码的数据全部输出或抛弃,重新查找参数集,开始一个新的序列。这样,如果前一个序列出现错误,在这里可以获得重新同步的机会,不会将错误传导下去。IDR 帧之后的帧永远不会使用 IDR 帧之前的帧来解码。
所以总结下来,IDR 帧有如下特性:
● IDR 帧一定是 I 帧,严格来说 I 帧不一定是 IDR 帧(但一般 I 帧就是 IDR 帧);
● 对于 IDR 帧来说,在 IDR 帧之后的所有帧都不能引用任何 IDR 帧之前的帧的内容。与此相反,对于普通的 I 帧来说,位于其之后的 B 和 P 帧可以引用位于普通 I 帧之前的 I 帧(普通 I 帧有被跨帧参考的可能);
● 播放器永远可以从一个 IDR 帧播放,因为在它之后没有任何帧引用之前的帧。因此,视频开头的 I 帧一定是 IDR 帧;一个封闭类 GOP 的开头的 I 帧也一定是 IDR 帧。
五、总结
个人感觉只需要了解编码压缩的一些基本术语,比如冗余、帧内压缩、空间压缩、帧间压缩、时间压缩、GOP图像组、时间戳、I帧、P帧、B帧以及IDR帧等的作用,在实际开发中基本知识还是很重要的,不然你都不知道你做的东西是什么,怎么去做呢?
帧内压缩、空间压缩、帧间压缩、时间压缩、GOP图像组、时间戳、I帧、P帧、B帧以及IDR帧等的作用,在实际开发中基本知识还是很重要的,不然你都不知道你做的东西是什么,怎么去做呢?
至少别人提到这个东西,你要知道这是什么,这是最基本的。