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

SEI 类型

直播拉流端收到的 SEI(Supplemental Enhancement Information)分为 RTC 透传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
}
cpp

各项参数定义如下:

参数描述
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 字段获取用户的音量信息。

在开启音量指示模式后,你可以通过设置 SeiContentMode 和 AddVolumeValue 选择在非关键帧中携带不同的 SEI 信息,但关键帧中会携带全量的 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
}
cpp
{
    "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
}
cpp
{
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1"
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2"
        }
    ],
    "ts": 1687920756747
}
cpp
{
    "infos": [
        {
            "talk": 0,
            "uid": "Your_UserId_1",
            "volume": 10
        },
        {
            "talk": 0,
            "uid": "Your_UserId_2",
            "volume": 20
        }
    ],
    "ts": 1687920756747
}

cpp
设置 SEI PayLoadType

你可以设置 SEI PayLoadType 为 5 或 100 以兼容你的客户端播放器。