SEI

阿里云ARTC Web SDK支持发送和接收SEI(Supplemental Enhancement Information)信息。当您需要将自定义消息从ARTC系统传输到阿里云CDN直播或第三方直播平台时,可以使用此功能来实现。

使用说明

SEI的使用场景包括但不限于:

  • 使用媒体扩展信息传递时间戳,计算端到端的网络延迟,或者跟自身其他业务做数据同步。

  • 使用媒体扩展信息传递描述信息。目前可以传递最多4k Byte数据,可以用来传输少量数据,建议使用JSON或者纯字符串。

  • 内部使用SEI扩展协议来实现。

发送SEI

检测环境

检测当前环境是否支持发送和接收SEI,不支持时请勿开启。

// 静态方法
const result = AliRtcEngine.isSupported();
if (!result.detail.isSendMediaExtensionMsgSupported) {
  console.log('Your browser does not support sei.');
}

发送SEI

启用其能力会增加客户端性能开销,如需发送SEI,需要在加入频道之前调用setEnableMediaExtensionMsg

// 前提:需要先创建引擎实例
// 是否启用媒体扩展,需要在加入房间之前调用
aliRtcEngine.setEnableMediaExtensionMsg(true);

// 假设使用 SEI 发送 DataView 对象
const buffer = new ArrayBuffer(4);
const view = new DataView(buffer);

// 使用 DataView 设置 ArrayBuffer 的内容,内容为 7f ff 7f ff
view.setInt8(0, 127); // 设置第一个字节为 127
view.setUint8(1, 255); // 设置第二个字节为 255
view.setInt16(2, 32767); // 设置第三和第四个字节为 32767

aliRtcEngine
  .sendMediaExtensionMsg(buffer, 2)
  .then(() => {
    console.log(
      '发送 SEI 成功,内容为 `7fff7fff`,重复 2 次,payloadType 为 5',
    );
  })
  .catch((err: Error) => {
    message.error(err.message);
  });

使用媒体扩展信息时需要复用音视频数据通道,因此必须控制自定义消息的发送频率和消息数据长度,使用限制如下:

  • 每秒最多发送profile条消息,因为SEI信息是放到H.264/H.265流中传输,有视频帧编码才能附加扩展信息。

  • 为了不影响媒体数据的传输质量,自定义消息体长度限制为4k Byte,可以用来传输少量信息。

  • sendMediaExtensionMsg函数中repeatCount参数为自定义消息冗余度,若大于1,则会发送多次,防止网络丢包导致的消息丢失,此时频道里的其他人也会收到多次相同的消息,需要进行去重。

  • 发送的自定义消息,在旁路直播时,频道里的订阅者也一样会收到。

  • 同一时间只有一条媒体扩展信息在传输,多次调用sendMediaExtensionMsg,新调用的数据会覆盖前一次的数据。

接收SEI

检测环境

接收SEI的端也需要检测环境是否支持SEI,不支持时请勿开启。

// 静态方法
const result = AliRtcEngine.isSupported();
if (!result.detail.isSendMediaExtensionMsgSupported) {
  console.log('Your browser does not support sei.');
}

接收SEI

启用其能力会增加客户端性能开销,如需接收SEI,需要在加入频道之前调用setEnableMediaExtensionMsg

// 前提:需要先创建引擎实例
// 监听事件 mediaExtensionMsgReceived
aliRtcEngine.on('mediaExtensionMsgReceived', (remoteUserId, data, payloadType) => {
  console.log(`用户 ${remoteUserId} 发送了 payloadType 为 ${payloadType} 的 SEI,内容为`, data);
});