媒体补充增强信息(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;