余温|SEI那些事儿,FFmpeg从入门到精通——进阶篇( 三 )


·“0x68” , 此时NRI为“11B” , NALunittype为PPS类型 。
·“0x65” , 此时NRI为“11B” , NALunittype为IDR图像 。
SEIpayloadtype
"0x06"后一个字节为“0x05”(淡黄底色)是SEIpayloadtype , 即表征SEIpayload分析遵循user_data_unregistered()语法 。
SEIpayloadsize
“0x05”后一个字节为“0x2F”(淡蓝底色)是SEIpayloadsize , 此时整个payload是47个字节 。
SEIpayloaduuid
"0x2F"随后的16个字节即为uuid , 此时uuid为
由于payloadsize是47个字节 , 除去16字节的uuid , 剩下31个字节的content 。 由于content是字符串 , 所以有结束符"0x00" , 有效的30个字符内容是:
47个payload字节后的"0x80"(灰底色)即是rbsptrailingbits , 在user_data_unregistered()里面都是按字节写入的 , 所以此时的NALunit结尾写入的字节一定是0x80 。
SEI的生成生成SEI的方式很多 , 大致可以有:
1.对已有码流做filter , 插入SEINAL
2.视频编码时生成SEI
3.容器层写入时插入SEI
以下代码示例来自于FFmpegorigin/master分支 。
bsfBitStreamFilter(码流过滤)的缩写为bsf , 它的作用是 , 在不做码流解码的前提下 , 对已经编码后的比特流做特定的修改、调整 。
bsfh264_metadata的调用
使用ffmpeg工具时 , 可以使用比特流过滤器 。 基本的filter调用格式如下:
bsfh264_metadata的代码分析
具体代码位于:libavcodec/h264_metadata_bsf.c中 。
·读取的accessunits是第一个au;
·当前au包含sps;满足插入SEI逻辑后 , 具体处理过程中:
·如果发现第一个NAL已经是SEI , 则该au不做插入SEI处理;
·如果au包含了IDR帧或者非IDR未分区的帧 , 则在其前面插入SEI信息 。
基于以上代码 , oceans.sei.h264码流中新插入27个新的SEI符合处理逻辑 。 具体构造SEINALUnit代码如下: