You need to enable JavaScript to run this app.
导航

集成最佳实践

最近更新时间2024.01.04 16:48:08

首次发布时间2023.10.31 17:39:57

你可参看以下最佳实践来获取转推直播最佳效果。

SEI 类型

直播拉流端收到的 SEI(Supplemental Enhancement Information)分为 RTC 透传SEI 和服务端合流转推 SEI:

  • RTC 透传 SEI:
    • 含义:用户在客户端API sendSEIMessage 传入的 SEI,合流转推服务端仅在订阅该用户的流并从视频帧中提取出 SEI 之后做透传,数据结构由用户自行定义;
    • 触发时机:在服务端转码机器人收到该用户的视频流之后,立即将该信息编入下一视频帧(普通视频帧/关键帧);
  • 服务端合流转推 SEI:
    • 含义:由合流转推服务端生成的特定的 SEI,数据结构由火山引擎定义;
    • 触发时机:该 SEI 信息默认跟随每个 I 帧;若用户开启了音量指示模式,那么该 SEI 信息可能被编入普通视频帧;若透传客户端传入 SEI,服务端也会产生一条 SEI。

服务端合流转推 SEI 结构

服务端在转推直播以及录制场景下,默认会在 SEI 中增加关于当前视频流的编码信息。该信息为 JSON 格式的字符串,具体示例如下:

{
    "app_data": "Your_AppData",
    "canvas": {
        "bgnd": "#ff0000",
        "h": 480,
        "w": 640
    },
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1",
            "volume": 10
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2",
            "volume": 20
        }
    ],
    "regions": [
        {
            "alpha": 1.0,
            "contentControl": 0,
            "h": 1.0,
            "renderMode": 2,
            "uid": "Your_UserId_1",
            "w": 0.5,
            "x": 0.0,
            "y": 0.0,
            "zorder": 0
        },
        {
            "alpha": 1.0,
            "contentControl": 0,
            "h": 1.0,
            "renderMode": 2,
            "uid": "Your_UserId_2",
            "w": 0.5,
            "x": 0.5,
            "y": 0.0,
            "zorder": 1
        }
    ],
    "ts": 1687920756747
}

各项参数定义如下:

参数描述
canvas画布信息。返回的信息取决于 OpenAPI 任务启动时传入的参数。画布的参数信息如下:
  • w:画布的宽度,对应 Canvas.Width
  • h:画布的高度,对应 Canvas.Height
  • bgnd:画布的背景颜色,格式为 RGB 定义下的十六进制整数,对应 Canvas.Background
regions所有合流用户的信息(包含布局信息),返回的信息取决于 OpenAPI 任务启动时传入的参数;
  • Alpha:画面的透明度,对应 Region.Alpha
  • contentControl:该路流参与混流的媒体类型,对应 Region.MediaType
  • w:视频流对应区域宽度的像素绝对值,对应 Region.Width
  • h: 视频流对应区域高度的像素绝对值,对应 Region.Height
  • x:视频流对应区域左上角的横坐标相对整体画面的比例,对应 Region.LocationX
  • y:视频流对应区域左上角的纵坐标相对整体画面的比例,对应 Region.LocationY
  • renderMode:画面的渲染模式,对应 Region.RenderMode
  • uid:流所属用户的 Id,对应 Streams.Stream.UserId
  • zorder:画面的图层顺序,对应 Region.Zorder
infos音量信息。只有开启了音量指示模式,才会返回该字段;
  • uid:流所属用户的 Id;
  • talk:该用户是否有讲话。0 表示用户实际音量未超过 TalkVolume 设定值。1 表示用户实际音量超过 TalkVolume 设定值。
  • volume:用户实际音量大小,范围为[0,255]
ts生成该信息时的 Unix 时间戳,单位为毫秒。
app_data自定义信息。用户在 Control 中传入的 UserConfigExtraInfo 字段;

音量指示模式


在转推直播场景中,你可能需要开启音量指示,以便实现某些业务逻辑,例如在观众客户端实时展示某个主播说话的声波动效。

步骤 1: 将 VolumeIndicationMode 设置为 true 开启音量指示模式。
步骤 2:通过 VolumeIndicationInterval 设置用户说话音量的回调间隔。
[可选] 步骤 3:通过 talkVolume 设置有效说话音量大小。
步骤 4:解析服务端合流转推SEI 中的 infos 字段获取用户的音量信息。

在开启音量指示模式后,你可以通过设置 SeiContentModeAddVolumeValue 选择在非关键帧中携带不同的 SEI 信息,但关键帧中会携带全量的 SEI 信息。

  • SeiContentMode=0, AddVolumeValue=false时,非关键帧中包含除用户说话音量值外全部 SEI 信息。
{
    "app_data": "Your_AppData",
    "canvas": {
        "bgnd": "#ff0000",
        "h": 480,
        "w": 640
    },
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1"
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2"
        }
    ],
    "regions": [
        {
            "alpha": 1.0,
            "contentControl": 0,
            "height": 320,
            "renderMode": 2,
            "uid": "Your_UserId_1",
            "width": 320,
            "locationX": 1,
            "locationY": 2,
            "zorder": 0
        },
        {
            "alpha": 1.0,
            "contentControl": 0,
            "height": 600,
            "renderMode": 2,
            "uid": "Your_UserId_2",
            "width": 200,
            "locationX": 330,
            "locationY": 2,
            "zorder": 1
        }
    ],
    "ts": 1687920756747
}
  • SeiContentMode=0, AddVolumeValue=true时,非关键帧中包含全部 SEI 信息。
{
    "app_data": "Your_AppData",
    "canvas": {
        "bgnd": "#ff0000",
        "h": 480,
        "w": 640
    },
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1",
            "volume": 10
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2",
            "volume": 20
        }
    ],
    "regions": [
        {
            "alpha": 1.0,
            "contentControl": 0,
            "height": 320,
            "renderMode": 2,
            "uid": "Your_UserId_1",
            "width": 320,
            "locationX": 1,
            "locationY": 2,
            "zorder": 0
        },
        {
            "alpha": 1.0,
            "contentControl": 0,
            "height": 600,
            "renderMode": 2,
            "uid": "Your_UserId_2",
            "width": 200,
            "locationX": 330,
            "locationY": 2,
            "zorder": 1
        }
    ],
    "ts": 1687920756747
}
  • SeiContentMode=1, AddVolumeValue=false时,非关键帧 SEI 中只包含除用户说话音量值外音量信息
{
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1"
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2"
        }
    ],
    "ts": 1687920756747
}
  • SeiContentMode=1, AddVolumeValue=true时,SEI 中只包含音量信息
{
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1",
            "volume": 10
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2",
            "volume": 20
        }
    ],
    "ts": 1687920756747
}

设置 SEI PayLoadType

你可以设置 SEI PayLoadType5100 以兼容你的客户端播放器。

  • 如果你传入了 SEIPayLoadType 参数,会对服务端合流转推 SEI和 RTC 透传 SEI 均生效;
  • 如果你传入 SEIPayloadType = 5 并传入了 SEIPayloadUUID 参数,则该参数仅对 RTC 透传SEI 生效;此时,服务端合流转推 SEI 的 SEIPayloadUUID 为固定值:566f6c63656e67696e65525443534549 ,对应16位字符串 VolcengineRTCSEI