如何处理直播 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

画布信息,画布的参数信息如下:

  • w:画布的宽度,单位为像素。在客户端或服务端旁路推流 API 中设置的画布的 width 字段。
  • h:画布的高度,单位为像素。在客户端或服务端旁路推流 API 中设置的画布的 height 字段。
  • bgnd:画布的背景颜色,格式为 RGB 定义下的十六进制整数。在客户端或服务端旁路推流 API 中设置的画布的 backgroundColor 或 color 字段。
regions

所有参与转码合流的主播的信息(包含布局信息),为 region 的列表。在客户端或服务端旁路推流 API 中设置的的 transcodingUsers 或 videoOptions/audioOptions 信息。region 的参数信息如下:

  • suid:(可选)该区域对应的主播的 String 型 User Account。该参数仅适用于启用了 String 型 User account 的主播。
  • uid:该区域对应的主播的整型用户 UID。在客户端或服务端旁路推流 API 中设置的 uid 字段。
  • alpha:该区域的透明度,取值范围 [0.0,255.0] 。取值为在客户端或服务端旁路推流 API 中设置的 alpha 数值的 255 倍。
  • zorder:该区域的层级,取值范围 [1,100]。在客户端或服务端旁路推流 API 中设置的 zOrder 字段。
  • volume:该区域对应主播的音量,取值范围 [0,255]。
  • x:该区域在画布中对应的 x 坐标。在客户端或服务端旁路推流 API 中设置 x 字段。
  • y:该区域在画布中对应的 y 坐标。在客户端或服务端旁路推流 API 中设置的 y 字段。
  • w:该区域的宽度,单位为像素。在客户端或服务端旁路推流 API 中设置的 width 字段。
  • h:该区域的高度,单位为像素。在客户端或服务端旁路推流 API 中设置的 height 字段。
ver版本信息,当前版本为 20190611。
ts生成该信息时的 Unix 时间戳,单位为毫秒。
app_data自定义信息。在客户端或服务端旁路推流 API 中设置的 transcodingExtraInfo 或 seiOptions.customized 字段。
表格内容超出当前宽度,可横向滚动查看更多列。

SEI 构成

下面是一段 H.264 的 SEI 帧的内容:

Text
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 帧的内容:

Text
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。
  • 其余部分:帧内容。

常见问题

Q:是不是只要在这儿用了 SEI,就不能用信令传布局了?SDK 传的是同一个字段,传递方式(信令或 SEI)只能二选一?

A:这个是服务端推流时,在 H264/H265 的 SEI 帧中添加的信息,跟 APP 上行发送的数据不是一个概念。与 APP 上行发送的数据唯一相关的是 app_data 字段。

在新直播系统中,有效的方式仅有 LiveTranscoding 这个配置信息,旧直播系统的相关接口不再生效。

Q:布局信息不是通过信令传的嘛?这边为啥也要写上布局信息?不只是音量信息?

A:声网一直以来都会在合图推流中,发送 SEI 相关信息,但是一直没有进行规范化。此次修改规范化了 SEI 格式,并增加了音量信息,向前兼容。

加入布局信息的原因是,观众端有可能需要当前的布局信息,进行窗口边框的描绘。