美文网首页
H264码流分析

H264码流分析

作者: 水木年华1987 | 来源:发表于2021-02-20 01:06 被阅读0次
    1. 编码器编码出的H264码流格式默认为字节流AnnexB格式,如下图所示每一个NALU单元前都有一个起始码,起始码对于一帧的首个NALU为0x00 00 00 01,其余的为0x 00 00 01。
    • image.png

    2.一个NALU单元,其由NALU Header 和EBSP组成。NALU Header占位1Byte

    SODB:数据比特串,h264最原始的编码数据

    RBSP: 原始字节序列载荷,在SODB的后面填加了结尾比特(RBSP trailing bits 一个bit“1”)若干比特“0”,以便字节对齐。

    EBSP 扩展字节序列载荷,在RBSP基础上填加了仿校验字节(0X03)它的原因是: 在NALU加到Annexb上时,需要添加每组NALU之前的开始码 StartCode,如果该NALU对应的slice为一帧的开始则用4位字节表示,0x00000001,否则用3位字节表示 0x000001.为了使NALU主体中不包括与开始码相冲突的数据,在编码时,每遇到两个字节连续为0,就插入一个字节的0x03。解码时将0x03去掉。 也称为脱壳操作。

    image.png image.png
    • NALU Header说明
    字段名 字段大小 字段说明
    forbidden_bit 1bit 如果有语法冲突,则为 1。当网络识别此单元存在比特错误时,可将其设为 1,以便接收方丢掉该单元
    nal_reference_bit 2bit 用来指示该NALU 的重要性等级。值越大,表示当前NALU越重要。具体大于0 时取何值,没有具体规定。
    nal_unit_type 5bit image.png
    • 常用nalu_type:
    NALU类型 重要程度 nalu_type
    0x67 (0 11 00111) SPS 非常重要 type = 7
    0x68 (0 11 01000) PPS 非常重要 type = 8
    0x65 (0 11 00101) IDR帧 关键帧 非常重要 type = 5
    0x61 (0 11 00001) I帧 重要 type=1 非IDR的I帧不大常见
    0x41 (0 10 00001) P帧 重要 type = 1
    0x01 (0 00 00001) B帧 不重要 type = 1
    0x06 (0 00 00110) SEI 不重要 type = 6
    image.png

    从前面的分析我们知道,VCL层出来的是编码完的视频帧数据,这些帧可能是I、B、P帧,而且这些帧可能属于不同的序列,再者同一个序列还有相对应的一套序列参数集和图片参数集等等,所以要完成视频的解码,不仅需要传输VCL层编码出来的视频帧数据,还需要传输序列参数集、图像参数集等数据。

    参数集:包括序列参数集 SPS 和图像参数集 PPS

    • SPS 包含的是针对一连续编码视频序列的参数,如标识符 seq_parameter_set_id、帧数及 POC 的约束、参考帧数目、解码图像尺寸和帧场编码模式选择标识等等。
    • PPS对应的是一个序列中某一幅图像或者某几幅图像,其参数如标识符 pic_parameter_set_id、可选的 seq_parameter_set_id、熵编码模式选择标识、片组数目、初始量化参数和去方块滤波系数调整标识等等。

    相关文章

      网友评论

          本文标题:H264码流分析

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