H.26x中SEI信息解读(转)
原文: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
-
H265一个图像序列的组成:VPS+SPS+PPS+SEI+一个I帧+若干个P帧。VPS、SPS、PPS、SEI、一个I帧、一个P帧都可以称为一个NALU。
-
H265的NALU结构:开始码+NALU头+NALU数据
- 开始码大小为四个字节,是一个固定值00 00 00 01(十六进制),标识一个NALU的开始。
- NALU头大小为两个字节,共16位,第1位值为0,第2-7位为NALU的type位(共6位),标识当前NALU的类型,第8-15位值为0,第16位值为1。
- NALU数据为编码器编出来的图像信息或图像数据。
-
六种类型的NALU
- VPS(视频参数集):NALU头值为0x40 01(十六进制),NALU头type位值为32(十进制)。
- SPS(序列参数集):NALU头值为0x42 01(十六进制),NALU头type位值为33(十进制)。
- PPS(图像参数集):NALU头值为0x44 01(十六进制),NALU头type位值为34(十进制)。
- SEI(补充增强信息):NALU头值为0x4e 01(十六进制),NALU头type位值为39(十进制)。
- I帧:NALU头值为0x26 01(十六进制),NALU头type位值为19(十进制)。
- P帧:NALU头值为0x02 01(十六进制),NALU头type位值为1(十进制)。
-
H265的NALU打包成RTP包的模式(下面是用到的两种模式)
- 一个NALU打包成一个RTP包,只需要在一个12字节的RTP包头后添加去掉开始码的NALU即可(这种模式在一个NALU的大小小于MTU时使用)。
- 一个NALU打包成几个RTP包(FUs模式),在12个字节的RTP头后面有两个字节的PayloadHdr和一个字节的FU header。PayloadHdr的值等于NALU头的type位改为49(十进制)后的值,FU header第1位标记RTP包是否为NALU的第一片,第2位标记RTP包是否为NALU的最后一片。后6位是NALU头的type位。