H264码流中SEI数据结构
H264码流中SEI NAL数据结构
数据段 | start code | NRI | payload type | payload size | UUID | payload | 结尾对齐码 |
---|---|---|---|---|---|---|---|
数据 | 0x00 0x00 0x00 0x01 | 0x06 | 0x05 | *** | *** | *** | 0x80 |
长度 | 4 bytes | 1 bytes | 1 bytes | 2 bytes | 16 bytes | N bytes | 1 bytes |
NAL说明:
网络抽象层(Network Abstract Layer)简称为NAL。在H.264/AVC视频编码标准中,整个系统框架被分为了两个层面:视频编码层面(Video Coding Layer - VCL)和网络抽象层面(Network Abstraction Layer - NAL)。VCL负责表示有效视频数据的内容,NAL 负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL unit是NAL的基本语法结构,它包含一个字节的头信息(NAL header)和一系列来自VCL的原始数据字节流(RBSP)。
参考:https://zhuanlan.zhihu.com/p/572239506
NAL unit type储存在NAL header中,在H.264/AVC标准中,可用的NAL unit type一共有17种,其中值为6时表征SEI 内容。比较常见的类型如下表所示:
H264码流中的SEI解析
1.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图像。
2.SEI payload type
"0x06"后一个字节为“0x05”(淡黄底色)是SEI payload type,即表征SEI payload分析遵循user_data_unregistered()语法。
3.SEI payload size
“0x05”后一个字节为“0x2F”(淡蓝底色)是SEI payload size,此时整个payload是47个字节。
4.SEI payload uuid
"0x2F"随后的16个字节即为uuid,此时uuid为 dc45e9bd-e6d9-48b7-962c-d820d923eeef
5.SEI payload content
由于payload size是47个字节,除去16字节的uuid,剩下31个字节的content。由于content是字符串,所以有结束符"0x00",有效的30个字符内容是:
Zencoder Video Encoding System
6.rbsp trailing bits
47个payload字节后的"0x80"(灰底色)即是rbsp trailing bits,在user_data_unregistered()里面都是按字节写入的,所以此时的NAL unit结尾写入的字节一定是0x80。