音视频入门——H.264编码(宏块+片+帧)浅析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了音视频入门——H.264编码(宏块+片+帧)浅析相关的知识,希望对你有一定的参考价值。
参考技术A (1)图像冗余信息:空间冗余、时间冗余(2)视频编码关键点:压缩比、算法复杂度、还原度
(3)H.264的2大组成部分:视频编码层VCL和网络抽象层面NAL Network Abstract Layer,
(1)宏块 MB macroblock
(2)片 slice
(3)帧 frame
(4)I帧、B帧、P帧
(5)帧率 fps
(6)像素->宏块->片->帧->序列->码流
我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。
H264更深层次 —》宏块 太浅了
如果单纯的用宏快来发送数据是杂乱无章的,就好像在没有集装箱 出现之前,货物总是随意被堆放到船上。
上货(编码),下货是非常痛苦的。 当集装箱出现之后,一切都发生了改变,传输效率大大增高。
集装箱可以理解成H264编码标准,他制定了相互传输的格式,将宏快 有组织,有结构,有顺序的形成一系列的码流。这种码流既可 通过 InputStream 网络流的数据进行传输,也可以封装成一个文件进行保存
H264: H264/AVC是广泛采用的一种编码方式 。 主要作用是为了传输
组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是
NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩
H264是一种码流 类似与一种不见头,也不见尾的一条河流。如何从和流中取到自己想要的数据呢,
在H264的标砖中有这样的一个封装格式叫做"Annex-B"的字节流格式。 它是H264编码的主要字节流格式。
几乎市面上的编码器是以这种格式进行输出的。起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符。
两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit
切片头:包含了一组片的信息,比如片的数量,顺序等等
H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块
同一个宏块内,像素的相似程度会比较高,若16x16的宏块中,像素相差较大,那么就需要继续细分
当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。
不合理的分块会出现块效应,即块与块之间色差明显
海思在3559之后有deblock的接口可以应对块效应,3519上用的很多
在I帧中,全部宏块都采用帧内预测的方式,所以解码时仅用I帧的数据就可重构完整图像,不须要参考其余画面而生成。web
H.264中规定了两种类型的I帧:普通I帧(normal Iframes)和IDR帧(InstantaneousDecoding Refresh, 即时解码刷新)。 IDR帧实质也是I帧,使用帧内预测。IDR帧的做用是当即刷新,会致使DPB(Decoded Picture Buffer参考帧列表)清空,而I帧不会。因此IDR帧承担了随机访问功能,一个新的IDR帧开始,能够从新算一个新的Gop开始编码,播放器永远能够从一个IDR帧播放,由于在它以后没有任何帧引用以前的帧。若是一个视频中没有IDR帧,这个视频是不能随机访问的。全部位于IDR帧后的B帧和P帧都不能参考IDR帧之前的帧,而普通I帧后的B帧和P帧仍然能够参考I帧以前的其余帧。IDR帧阻断了偏差的积累,而I帧并无阻断偏差的积累。算法
一个GOP序列的第一个图像叫作 IDR 图像(当即刷新图像),IDR 图像都是 I 帧图像,但I帧不必定都是IDR帧,只有GOP序列的第1个I帧是IDR帧。缓存
疑问:按照GOP、IDR帧、I帧的解释,若是一个GOP出现除去第一个IDR帧以外的I帧,是不存在的,那这样的话,就不存在非IDR的I帧了,但是为何还要说明非IDR的I帧呢。svg
解答:H264编码存在多种编码方式CBR、VBR、CVBR、ABR等等,VBR编码模式下图像内容变化差别很大时,会动态调整I帧的数量,所以GOP的概念须要修正:两个IDR帧之间的间隔为一组GOP,一组GOP中能够出现非IDR的I帧。编码
P帧:前向预测编码帧。P帧表示的是这一帧跟以前的一个关键帧(或P帧)的差异,解码时须要用以前缓存的画面叠加上本帧定义的差异,生成最终画面,P帧没有完整画面数据,只有与前一帧的画面差别的数据。P帧的压缩率20code
B帧:双向预测内插编码帧。B帧是双向差异帧,也就是B帧记录的是本帧与先后帧的差异,要解码B帧,不只要取得以前的缓存画面,还要解码以后的画面,经过先后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,可是解码时CPU会比较累。orm
通常能够输出H264帧的USB摄像头,使用的是BP-Baseline Profile,只有I帧与P帧。视频
而slice呢,也是对宏块的划分
本文简单叙述了;音视频中的H264编码中的,宏块、帧、片。音视频还有更深入的学习,知识范围很广,需要一套很详细的学习资料与路线。我推荐上面的一套入门到精通资料辅佐。
音视频开发之旅(58) -H.264 帧内预测
目录
- 编码流程和数据格式回顾
- 4 × 4亮度块的9中预测模式
- 16 × 16亮度块的4种预测模式
- 8 × 8 色度块的4种预测模式
- JM代码
- 资料
- 收获
一、编码流程和数据格式回顾
我们先看下下图来回顾下编码流程
一个编码图像通常划分一个或多个片,每个片又可以划分成若干宏块组成,一个宏块由一个 16×16 亮度像素、一个 8×8 Cb以及一个 8×8 Cr 彩色像素块组成,即常见的420采样格式,如下图:
我们通过H264visa码流分析工具看下H264数据的第一帧数据,可以看到它是I帧,由一个个宏块组成,在帧内采用帧内预测的方式进行编码。
也看到上面宏块的type有16x16也有4x4,这是什么意思?
再通过Elecard StreamEye 来查看发现更多信息。包括pmode、ipred Intra_4x4、 ipred chroma 都代表什么意思以及里面的值有什么什么意思呐?
在帧内预测模式中,预测块 P 是基于已编码重建块和当前块形成的。对亮度像素而言,P 块用于 4×4 子块或者 16×16 宏块的相关操作。
4×4 亮度子块有 9 种可选预测模式,独立预测每一个 4×4亮度子块,适用于带有大量细节的图像编码;
16×16 亮度块有 4 种预测模式,预测整个 16×16 亮度块,适用于平坦区域图像编码;
色度块也有 4 种预测模式,类似于 16×16 亮度块预测模式。编码器
通常选择使 P 块和编码块之间差异最小的预测模式。
下面我们来看下其预测模式
二、4 × 4亮度块的9种预测模式
4x4预测块的像素使用小写字母a-p标示,预测块左侧和上方的参考像素使用大写字母A-M标示:
4x4亮度块有9中预测模式,分别如下
其中预测模式2 的所有样本预测值都等于A-D以及I-L的平均值。
其他8中模式的8歌方向的预测示意图如下所示:
9种预测模式说明如下:
模式 说明
Mode0 (Vertical): 由上方的A、B、C、D进行垂直推算
Mode1 (Horizontal) : 由左侧的I、J、K、L进行水平推算
Mode2 (DC) : P中的所有样本预测值都等于AD及IL的平均值
Mode3 (Diagonal Down-Left): 由45度角方向的左下和右上的样本内插得出
Mode4 (Diagonal Down-Right): 以45度角往右下的方向进行推算
Mode5 (Vertical-Right) : 以垂直向下方向右偏大约26.6度角(即width/height = 1/2)的方向推行推算。
Mode6 (Horizontal-Down): 以水平向右方向下偏大约26.6度角的方向进行推算。
Mode7 (Vertical-Left): 以垂直向下方向左偏大约26.6度角的方向推行推算。
Mode8 (Horizontal-Up): 以水平向右方向上偏大约26.6度角的方向进行推算。
需要注意的是:
Mode 2的规则可以根据A-M中样本的可用情况进行修改,因为它求的是根据参考样本求的平均值,其他的模式可能在所有需求的参考样本都可用的时候才能采用。然后需要注意的是如果样本E、F、G和H是不可用的,样本D的值可以拷贝到这些位置从而标记这些样本为可用的。
对于Mode 3-8,预测样本的值是参考样本A-M的加权平均。假设选择了Mode 4,d的预测值 = round(B/4 + C/2 + D/4)。
引用自:H.264 帧内预测 - 简书
图片来自:《新一代视频压缩码标准-H.264_AVC(第二版).毕厚杰,王健编著》
三、16 × 16亮度块的4种预测模式
模式 说明
Mode0 (vertical): 由上方的样本(H)垂直推算
Mode1 (horizontal) 由左侧的样本(V)水平推算
Mode2 (DC): 上方的样本(H)和左侧的样本(V)的平均值
Mode3 (Plane): 根据上方的样本(H)和左边的样本(V)通过一个plane函数得出,在亮度平滑变化的区域工作得很好。
下面看下《新一代视频压缩码标准-H.264_AVC(第二版).毕厚杰,王健编著》中举的一个例子:
四、8 × 8 色度块的4种预测模式
色度的Cr和Cb分量的预测模式选择是一样的。
色度预测模式与16x16亮度预测模式的描述类似,除了模式的编号不一样。
DC (mode 0), horizontal (mode 1), vertical (mode 2), plane (mode 3).
看到这里我想对于文章开头我们通过码流分析工具H264visa以及Elecard StreamEye 查看宏块的一些问题应该有自己的答案了。
五、JM代码
这一小节我们结合JM源码来简单分析下帧内预测的实现
JM包括JM encoder和JM decoder, JM encoder是H.264标准的一个具体实现, JM decoder是对应的解码器.
JM encoder和 x264一样,都是H.264标准的实现, 但它严格按照H264的协议来进行实现,而x264 简化了JM的代价计算方法,去掉了一些代码,进行了估算等优化,编码速度上JM会很慢,不适用于生产环境,
查看其源码对于了解H264协议时很有帮助。
JM的源码下载地址:http://iphome.hhi.de/suehring/tml/download/old_jm/,可以选择一个版本进行下载查看
这个源码还没真正的看,先做个记录吧,根据需要进行学习。
具体可以参考雷神的文章 : 雷神-H.264官方软件JM源代码简单分析-编码器lencod
六、资料
- 图书:《新一代视频压缩码标准-H.264_AVC(第二版).毕厚杰,王健编著》- 第 6 章 H.264/AVC 编码器原理
- H.264 帧内预测
- 雷神-H.264官方软件JM源代码简单分析-编码器lencod
- JM源码下载
- [JM官方文档]
七、收获
通过本篇的学习实践
- 了解了帧内编码的方式以及在整个编码过程中起的作用
- 了解4x4亮度块的9种预测模式、16x16亮度块以及8x8色度块的预测方式
- 通过码流分析工具查看宏块信息,加深理解。
感谢你的阅读
下一篇我们学习H.264 帧间预测,欢迎关注公众号“音视频开发之旅”,一起学习成长。
欢迎交流
以上是关于音视频入门——H.264编码(宏块+片+帧)浅析的主要内容,如果未能解决你的问题,请参考以下文章
H.264/AVC视频编解码技术详解十二解析H.264码流的宏块结构(下):H.264帧内编码宏块的预测结构