什么事SEI
SEI即补充增强信息(Supplemental Enhancement Information),属于码流范畴,它提供了向视频码流中加入额外信息的方法,是H.264/H.265这些视频压缩标准的特性之一。SEI的基本特征如下:
1. 并非解码过程的必须选项
2. 可能对解码过程(容错、纠错)有帮助
3. 集成在视频码流中
也就是说,视频编码器在输出视频码流的时候,可以不提供SEI信息。虽然在视频的传输过程、解封装、解码这些环节,都可能因为某种原因丢弃SEI内容,但在视频内容的生成端和传输过程中,是可以插入SEI信息的。这些插入的信息,和其他视频内容一同经过传输链路到达消费端。举例来说,当前火爆的直播问答模式,就是通过SEI传递较多和答题业务相关的信息,通过SEI承载的信息,极大地优化了题目显示和观众音视频观看的同步性。
那么在SEI中可以添加哪些信息呢?以下是一些用户场景可任意扩展的例子:
1. 传递编码器参数
2. 传递视频版权信息
3. 传递摄像头参数
4. 传递内容生成过程中的剪辑事件(引发场景切换)
对于SEI如何应用,我们先以H.264/AVC这一视频编码标准为例。在这一标准中,整个系统框架分为两层:视频编码层面(Video Coding Layer,简称VCL)和网络抽象层面(Network Abstraction Layer,简称NAL)。VCL负责表示有效视频数据的内容,NAL负责格式化数据并提供头信息,以保证数据适合各种信道和存储介质上的传输。NAL unit是NAL的基本语法结构,它包含一个字节的头信息(NAL header)和一系列来自VCL的原始数据字节流(RBSP)。
基于SEI的阿里云直播答题架构
直播问答的一核心需求是“画题同步”,这也是决定用户体验的关键。阿里云解决方案:
- 主持人提出问题,此时准备推送题目。为了能快速让用户看到题目,题库都存在阿里云持久型缓存数据库Redis上。
- 现场人员发出信息,通过接入方的AppServer,调用阿里云的OpenAPI,在直播视频流当前位置中插入若干SEI帧,帧内容可由业务自定义。
- 播放SDK接收到视频流后,解析出SEI帧,并回调给APP。此时APP立即向AppServer请求问题信息,然后显示在APP上,完成整个出题过程。
- 收到用户答题后,用户答题结果实时写入Redis进行判断答题是否正确返回给现场人员。完成整个答题流程。
以上方案环环相扣,实现了从主持人信号与音视频通过同一传输通道同时传输,可实现高精度同步。
声网 SEI 规范
在默认情况下,声网进行服务端转码推流时,会在转码后的 H264/H265 的 SEI 帧中,增加当前视频的编码信息。该信息为 Json 格式的字符串,具体示例如下:
{
"canvas": {
"w": 640,
"h": 360,
"bgnd": "#000000"
},
"regions": [{
"uid": 1,
"alpha": 1.0,
"zorder": 1,
"volume": 50,
"x": 0,
"y": 0,
"w": 320,
"h": 360
}, {
"uid": 2,
"alpha": 1.0,
"zorder": 1,
"volume": 89,
"x": 320,
"y": 0,
"w": 320,
"h": 360
}],
"ver": "20180828",
"ts": 1535385600000,
"app_data": ""
}
各项参数定义如下:
- canvas:画布信息,画布的参数信息如下;
- w:画布的宽度,单位为像素。主播在 APP 设置的 LiveTranscoding 中的 width 信息;
- h:画布的高度,单位为像素。主播在 APP 设置的 LiveTranscoding 中的 height 信息;
- bgnd:画布的背景颜色,RGB 格式,为 16 进制代码表示的字符串。主播在 APP 设置的 LiveTranscoding 中的 backgroundColor 信息;
- regions:主播信息及主播布局信息,为 region 的列表。主播在 APP 设置的 LiveTranscoding 中的 transcodingUsers 信息。region 的参数信息如下;
- suid:(可选)该区域对应主播的 String 型 User account。该参数适用于启用了 String 型 User account 的主播;
- uid:该区域对应主播的 ID。主播在 APP 设置的 TranscodingUser 中的 uid 信息;
- alpha:该区域的透明度,取值范围 [0.0, 1.0]。主播在 APP 设置的 TranscodingUser 中的 alpha 信息;
- zorder:该区域的层级,取值范围 [1, 100]。主播在 APP 设置的 TranscodingUser 中的 zOrder 信息;
- volume:该区域对应主播的音量大小,取值范围 [0, 255];
- x:该区域在画布中对应的 x 坐标。主播在 APP 设置的 TranscodingUser 中的 x 信息;
- y:该区域在画布中对应的 y 坐标。主播在 APP 设置的 TranscodingUser 中的 y 信息;
- w:该区域的宽度。主播在 APP 设置的 TranscodingUser 中的 width 信息;
- h:该区域的高度。主播在 APP 设置的 TranscodingUser 中的 height 信息;
- ver:版本信息,当前版本为 20190611;
- ts:生成该信息时的时间戳,单位 ms;
- app_data:自定义信息。主播在 APP 设置的 LiveTranscoding 中的 transcodingExtraInfo 信息;
SEI 构成
下面是一段 SEI 帧的内容:
0000 0664bd7b 22617070 5f646174 61223a22 .d.{"app_data":"
0010 222c2263 616e7661 73223a7b 2262676e ","canvas":{"bgn
0020 64223a22 23666666 66666622 2c226822 d":"#ffffff","h"
0030 3a363430 2c227722 3a333630 7d2c2272 :640,"w":360},"r
0040 6567696f 6e73223a 5b7b2261 6c706861 egions": [{"alpha
0050 223a3235 352c2268 223a3634 302c2275 ":255,"h":640,"u
0060 6964223a 33313031 32373137 39312c22 id":3101271791,"
0070 766f6c75 6d65223a 32382c22 77223a33 volume":28,"w":3
0080 36302c22 78223a30 2c227922 3a302c22 60,"x":0,"y":0,"
0090 7a6f7264 6572223a 317d5d2c 22747322 zorder":1}],"ts"
00a0 3a313533 37393630 32333537 38332c22 :1537960235783,"
00b0 76657222 3a223230 31383038 3238227d ver":"20180828"}
字段说明:
- 06:SEI 帧;
- 64:用户定义的帧类型,这里声网定义 SEI 类型为 100;
- bd:帧长度。如果帧长度超过 255,例如 922,则表示为 ffffff9d;
- 其余部分:帧内容;
Reference