美文网首页
Android 音视频01 --- H264的基本原理01

Android 音视频01 --- H264的基本原理01

作者: 沪漂意哥哥 | 来源:发表于2022-04-10 07:22 被阅读0次

    一. H264概述

    H264压缩技术主要采用了以下几种方法对视频数据进行压缩。包括:

    1.帧内预测压缩

    解决的是空域数据冗余问题。

    2.帧间预测压缩(运动估计与补偿

    解决的是时域数据冗徐问题

    3.整数离散余弦变换(DCT)

    将空间上的相关性变为频域上无关的数据然后进行量化。

    4.CABAC压缩。

    经过压缩后的帧分为:I帧,P帧和B帧:

    I帧:

    关键帧,采用帧内压缩技术。

    P帧:

    向前参考帧,在压缩时,只参考前面已经处理的帧。采用帧音压缩技术。

    B帧:

    双向参考帧,在压缩时,它即参考前而的帧,又参考它后面的帧。采用帧间压缩技术。
    除了I/P/B帧外,还有图像序列GOP。

    GOP:两个I帧之间是一个图像序列,在一个图像序列中只有一个I帧。如下图所示: 31.png

    二. H264压缩技术

    H264的基本原理其实非常简单,下我们就简单的描述一下H264压缩数据的过程。通过摄像头采集到的视频帧(按每秒 30 帧算),被送到 H264 编码器的缓冲区中。编码器先要为每一幅图片划分宏块。

    划分宏块:
    H264默认是使用 16X16 大小的区域作为一个宏块,也可以划分成 8X8 大小。 33.png

    划分好宏块后,计算宏块的象素值。以此类推,计算一幅图像中每个宏块的像素值。

    划分子块:
    H264对比较平坦的图像使用 16X16 大小的宏块。但为了更高的压缩率,还可以在 16X16 的宏块上更划分出更小的子块。子块的大小可以是 8X16、 16X8、 8X8、 4X8、 8X4、 4X4非常的灵活。 36.png 上幅图中,红框内的 16X16 宏块中大部分是蓝色背景,而三只鹰的部分图像被划在了该宏块内,为了更好的处理三只鹰的部分图像,H264就在 16X16 的宏块内又划分出了多个子块。 37.png 这样再经过帧内压缩,可以得到更高效的数据。
    宏块划分好后,就可以对H264编码器缓存中的所有图片进行分组了。
    帧分组:

    对于视频数据主要有两类数据冗余,一类是时间上的数据冗余,另一类是空间上的数据冗余。其中时间上的数据冗余是最大的。为什么说时间上的冗余是最大的呢?假设摄像头每秒抓取30帧,这30帧的数据大部分情况下都是相关联的。也有可能不止30帧的的数据,可能几十帧,上百帧的数据都是关联特别密切的。
    H264编码器会按顺序,每次取出两幅相邻的帧进行宏块比较,计算两帧的相似度。如下图:

    42.png
    在相邻几幅图像画面中,一般有差别的像素只有10%以内的点,亮度差值变化不超过2%,而色度差值的变化只有1%以内,我们认为这样的图可以分到一组。
    在这样一组帧中,经过编码后,我们只保留第一帖的完整数据,其它帧都通过参考上一帧计算出来。我们称第一帧为IDR/I帧,其它帧我们称为P/B帧,这样编码后的数据帧组我们称为GOP
    运动估计与补偿:

    在H264编码器中将帧分组后,就要计算帧组内物体的运动矢量了。
    H264编码器首先按顺序从缓冲区头部取出两帧视频数据,然后进行宏块扫描。当发现其中一幅图片中有物体时,就在另一幅图的邻近位置(搜索窗口中)进行搜索。如果此时在另一幅图中找到该物体,那么就可以计算出物体的运动矢量了。
    运动矢量计算出来后,将相同部分(也就是绿色部分)减去,就得到了补偿数据。我们最终只需要将补偿数据进行压缩保存,以后在解码时就可以恢复原图了。压缩补偿后的数据只需要记录很少的一点数据。
    我们把运动矢量与补偿称为帧间压缩技术,它解决的是视频帧在时间上的数据冗余。除了帧间压缩,帧内也要进行数据压缩,帧内数据压缩解决的是空间上的数据冗余。

    帧内预测:

    人眼对图象都有一个识别度,对低频的亮度很敏感,对高频的亮度不太敏感。所以基于一些研究,可以将一幅图像中人眼不敏感的数据去除掉。这样就提出了帧内预测技术。
    一幅图像被划分好宏块后,对每个宏块可以进行 9 种模式的预测。找出与原图最接近的一种预测模式。然后,将原始图像与帧内预测后的图像相减得残差值。再将我们之前得到的预测模式信息一起保存起来,这样我们就可以在解码时恢复原图了,经过帧内与帧间的压缩后,虽然数据有大幅减少,但还有优化的空间。

    对残差数据做DCT:

    可以将残差数据做整数离散余弦变换,去掉数据的相关性,进一步压缩数据。

    CABAC:

    上面的帧内压缩是属于有损压缩技术。也就是说图像被压缩后,无法完全复原。而CABAC属于无损压缩技术。
    无损压缩技术大家最熟悉的可能就是哈夫曼编码了,给高频的词一个短码,给低频词一个长码从而达到数据压缩的目的。MPEG-2中使用的VLC就是这种算法,我们以 A-Z 作为例子,A属于高频数据,Z属于低频数据。看看它是如何做的。
    CABAC也是给高频数据短码,给低频数据长码。同时还会根据上下文相关性进行压缩,这种方式又比VLC高效很多。

    三. H264编码

    制定了相互传输的格式,将宏快 有组织,有结构,有顺序的形成一系列的码流。这种码流既可 通过 InputStream 网络流的数据进行传输,也可以封装成一个文件进行保存,主要作用是为了传输。

    1.1H264码流组成

    组成H264码流的结构中 包含以下几部分 ,从大到小排序依次是:
    H264视频序列,图像,片组,片,NALU,宏块 ,像素。

    1.1.1 H264编码分层

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

    1.1.2 H264的传输

    起始码0x 00 00 00 01 或者 0x 00 00 01 作为分隔符
    两个 0x 00 00 00 01之间的字节数据 是表示一个NAL Unit。

    四. H264编码

    I 帧:帧内编码帧,帧表示关键帧,你可以理解为这一帧画面的完整保留;解码时只需要本帧数据就可以完成(因为包含完整画面)

    I 帧的特点:

    • a. 它是一个全帧压缩编码帧,它将全帧图像信息进行JPEG压缩编码及传输
    • b. 解码时仅用I 帧的数据就可重构完整图像
    • c. I 帧描述了图像背景和运动主体的详情
    • d. I 帧不需要参考其他画面而生成
    • e. I 帧是P帧和B帧的参考帧(其质量直接影响到同组中以后各帧的质量)
    • f. I 帧不需要考虑运动矢量
    • g. I 帧所占数据的信息量比较大
      P帧:前向预测编码帧。P帧表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)
      P帧的预测与重构:P帧是以 I 帧为参考帧,在 I 帧中找出P帧“某点”的预测值和运动矢量,取预测差值和运动矢量一起传送。在接收端根据运行矢量从 I 帧找出P帧“某点”的预测值并与差值相加以得到P帧“某点”样值,从而可得到完整的P帧。
      P帧的特点:
    • a. P帧是 I 帧后面相隔1~2帧的编码帧
    • b. P帧采用运动补偿的方法传送它与前面的I或P帧的差值及运动矢量(预测误差)
    • c. 解码时必须将帧中的预测值与预测误差求和后才能重构完整的P帧图像
    • d. P帧属于前向预测的帧间编码。它只参考前面最靠近它的 I 帧或P帧
    • e. 由于P帧是参考帧,它可能造成解码错误的扩散
    • f. 由于是差值传送,P帧的压缩比较高
      B帧
      双向预测内插编码帧。B帧是双向差别帧,也就是B帧记录的是本帧与前后帧的差别(具体比较复杂,有4种情况,但我这样说简单些),换言之,要解码B帧。不仅要取得之前的缓存画面,还要解码之后的画面,通过前后画面的与本帧数据的叠加取得最终的画面。B帧压缩率高,但是解码时CPU会比较累。
      B帧的预测与重构
      B帧以前面的 I 或P帧和后面的P帧为参考帧,“找出”B帧“某点”的预测值和两个运动矢量,并取预测差值和运动矢量传送。接收端根据运动矢量在两个参考帧中“找出(算出)”预测值并与差值求和,得到B帧“某点”样值,从而可得到完整的B帧。
      B帧的特点:
    • a. B帧是由前面的 I 或P帧和后面的P帧进行预测的
    • b. B帧传送的是它与前面的 I 或P帧和后面的P帧之间的预测误差及运动矢量
    • c. B帧是双向预测编码帧
    • d. B帧压缩比最高,因为它只反映并参考帧间运动主体的变化情况,预测比较准确
    • e. B帧不是参考帧,不会造成解码错误的扩散
    注:I、B、P帧是根据压缩算法的需要,是人为定义的,他们都是实实在在的物理帧。
    一般来说,帧的压缩率是7(跟JPG差不多),
    P帧是20,B帧可以达到50.可见使用B帧能节省大量空间,
    节省出来的空间可以用来保存多一些帧,这样在相同码率下,可以提供更好的画质。
    

    五. H264压缩

    1.分组:把几帧图像分为一组(GOP,也就是一个序列),为防止运动变化,帧数不宜取多。
    2.定义帧:将每组内各帧图像定义为三种类型,即I帧、B帧和P帧;
    3.预测帧:以I帧做为基础帧,以I帧预测P帧,再由I帧和P帧预测B帧;
    4.数据传输:最后将I帧数据与预测的差值信息进行存储和传输。

    六. H264特点

    1.更高的编码效率:同H.263等标准的特率效率相比,能够平均节省大于50%的码率。
    2.高质量的视频画面:H.264能够在低码率情况下提供高质量的视频图像,在较低带宽上提供高质量的图像传输是H.264的应用亮点。
    3.提高网络适应能力:H.264可以工作在实时通信应用(如视频会议)低延时模式下,也可以工作在没有延时的视频存储或视频流服务器中。
    4.采用混合编码结构:同H.263相同,H.264也使用采用DCT变换编码加DPCM的差分编码的混合编码结构,还增加了如多模式运动估计、帧内预测、多帧预测、基于内容的变长编码、4x4二维整数变换等新的编码方式,提高了编码效率。
    5.H.264的编码选项较少:在H.263中编码时往往需要设置相当多选项,增加了编码的难度,而H.264做到了力求简洁的“回归基本”,降低了编码时复杂度。
    6.H.264可以应用在不同场合:H.264可以根据不同的环境使用不同的传输和播放速率,并且提供了丰富的错误处理工具,可以很好的控制或消除丢包和误码。
    7.错误恢复功能:H.264提供了解决网络传输包丢失的问题的工具,适用于在高误码率传输的无线网络中传输视频数据。
    8.较高的复杂度:264性能的改进是以增加复杂性为代价而获得的。据估计,H.264编码的计算复杂度大约相当于H.263的3倍,解码复杂度大约相当于H.263的2倍。
    H.264的目标应用涵盖了目前大部分的视频服务,如有线电视远程监控、交互媒体、数字电视、视频会议、视频点播、流媒体服务等。H.264为解决不同应用中的网络传输的差异。定义了两层:视频编码层(VCL:Video Coding Layer)负责高效的视频内容表示,网络提取层(NAL:Network Abstraction Layer)负责以网络所要求的恰当的方式对数据进行打包和传送。

    七. H.265与H.264的差异详解

    • 1.1 H.264与H.265的主要差异
      H.265仍然采用混合编解码,编解码结构域H.264基本一致,
    • 1.2. 压缩性能比较
      H.265/HEVC HM-9.0 和H.264 JM-18.4 的BD-rate 比较:
      AllIntra case: 22%
      RandomAccess case: 34%
      LowDelay case: 37%
    • 1.3. 块划分结构
      在H.265中,将宏块的大小从H.264的16×16扩展到了64×64,以便于高分辨率视频的压缩。
      同时,采用了更加灵活的编码结构来提高编码效率,
      包括编码单元(CodingUnit)、预测单元(PredictUnit)和变换单元(TransformUnit)。
    • 1.4. 帧内预测模式
      本质上H.265是在H.264的预测方向基础上增加了更多的预测方向
      H.265:所有尺寸的CU块,亮度有35种预测方向,色度有5种预测方向
      H.264:亮度 4x4块9个方向,8x8块9个方向,16x16块4种方向,色度4种方向
    • 1.5. 帧间预测
      本质上H.265是在H.264基础上增加插值的抽头系数个数,改变抽头系数值以及增加运动矢量预测值的候选个数,以达到减少预测残差的目的。
      H.265与H.264一样插值精度都是亮度到1/4,色度到1/8精度,但插值滤波器抽头长度和系数不同.
      H.265的增加了运动矢量预测值候选的个数,而H.264预测值只有一个.

    相关文章

      网友评论

          本文标题:Android 音视频01 --- H264的基本原理01

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