跳到主要内容

媒体补充增强信息(SEI)

提示

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

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

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

SEI 开关

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

提示

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

// 加入房间后,通过 RCRTCRoom 对象持有的 RCRTCLocalUser 对象作为调用入口。
// 开启 SEI 能力
[self.room.localUser setEnableSEI:YES completion:^(BOOL isSuccess, RCRTCCode errCode) {
NSLog(@"isSuccess:%@, errCode:%@",@(isSuccess),@(errCode));
}];

发送 SEI 数据

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

提示

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

//用户自定义数据
NSString *seiJson = @"xxx";
RCRTCCode result = [self.room.localUser sendSEI:seiJson];
if (result != RCRTCCodeSuccess) {
NSLog(@"发送失败:%@",@(code));
}

接收 SEI 数据

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

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

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

#pragma mark - RCRTCRoomEventDelegate
/*!
接收到远端用户发送的 SEI 通知

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

@remarks 代理
*/
- (void)didReceiveSEI:(NSString *)SEI userId:(NSString *)userId {
NSLog(@"userId:%@ didReceiveSEI:%@", userId, SEI);
}
  • didReceiveSEI:userId 接收当前房间中指定用户发送的 SEI 数据。会议模式下,需要接收指定参会用户的 SEI 数据。直播模式下,主播角色用户之间如果进行连麦,则需要互相订阅,此时需要接收其他主播用户的 SEI 数据。
  • didReceiveLiveStreamSEI (直播模式专用)接收当前直播房间中直播合流的 SEI 数据。直播模式下,观众一般订阅合流,因此需要接收的是合流的 SEI 内容。

直播模式下支持跨房间连麦。如果当前房间与其他房间连麦,用户可以使用 RCRTCOtherRoomEventDelegate 的以下方法接收指定主播用户发送的 SEI 数据。

  • room:didReceiveSEI:userId (直播模式专用)接收当前直播房间中或跨房间连麦副房间中指定主播角色用户发布的 SEI 数据。

接收直播合流的 SEI 数据

直播场景下,观众身份的用户一般订阅合流(liveStreams),可以通过 RCRTCRoomEventDelegatedidReceiveLiveStreamSEI 方法接收合流的 SEI 内容。如果多个远端主播发送 SEI,可以通过此回调统一接收数据。

接收直播合流的 SEI 数据

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

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

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

@remarks 代理
*/
- (void)didReceiveLiveStreamSEI:(NSString *)SEI {
NSLog(@"liveStreamSEI:%@", SEI);
}

提示

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

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

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

#pragma mark - RCRTCOtherRoomEventDelegate

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

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

@remarks 代理
*/
- (void)room:(RCRTCBaseRoom *)room didReceiveSEI:(NSString *)SEI userId:(NSString *)userId {
NSLog(@"room:%@ userId:%@ didReceiveSEI:%@",room, userId, SEI);
}

接收 CDN 流的 SEI 信息

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