笔记---H.264里的SEI

给公司的直播推流框架加上了携带SEI的功能,做完了记录一下
这个东西使用场景挺广的,比如直播中的动画效果,直接渲染到画面上可能会引起性能消耗,不如通过SEI告诉给观众,由观众端做出UI响应,既能保持直播画面和效果同步出现,又能减少主播端的性能消耗,其次,对于音频视频文件资源,可以通过SEI在视频中埋入版权等信息。

H264编码由两个部分组成(VCL和NAL)


画面帧首先要经过 视频编码层面(VCL) 被编码层切割成宏块,这不是本篇记录的重点,不展开讲


之后这些块会被 网络抽象层面(NAL) 分割成多个NALU块

NAL NAL NAL NAL ...

这些NAL块里一部分是装着上面切割的画面数据,一部分装着描述这个视频的参数数据(输序列参数集和图像参数集等等)


接着拆
每个NAL又可以拆成NAL HeaderRBSP

NAL Header RBSP NAL Header RBSP ...

其中NAL Header描述了这个NAL的类型及携带了什么样的参数,RBSP则是这个NAL携带的内容

NAL Header的位图如下

NAL Header 摘自go_str博客

1、F(forbiden):禁止位,占用NAL头的第一个位,当禁止位值为1时表示语法错误;
2、NRI:参考级别,占用NAL头的第二到第三个位;值越大,该NAL越重要。
3、Type:Nal单元数据类型,也就是标识该NAL单元的数据类型是哪种,占用NAL头的第四到第8个位;
(摘自go_str博客

其中我们比较关注的是其中的后5位,即NAL Type

nal_type 摘自go_str博客

其中Type = 6 表示该NAL携带的是辅助增强信息(SEI)

由上面NAL Header的位图可知,Type=6时,NAL Header的 头是

   00 00 00 01          06 
   ___________          __
NAL起始(start code)   NAL Type

接下来是SEL的参数,SEI信息包含几个主要要素

· SEI payload type (该SEI遵循的语法)
· SEI payload size (该SEI所携带信息的长度)
这里我们只讨论SEI payloadType = 5的情况,即遵循user_data_unregistered()语法的SEI信息

· SEI payload uuid (SEI)
· SEI payload content
以及作为结尾的
· rbsp trailing bits (0x80)

一个个来讲,首先是SEI payload type
他的解析方式为,持续读取8bit,直到非0xff为止,然后把读取的数值累加,累加值即为SEI payload type。

payload type 摘自金山云

接在SEI payload type 后面的,即SEI payload size,读取SEI payload size和payload type逻辑类似,仍然是读取到非0xff为止,这样可以支持任意长度的SEI payload添加。

那么按照以上逻辑,再拼上start code和NAL Type

   00 00 00 01          06           05              12
   ___________          __           ——              __
NAL起始(start code)   NAL Type  SEIPayloadType  SEIPayloadSize

即 00 00 00 01 06 05
以上就是一个遵循user_data_unregistered()语法、payloadContent长度为18byte的SEI参数定义


定义好参数接下来就是内容部分
首先user_data_unregistered()语法要求在SEI payload size之后的16byte作为SEI payload uuid,该uuid由用户自定义,可以作为业务的标识参数

01 02 03 04 01 02 03 04 01 02 03 04 01 02 03 04

因为uuid固定为16,所以SEI payload size的长度必须大于等于16

然后就是SEI payload content,自由发挥,不要超过(content size - 16)即可,以0x00作为字符串结尾,

05 00

因为上面定义的size = 18 ,所以这里只有2byte作为content

最后再给这条NAL拼上结束标示

80

综上所致,该条NAL的完整样式即为

00 00 00 01 06 05 12 01 

02 03 04 01 02 03 04 01 

02 03 04 01 02 03 04 05 

00 80

到这里本篇的学习记录就结束了

接下来要做的事就是把这条NAL在h.264编码过程中混进码流里,然后塞进RTMP,变成Message,再切成Chunk,发出去就完事了……

至于接受端如何解析,我司有大佬修改ijkPlayer已经实现了SEI信息的解析,本人暂时没有研究到(太忙唉……),排上日程,抽时间去拜读一下源码

很久没有写文章了,感谢阅读,欢迎各位交流雅正

参考引用:
1.go_str的博客 入门理解H264编码
2.金山云的博客 FFmpeg从入门到精通——进阶篇,SEI那些事儿

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270