媒体补充增强信息(SEI)
提示
RTCLib SDK 从 5.3.0 版本开始正式支持媒体补充增强信息(SEI)。
在音视频流媒体应用中,可以使用 SEI 将文本信息与音视频内容打包在一起,从推流端推出,并从拉流端接收,以此实现文本数据与音视频内容的精准同步。
SEI 技术常用于以下应用场景:
- 视频画面精准布局:传输布局参数,确保画面排列准确
- 远端歌词同步:实现歌词与音频的精确同步显示
- 直播答题:传输题目信息,确保答题时机准确
- 实时弹幕:传输弹幕内容,实现与视频内容的同步显示
实现流程
实现 SEI 功能需要以下三个步骤:
- 开启 SEI 开关:加入房间后,调用
setEnableSEI方法开启发送 SEI 的能力。 - 发送 SEI 数据:通过
sendSEI方法发送自定义的 SEI 数据。 - 接收 SEI 数据:通过相应的代理方法接收房间内的 SEI 数据。
开启 SEI 功能
RTCLib SDK 支持在加入房间后动态开启或关闭 发送 SEI 的能力。该方法支持在发布流前后调用。
接口原型
Objective C
- (void)setEnableSEI:(BOOL)enable
completion:(void (^)(BOOL isSuccess, RCRTCCode errCode))completion;
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
enable | BOOL | 是 | 是否开启 SEI 功能。YES 为开启,NO 为关闭。 |
completion | (void (^)(BOOL isSuccess, RCRTCCode errCode)) | 否 | 操作完成的回调。isSuccess 表示是否成功,errCode 为错误码。 |
代码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>
// 加入房间后,开启 SEI 功能
[self.room.localUser setEnableSEI:YES completion:^(BOOL isSuccess, RCRTCCode errCode) {
}];
使用限制
- 会议模式:所有参会用户均可以发流,因此都可以开启 SEI 功能。
- 直播模式:只有主播角色用户可以发流和开启 SEI 功能。观众角色调用该 API 会返回对应的错误码。
发送 SEI 数据
开启 SEI 功能后,您可以通过 sendSEI 方法发送自定义的 SEI 数据。发送结果通过返回值确定,不满足发送条件会返回对应的错误码。
接口原型
Objective C
- (RCRTCCode)sendSEI:(NSString *)SEI;
参数说明
| 参数 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
SEI | NSString * | 是 | 要发送的 SEI 数据。数据长度限制为 4096 字节。 |
返回值
| 类型 | 说明 |
|---|---|
RCRTCCode | 发送结果。RCRTCCodeSuccess 表示成功,其他值表示失败。 |
代 码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>
// 发送自定义 SEI 数据
NSString *seiData = @"{\"type\":\"lyric\",\"content\":\"歌词内容\",\"timestamp\":1234567890}";
RCRTCCode result = [self.room.localUser sendSEI:seiData];
if (result == RCRTCCodeSuccess) {
NSLog(@"SEI 数据发送成功");
} else {
NSLog(@"SEI 数据发送失败,错误码: %ld", (long)result);
}
发送频率限制
- 频率限制:建议 1 秒钟不要超过 30 次发送。
- 数据长度:SEI 数据长度限制为 4096 字节。
- 网络考虑:考虑到网络问题可能导致 SEI 数据帧丢失,可以在频率限制范围内适当重复发送重要的 SEI 信息。
接收 SEI 数据
订阅房间内的流后,您可以通过不同的代理方法接收各种场景下的 SEI 数据。
接收房间内用户的 SEI 数据
通过实现 RCRTCRoomEventDelegate 的 didReceiveSEI:userId: 方法,可以接收当前房间内其他用户发送的 SEI 数据。
适用场景
- 会议模式:接收指定参会用户的 SEI 数据
- 直播模式:主播角色用户之间进行连麦时,接收其他主播用户的 SEI 数据
接口原型
Objective C
- (void)didReceiveSEI:(NSString *)SEI userId:(NSString *)userId;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
SEI | NSString * | 接收到的 SEI 数据。 |
userId | NSString * | 发送 SEI 数据的用户 ID。 |
代码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>
// 设置房间事件代理
self.room.delegate = self;
#pragma mark - RCRTCRoomEventDelegate
- (void)didReceiveSEI:(NSString *)SEI userId:(NSString *)userId {
NSLog(@"接收到用户 %@ 的 SEI 数据: %@", userId, SEI);
}
接收直播合流的 SEI 数据
在直播模式下,观众通常订阅合流,可以通过 didReceiveLiveStreamSEI: 方法接收合流的 SEI 内容。
接口原型
Objective C
- (void)didReceiveLiveStreamSEI:(NSString *)SEI;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
SEI | NSString * | 接收到的合流 SEI 数据。 |
代码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>
#pragma mark - RCRTCRoomEventDelegate
- (void)didReceiveLiveStreamSEI:(NSString *)SEI {
NSLog(@"接收到合流 SEI 数据: %@", SEI);
}
合流 SEI 数据类型
didReceiveLiveStreamSEI 会接收两种类型的数据:
- 主播发送的 SEI 数据:由房间内主播通过
sendSEI方法发送的自定义数据 - MCU 服务器信息:融云 MCU 服务器主动发送的合流布局信息, 格式为
{"mcuRoomState":"xxx"}
接收跨房间连麦的 SEI 数据
在直播模式下,支持跨房间连麦。通过实现 RCRTCOtherRoomEventDelegate 的 room:didReceiveSEI:userId: 方法,可以接收副房间内用户发送的 SEI 数据。
接口原型
Objective C
- (void)room:(RCRTCBaseRoom *)room didReceiveSEI:(NSString *)SEI userId:(NSString *)userId;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
room | RCRTCBaseRoom * | 事件所在的房间对象。 |
SEI | NSString * | 接收到的 SEI 数据。 |
userId | NSString * | 发送 SEI 数据的用户 ID。 |
代码示例
Objective C
#import <RongRTCLib/RongRTCLib.h>
// 设置副房间事件代 理
self.room.otherRoomDelegate = self;
#pragma mark - RCRTCOtherRoomEventDelegate
- (void)room:(RCRTCBaseRoom *)room didReceiveSEI:(NSString *)SEI userId:(NSString *)userId {
NSLog(@"接收到副房间 %@ 中用户 %@ 的 SEI 数据: %@", room.roomId, userId, SEI);
}
接收 CDN 流的 SEI 信息
如果您的观众端使用 RCRTCMediaPlayer 直接播放 CDN 流,请参考媒体播放器相关文档了解如何接收 CDN 流中的 SEI 信息。