H.26x中SEI信息解读(转)

发布时间 2023-11-07 21:36:45作者: 奋斗终生

原文:https://www.jianshu.com/p/23d9ab930b49

作者:Li_Xianglin

来源:简书

H.264 SEI

http://www.itu.int/rec/T-REC-H.264

 

NAL header

起始码(暗红底色)"0x00000001"分割出来的比特流即是NAL unit,起始码紧跟的第一个字节(墨绿底色)是NAL header。上图“NAL header”一共出现了四个数值:

    • "0x06",此时NRI为"00B",NAL unit type为SEI类型。
    • “0x67”,此时NRI为“11B”,NAL unit type为SPS类型。
    • “0x68”,此时NRI为“11B”,NAL unit type为PPS类型。
    • “0x65”,此时NRI为“11B”,NAL unit type为IDR图像。

 

SEI payload type

"0x06"后一个字节为“0x05”(淡黄底色)是SEI payload type,即表征SEI payload分析遵循user_data_unregistered()语法。

在国标中。sei payload type为5,为自定义消息:如图

 

SEI payload size

“0x05”后一个字节为“0x2F”(淡蓝底色)是SEI payload size,此时整个payload是47个字节。

  • SEI payload uuid

    "0x2F"随后的16个字节即为uuid,此时uuid为:

    dc45e9bde6d948b7962cd820d923eeef
    
  • SEI payload content

    由于payload size是47个字节,除去16字节的uuid,剩下31个字节的content。由于content是字符串,所以有结束符"0x00",有效的30个字符内容是

    Zencoder Video Encoding System
    
  • rbsp trailing bits
    47个payload字节后的"0x80"(灰底色)即是rbsp trailing bits,在user_data_unregistered()里面都是按字节写入的,所以此时的NAL unit结尾写入的字节一定是0x80。

 

H.265

http://www.itu.int/rec/T-REC-H.265

  1. H265一个图像序列的组成:VPS+SPS+PPS+SEI+一个I帧+若干个P帧。VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称为一个NALU。

  2. H265的NALU结构:开始码+NALU头+NALU数据

    1. 开始码大小为四个字节,是一个固定值00 00 00 01(十六进制),标识一个NALU的开始。
    2. NALU头大小为两个字节,共16位,第1位值为0,第2-7位为NALU的type位(共6位),标识当前NALU的类型,第8-15位值为0,第16位值为1。
    3. NALU数据为编码器编出来的图像信息或图像数据。
  3. 六种类型的NALU

    1. VPS(视频参数集):NALU头值为0x40 01(十六进制),NALU头type位值为32(十进制)。
    2. SPS(序列参数集):NALU头值为0x42 01(十六进制),NALU头type位值为33(十进制)。
    3. PPS(图像参数集):NALU头值为0x44 01(十六进制),NALU头type位值为34(十进制)。
    4. SEI(补充增强信息):NALU头值为0x4e 01(十六进制),NALU头type位值为39(十进制)。
    5. I帧:NALU头值为0x26 01(十六进制),NALU头type位值为19(十进制)。
    6. P帧:NALU头值为0x02 01(十六进制),NALU头type位值为1(十进制)。
  4. H265的NALU打包成RTP包的模式(下面是用到的两种模式)

    1. 一个NALU打包成一个RTP包,只需要在一个12字节的RTP包头后添加去掉开始码的NALU即可(这种模式在一个NALU的大小小于MTU时使用)。
    2. 一个NALU打包成几个RTP包(FUs模式),在12个字节的RTP头后面有两个字节的PayloadHdr和一个字节的FU header。PayloadHdr的值等于NALU头的type位改为49(十进制)后的值,FU header第1位标记RTP包是否为NALU的第一片,第2位标记RTP包是否为NALU的最后一片。后6位是NALU头的type位。