跳到主要内容

媒体补充增强信息(SEI)

提示

RTCLib SDK 从 5.3.0 版本正式开始支持媒体补充增强信息(SEI)。

在音视频流媒体应用中,可以使用流 SEI(Supplemental Enhancement Information,媒体补充增强信息)将文本信息与音视频内容打包在一起,从主播端(推流端)推出,并从观众端(拉流端)接收,以此实现文本数据与音视频内容的精准同步的目的。一般可用于视频画面的精准布局、远端歌词同步、直播答题等应用场景。

自 5.3.0 起,RTCLib SDK 提供了 sendSEI 方法,支持在发布音视频时添加媒体补充增强信息(SEI)。

SEI 开关

SDK 支持在加入房间后动态开启或者关闭发送 SEI 的能力。加入房间后,通过调用 RCRTCLocalUsersetEnableSEI 方法开启或者关闭发送 SEI 能力。该方法支持在发布流前后调用。

提示

会议模式下所有参会用户均可以发流,直播模式下主播角色用户可以发流。注意,直播模式下的观众角色不发布资源,因此开启发送 SEI 能力对于观众角色无效。观众角色调用该 API 后会返回对应的错误码。

// 加入房间后,通过 RCRTCRoom 对象持有的 RCRTCLocalUser 对象作为调用入口。
// 开启 SEI 能力
RCRTCEngine.getInstance()
.getRoom()
.getLocalUser()
.setEnableSEI(
true,
new IRCRTCResultDataCallback<Boolean>() {
@Override
public void onSuccess(Boolean data) {
//开启成功回调处理
}

@Override
public void onFailed(RTCErrorCode errorCode) {
//开启失败回调处理
}
});

发送 SEI 数据

用户如果在发布流数据之前已经开启 SEI 开关,可以使用 RCRTCLocalUsersendSEI 方法发送 SEI 数据。发送的结果通过返回值确定,不满足发送条件会返回对应的错误码。

提示

考虑到有可能因为网络问题导致丢失 SEI 数据帧,可以在频率限制范围内多次发送 SEI 信息。频率限制:1 秒钟不要超过 30 次。SEI 数据长度限制为 4096 字节。

//用户自定义数据
String data = "hello world";
RTCErrorCode code = RCRTCEngine.getInstance().getRoom().getLocalUser().sendSEI(data);
Log.d(TAG, "- send: code:" + code);

接收 SEI 数据

用户订阅房间内的流后,可以接收当前房间的 SEI 数据。

接收房间内其他用户的 SEI 数据

在会议模式下,订阅房间内远端用户发布的视频流之后,可以使用 IRCRTCRoomEventsListener 的方法接收当前房间的 SEI 数据。在直播模式下,如果进行同房间连麦,主播角色用户之间需要互相订阅。如果需要接收其他主播用户的 SEI 数据,可使用 IRCRTCRoomEventsListeneronReceiveSEI(String userId, String sei); 方法。

/*!
接收到远端用户发送的 SEI 通知

@param SEI sei 数据
@param userId 用户id
@discussion 监听远端用户发送的 SEI 内容,通过 userId 区分。
Added from 5.3.0

@remarks 代理
*/
public void onReceiveSEI(String userId, String sei) {
Log.d(TAG, "- onReceiveSEI: userId:" + userId + ", sei:" + sei);
}

接收直播合流的 SEI 数据

IRCRTCRoomEventsListeneronReceiveLiveStreamSEI(String sei); 方法专用于直播模式。直播模式下,观众一般订阅合流(liveStreams),因此需要接收的是接收当前直播房间中直播合流的 SEI 数据。

/*!
观众接收到合流 SEI 通知

@param SEI sei 数据
@discussion 观众角色订阅 liveStreams 后,该回调会接收以下两种类型的数据。
1.MCU server 会主动通过该接口回调主播合流布局的信息 {"mcuRoomState":"xxx"}
2.如果远端主播有发送 SEI,可以通过此回调接收数据。
Added from 5.3.0

@remarks 代理
*/
public void onReceiveLiveStreamSEI(String sei) {
Log.d(TAG, "- onReceiveLiveStreamSEI: sei:" + sei);
}

提示

onReceiveLiveStreamSEI 不仅接收远端主播发送 SEI 数据,还会接收融云 MCU 服务器发送的主播合流布局的信息,格式为:{"mcuRoomState":"xxx"}

接收副房间内远端用户的 SEI 数据

直播模式下支持跨房间连麦。如果当前房间与其他房间建立跨房间连麦,用户可以使用副房间事件代理 IRCRTCOtherRoomEventsListeneronReceiveSEI(RCRTCOtherRoom room, String userId, String sei); 方法接收指定主播用户发送的 SEI 数据。

/*!
接收到副房间内远端用户发送的 SEI 通知

@param room 事件所在房间
@param SEI sei 数据
@param userId 用户id
@discussion 监听远端用户发送的 SEI 内容,通过 userId 区分。
Added from 5.3.0

@remarks 代理
*/
public void onReceiveSEI(RCRTCOtherRoom room, String userId, String sei) {
Log.d(TAG, "- onReceiveSEI: userId:" + userId + ", sei:" + sei);
}

直播模式下接收 CDN 流的 SEI 信息

  • 如果您的观众端订阅房间内的融云 CDN 流,请参见融云 CDN 插件
  • 如果您的观众端使用 RCRTCMediaPlayer 直接播放 CDN 流,请参见 CDN 播放器