H.264编码原理
(1)图像冗余信息:空间冗余、时间冗余
(2)视频编码关键点:压缩比、算法复杂度、还原度
(3)H.264的2大组成部分:视频编码层VCL和网络抽象层面NAL Network Abstract Layer,
H.264编码相关的一些概念
(1)宏块 MB macroblock
(2)片 slice
(3)帧 frame
(4)I帧、B帧、P帧
- I帧:起始帧,不参考其它帧
- B帧:参考前后帧
- P帧:参考前帧
(5)帧率 fps
(6)像素->宏块->片->帧->序列->码流
【戳我获取】音视频入门到精通学习知识
H264切片介绍
我们了解了什么是宏快,宏快作为压缩视频的最小的一部分,需要被组织,然后在网络之间做相互传输。
H264更深层次 —》宏块 太浅了
如果单纯的用宏快来发送数据是杂乱无章的,就好像在没有集装箱 出现之前,货物总是随意被堆放到船上。
上货(编码),下货是非常痛苦的。 当集装箱出现之后,一切都发生了改变,传输效率大大增高。
集装箱可以理解成H264编码标准,他制定了相互传输的格式,将宏快 有组织,有结构,有顺序的形成一系列的码流。这种码流既可 通过 InputStream 网络流的数据进行传输,也可以封装成一个文件进行保存
H264: H264/AVC是广泛采用的一种编码方式 。 主要作用是为了传输
H264码流组成
组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是
H264视频序列,图像,片组,片,NALU,宏块 ,像素。
image.png类似 地球 国家 城市 镇 村落
H264编码分层
NAL层:(Network Abstraction Layer,视频数据网络抽象层): 它的作用是H264只要在网络上传输,在传输的过程每个包以太网是1500字节,而H264的帧往往会大于1500字节,所以要进行拆包,将一个帧拆成多个包进行传输,所有的拆包或者组包都是通过NAL层去处理的。
VCL层:(Video Coding Layer,视频数据编码层): 对视频原始数据进行压缩
H264的传输
H264是一种码流 类似与一种不见头,也不见尾的一条河流。如何从和流中取到自己想要的数据呢,
在H264的标砖中有这样的一个封装格式叫做"Annex-B"的字节流格式。 它是H264编码的主要字节流格式。
几乎市面上的编码器是以这种格式进行输出的。起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符。
两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit
image.png编码结构
image.png切片头:包含了一组片的信息,比如片的数量,顺序等等
H264码流分层结构图
image.png宏块(macroblock)
H264中,以16x16的宏块为编码最小单元,一个宏块可以被分成多个4x4或8x8的块
同一个宏块内,像素的相似程度会比较高,若16x16的宏块中,像素相差较大,那么就需要继续细分
image.pngH265的宏块是从8x8到64x64可变
当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。
宏块种类
- I宏块利用从当前片中,已解码的像素作为参考进行帧内预测,注意是当前片内,不能取其他片中已解码的像素作为参考进行帧内预测。
- P宏块利用前面已编码的图像作为参考图像,进行帧间预测。
- B宏块则利用双向的参考图像(当前的和未来的已编码的图像帧)进行帧间预测。
不合理的分块会出现块效应,即块与块之间色差明显
海思在3559之后有deblock的接口可以应对块效应,3519上用的很多
image.png
H264帧基础知识
一组图像 GOP
image.png- 所谓GOP就是1组图像Group of Picture,在这一组图像中有且只有1个I帧,多个P帧或B帧,两个I帧之间的帧数,就是一个GOP。
- GOP通常设置为编码器每秒输出的帧数,即每秒帧率,通常为25或30,固然也可设置为其余值。
- 在一个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响应的时间也越长。
IDR帧与I帧
在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帧。缓存
- I帧:帧内编码帧 ,I帧表示关键帧,你能够理解为这一帧画面的完整保留;解码时只须要本帧数据就能够完成(由于包含完整画面)
- 它是一个帧内压缩编码帧,压缩比约为7。它将全帧图像信息进行JPEG压缩编码及传输;
- 解码时仅用I帧的数据就可重构完整图像;
- I帧描述了图像背景和运动主体的详情;
- I帧不须要参考其余画面而生成;
- I帧是P帧和B帧的参考帧(其质量直接影响到同组中之后各帧的质量);
- 帧是帧组GOP的基础帧(第一帧),在一组中只有一个I帧;
- I帧不须要考虑运动矢量;
- I帧所占数据的信息量比较大。
疑问:按照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帧没有完整画面数据,只有与前一帧的画面差别的数据。P帧的压缩率20code
- P帧是I帧后面相隔1~2帧的编码帧;
- P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测偏差);
- 解码时必须将I帧中的预测值与预测偏差求和后才能重构完整的P帧图像;
- P帧属于前向预测的帧间编码。它只参考前面最靠近它的I帧或P帧;
- P帧能够是其后面P帧的参考帧,也能够是其先后的B帧的参考帧;
- 因为P帧是参考帧,它可能形成解码错误的扩散;
- 因为是差值传送,P帧的压缩比较高。
B帧
B帧:双向预测内插编码帧。B帧是双向差异帧,也就是B帧记录的是本帧与先后帧的差异,要解码B帧,不只要取得以前的缓存画面,还要解码以后的画面,经过先后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,约为50,可是解码时CPU会比较累。orm
- B帧是由前面的I或P帧和后面的P帧来进行预测的
- B帧传送的是它与前面的I或P帧和后面的P帧之间的预测偏差及运动矢量
- B帧是双向预测编码帧
- B帧压缩比最高,由于它只反映丙参考帧间运动主体的变化状况,预测比较准确;
- B帧不是参考帧,不会形成解码错误的扩散。
H264 profile level
-
BP-Baseline Profile:基本画质。支持I/P 帧,只支持无交错(Progressive)和CAVLC;
-
EP-Extended profile:进阶画质。支持I/P/B/SP/SI 帧,只支持无交错(Progressive)和CAVLC;
-
MP-Main profile:主流画质。提供I/P/B 帧,支持无交错(Progressive)和交错(Interlaced),也支持CAVLC 和CABAC 的支持;
-
HP-High profile:高级画质。在main Profile 的基础上增长了8x8内部预测、自定义量化、无损视频编码和更多的YUV 格式。
通常能够输出H264帧的USB摄像头,使用的是BP-Baseline Profile,只有I帧与P帧。视频
frame与slice、macroblock的关系
frame和宏块间的关系
- I帧只包含I宏块
- P帧包含I宏块和P宏块
- B帧包含I宏块、P宏块、B宏块
而slice呢,也是对宏块的划分
slice和宏块的关系
- I slice只包含I宏块
- P slice包含P宏块和/或I宏块
- B sliceB宏块和/或I宏块。
I帧、B帧、P帧和对应类型的slice之间的关系
- 当帧内slice全部为I像片时,则此帧为I帧
- 当全部为P slice或和I slice的组合时,则为P帧
- 当为B slice或和I、P slice的组合时,则为B帧。
【戳我获取】音视频入门到精通学习知识
05Android音视频开发初级入门篇.png 06Android音视频开发进阶篇.png07Android音视频开发高级篇.png
文末
本文简单叙述了;音视频中的H264编码中的,宏块、帧、片。音视频还有更深入的学习,知识范围很广,需要一套很详细的学习资料与路线。我推荐上面的一套入门到精通资料辅佐。
网友评论