2024/08/20 16:44:33
如何处理直播 SEI 相关问题?
声网 SEI 规范
在默认情况下,声网进行服务端转码推流时,会在转码后的 H.264 或 H.265 的 SEI(Supplemental Enhancement Information)信息中,增加当前视频的编码信息。该信息为 JSON 格式的字符串,具体示例如下:
JSON
{
"canvas": {
"w": 640,
"h": 360,
"bgnd": "#000000"
},
"regions": [
{
"uid": 1,
"alpha": 255.0,
"zorder": 1,
"volume": 50,
"x": 0,
"y": 0,
"w": 320,
"h": 360
},
{
"uid": 2,
"alpha": 255.0,
"zOrder": 1,
"volume": 89,
"x": 320,
"y": 0,
"w": 320,
"h": 360
}
],
"ver": "20190611",
"ts": 1535385600000,
"app_data": ""
}
各项参数定义如下:
参数 | 描述 |
---|---|
canvas | 画布信息,画布的参数信息如下:
|
regions | 所有参与转码合流的主播的信息(包含布局信息),为 region 的列表。在客户端或服务端旁路推流 API 中设置的的 transcodingUsers 或 videoOptions /audioOptions 信息。region 的参数信息如下:
|
ver | 版本信息,当前版本为 20190611。 |
ts | 生成该信息时的 Unix 时间戳,单位为毫秒。 |
app_data | 自定义信息。在客户端或服务端旁路推流 API 中设置的 transcodingExtraInfo 或 seiOptions.customized 字段。 |
SEI 构成
- H.264
- H.265
下面是一段 H.264 的 SEI 帧的内容:
0000 0664bd7b 22617070 5f646174 61223a22
0010 222c2263 616e7661 73223a7b 2262676e
0020 64223a22 23666666 66666622 2c226822
0030 3a363430 2c227722 3a333630 7d2c2272
0040 6567696f 6e73223a 5b7b2261 6c706861
0050 223a3235 352c2268 223a3634 302c2275
0060 6964223a 33313031 32373137 39312c22
0070 766f6c75 6d65223a 32382c22 77223a33
0080 36302c22 78223a30 2c227922 3a302c22
0090 7a6f7264 6572223a 317d5d2c 22747322
00a0 3a313533 37393630 32333537 38332c22
00b0 76657222 3a223230 31383038 3238227d
转码后的 H.264 SEI 信息如下:
JSON
{
"app_data": "",
"canvas": {
"bgnd": "#ffffff",
"h": 640,
"w": 360
},
"regions": [
{
"alpha": 255,
"h": 640,
"uid": 3101279171,
"volume": 28,
"w": 360,
"x": 0,
"y": 0,
"zorder": 1
}
],
"ts": 1537960235783,
"ver": "20180828"
}
下面是一段 H.265 的 SEI 帧的内容:
0000014E 0164BC7B 22617070 5F646174 61223A22 222C2263
616E7661 73223A7B 2262676E 64223A22 23303030 30303022
2C226822 3A363430 2C227722 3A333630 7D2C2272 6567696F
6E73223A 5B7B2261 6C706861 223A3235 352C2268 223A3634
302C2275 6964223A 32313935 34313935 2C22766F 60756D65
223A3131 322C2277 223A3336 302C2278 223A302C 2279223A
302C227A 6F726465 72223A31 7D5D2C22 7473223A 31373233
32303337 37363236 312C2276 6572223A 22323031 39303631
31227D80
转码后的 H.265 SEI 信息如下:
JSON
{
"app_data": "",
"canvas": {
"bgnd": "#000000",
"h": 640,
"w": 360
},
"regions": [
{
"alpha": 255,
"h": 640,
"uid": 21954195,
"volume": 112,
"w": 360,
"x": 0,
"y": 0,
"zorder": 1
}
],
"ts": 17232303776261,
"ver": "20190611"
}
字段说明:
06
:H.264 格式中的 SEI 帧。4E01
:H.265 格式中的 SEI 帧。64
: 用户定义的帧类型:- 声网默认该类型为 100。
- 其他类型。用户需要进行额外处理和逻辑保护。
bd
:表示帧长度。下面是一些以十进制和十六进制展示的计算示例:- 帧长度为 922,即 255(
0xff
)+ 255(0xff
)+ 255(0xff
)+ 157(0x9d
),则bd
表示为ffffff9d
。 - 帧长度为 572,即 255(
0xff
)+ 255(0xff
)+ 62(0x3e
),则bd
表示为ffff3e
。 - 帧长度为 234,即被 255 整除为 0 且余数为 234(
0xea
),则bd
表示为ea
。
- 帧长度为 922,即 255(
- 其余部分:帧内容。
常见问题
Q:是不是只要在这儿用了 SEI,就不能用信令传布局了?SDK 传的是同一个字段,传递方式(信令或 SEI)只能二选一?
A:这个是服务端推流时,在 H264/H265 的 SEI 帧中添加的信息,跟 APP 上行发送的数据不是一个概念。与 APP 上行发送的数据唯一相关的是 app_data 字段。
在新直播系统中,有效的方式仅有 LiveTranscoding 这个配置信息,旧直播系统的相关接口不再生效。
Q:布局信息不是通过信令传的嘛?这边为啥也要写上布局信息?不只是音量信息?
A:声网一直以来都会在合图推流中,发送 SEI 相关信息,但是一直没有进行规范化。此次修改规范化了 SEI 格式,并增加了音量信息,向前兼容。
加入布局信息的原因是,观众端有可能需要当前的布局信息,进行窗口边框的描绘。