美文网首页FFmpeg
H.264标准中的基本概念

H.264标准中的基本概念

作者: ZebraWei | 来源:发表于2019-10-07 12:04 被阅读0次

    版权声明:本文为卫伟学习总结文章,转载请注明出处!

    1.H264基础概念

    在H.264/AVC视频编码标准中,整个系统框架划分如下两个层面:

    • 视频编码层(VCL): VCL数据即被压缩编码后的视频数据序列,负责有效表示视频数据的内容;
    • 网络抽象层(NAL):负责将VCL数据封装到NAL单元中,并提供头信息,以保证数据适合各种信道和存储介质上的传输。
    因此平时每帧数据就是一个NAL单元。NAL单元的实际格式如下:

    每个 NAL 单元都是由 1 字节 NAL header 和 若干整数字节的负荷数据 EBSP 构成。

    2. I帧、B帧和 P帧

    视频压缩中,每一帧代表一副静止的图像。而在实际压缩时,会采取各种算法减少数据的容量,其中IPB就是最常见的。
    简单地说,I帧就是关键帧。可以理解为帧内压缩。P是向前搜索的意思。B是双向搜索。他们都是基于I帧来压缩数据。

    • I帧:表示关键帧,可以理解为这一帧画面的完整保留,解码时只需要本帧数据就可以完成(因为包含完整画面)。
    • P帧:表示的是这一帧跟之前的一个关键帧(或P帧)的差别,解码时需要用之前缓存的画面叠加上本帧定义的差别,生成最终画面。(也就是差别帧,P帧没有完整画面数据,只有与前一帧的画面差别的数据)。
    • B帧:是双向差别的帧,也就是 B帧 记录的是本帧与前后帧的差别(具体比较复杂,有四种情况)。换言之,要解码 B帧,不仅要取得之前的缓存画面,还要本帧之后的画面,通过前后画面与本帧数据的叠加取得最终的画面。B帧 压缩率高,但是解码时 CPU 会比较累。

    采用的压缩方法:分组,将几帧图像分为一组(GOP),为防止运动变化,帧数不宜取多。

      1. 定义帧:将每组内各帧图像定义为三种类型,即 I帧,P帧,B帧;
      1. 预测帧:以 I帧 为基础帧,以 I帧 预测 P帧,再由 I帧 和 P帧 预测 B帧;
    • 3 数据传输:最后将I帧数据与预测的差值信息进行存储和传输。
    3. GOF

    GOF:一组帧。如果一秒钟之内有三十帧,这三十帧可以划为一组。如果摄像头一分钟内捕获的图片都没有什么大变化,这样也可把这一分钟内的所有帧成为一组帧。

    所谓一组帧,就是在一个I帧与另一个I帧之间这一组包括了B和P帧。这一组称为GOF。
    3.1 SPS与PPS

    SPS与PPS实际是对存GOF的参数。
    SPS:Sequence Parameter Set, 序列参数数集,存放帧数、参考帧数目、解码图像尺寸、帧场编码模式选择标识等。
    PPS:Picture Parameter Set,图像参数集,存放熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等。
    在一组帧之前,首先会收到SPS和PPS,如果没有这两个参数就不能进行解码和编码处理。SPS和PPS规划为I帧,这两个帧数据是不能丢失的。

    4. 视频花屏/卡顿原因

    如果GOF分组中的P帧丢失会造成解码端的图像发生错误。本身一组帧形成图像的连贯动作,当某一个帧没有到达或者损失了,这时更新的那一块数据就没有。后面帧更新了,但前面那一块没有更新,就出现了花屏现象。
    为了避免花屏问题的发生,一般如果发现P帧或者I帧丢失,就不显示本GOP内的所有帧,直到下一个I帧来后重新刷新图像。这时会出现卡顿现象。
    总结花屏是因为丢失了数据,卡顿是为了防止花屏主动丢掉一组GOF数据。

    5.视频编码器

    x264/x265:x264是目前最广泛的H.264的视频编码器。软编基本用x264。x265也逐渐成熟。因为它的压缩比更高,占用CPU的性能也高,在直播系统里不适合用。在点播系统里可以尝试使用。
    openH264:比x264性能更低些,但支持SVC视频技术。SVC将视频进行分层传输,一帧数据分为小中大三个部分。如果网络差的情况下,只发最小内核的帧,网络稍微好点,发中间内核帧。网络非常好,全部发出去。发出去后,将这三层叠加在一起,恢复原来的视频。

    6.宏块的划分与帧分组
    左上角是一个8*8的宏块,横着是8个像素,竖着也是8个像素。将整张图片用宏块来划分,划分的效果如下: 其中的一个宏块可以再进行细化,在大的宏块里面左边下边都有一小块黑色。右边也有块黑色。为了更好的压缩,把这个宏块划分为多个子块。 MPEG2是将一个宏块进行平等的划分,压缩后的数据还是比较大。H.264进行更加多的子块划分。
    帧分组:一组帧内,一个物体运动是变化很小的。比如台球的运动轨迹,可以将它的轨迹运动的帧划分为一组。因为它们的变化特别小,整个背景都是绿色,只有台球是白色。可以通过算法推算出台球在某一帧它应该会滚动到哪一个位置。
    7.H264压缩技术

    帧内预测压缩:解决的是空域数据冗余问题。空域数据就是一幅图中其中颜色、色彩和光亮等人眼不是很敏感的部分,这部分称之为冗余数据,可以将它直接删除掉的。
    帧间预测压缩:解决的是时域数据冗余问题。因为一组帧的数据相关型非常高,这些帧数据基本重复的,把这些重复的数据全部删除。
    整数离散余弦变换(DCT):将空间上的相关性变为频域上无关的数据然后进行量化。
    CABAC压缩:无损压缩。

    7.1.组内宏块查找 (帧间压缩技术)
    一组运动台球的帧,从一个角滚动到另一个角。将这一组帧的相邻的两帧做为组内的宏块查找。当扫描到一个台球时,发现台球之后就会在台球周围去找,周围是否有类似的宏块。它们之间有一个运动的方向和一个运动的距离,这就是运动矢量。将所有的这些帧都进行两两比较,最好就形成了右边这张图。每一个红色的标注就是运动矢量。 因为所有帧的背景都时一样的,变化的就是它的运动矢量。还有它的台球的数据。这样通过运算压缩之后,留下来的数据:运动矢量数据+残差的数据。这过这样帧间压缩,只需要存一点点数据。解决时间数据的冗余。
    7.2 帧内预测
    帧内压缩主要针对的时I帧的,解决的时空间的数据冗余。先通过一种计算,选择想用的那种模式。对每个宏块采用不同的模式运算,将产生每一个宏块产生帧内预测的模式。帧内预测有九种模式。 挑选出后,每一个宏块使用的块预测模式,预测完了之后,如左那个图。将预测来的帧图与原图进行差计算。得到差数据就是残差值。
    帧内压缩:残差数据+选择每个宏块的模式信息数据。解码的时候,首先通过预测的模拟信息恢复出预测的图,再将预测的图与残差值进行累加。就能还原出原始的图像。
    7.3 DCT压缩
    通过数字对宏块进行量化,量化之后通过DCT数据方法进行压缩。 DCT压缩后的效果如下:
    7.4 VLC压缩

    上下文适应无损压缩技术。具体详解

    相关文章

      网友评论

        本文标题:H.264标准中的基本概念

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