美文网首页Android技术知识Android进阶之路
音视频入门——H.264编码(宏块+片+帧)浅析

音视频入门——H.264编码(宏块+片+帧)浅析

作者: 码农的地中海 | 来源:发表于2022-07-19 22:05 被阅读0次

    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的宏块中,像素相差较大,那么就需要继续细分

    H265的宏块是从8x8到64x64可变

    image.png

    当然,像素块越小,编码的复杂度也会随之增加,编码效率自然就会降低。但是这样是值得的,因为图像的压缩效率有了显著提高,也就是编码后得到的相同质量的图像,H.264的压缩比更大,占用的空间及带宽更小。

    宏块种类

    1. I宏块利用从当前片中,已解码的像素作为参考进行帧内预测,注意是当前片内,不能取其他片中已解码的像素作为参考进行帧内预测。
    2. P宏块利用前面已编码的图像作为参考图像,进行帧间预测。
    3. 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音视频开发进阶篇.png
    07Android音视频开发高级篇.png

    文末

    本文简单叙述了;音视频中的H264编码中的,宏块、帧、片。音视频还有更深入的学习,知识范围很广,需要一套很详细的学习资料与路线。我推荐上面的一套入门到精通资料辅佐。

    【戳我获取】音视频入门到精通学习知识

    相关文章

      网友评论

        本文标题:音视频入门——H.264编码(宏块+片+帧)浅析

        本文链接:https://www.haomeiwen.com/subject/kzbsirtx.html