跳到主要内容

媒体补充增强信息(SEI)

提示

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

在音视频流媒体应用中,可以使用 SEI 将文本信息与音视频内容打包在一起,从推流端推出,并从拉流端接收,以此实现文本数据与音视频内容的精准同步。

SEI 技术常用于以下应用场景:

  • 视频画面精准布局:传输布局参数,确保画面排列准确
  • 远端歌词同步:实现歌词与音频的精确同步显示
  • 直播答题:传输题目信息,确保答题时机准确
  • 实时弹幕:传输弹幕内容,实现与视频内容的同步显示

实现流程

实现 SEI 功能需要以下三个步骤:

  1. 开启 SEI 开关:加入房间后,调用 setEnableSEI 方法开启发送 SEI 的能力。
  2. 发送 SEI 数据:通过 sendSEI 方法发送自定义的 SEI 数据。
  3. 接收 SEI 数据:通过相应的代理方法接收房间内的 SEI 数据。

开启 SEI 功能

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

接口原型

Objective C
- (void)setEnableSEI:(BOOL)enable 
completion:(void (^)(BOOL isSuccess, RCRTCCode errCode))completion;

参数说明

参数类型是否必填说明
enableBOOL是否开启 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;

参数说明

参数类型是否必填说明
SEINSString *要发送的 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 数据

通过实现 RCRTCRoomEventDelegatedidReceiveSEI:userId: 方法,可以接收当前房间内其他用户发送的 SEI 数据。

适用场景

  • 会议模式:接收指定参会用户的 SEI 数据
  • 直播模式:主播角色用户之间进行连麦时,接收其他主播用户的 SEI 数据

接口原型

Objective C
- (void)didReceiveSEI:(NSString *)SEI userId:(NSString *)userId;

参数说明

参数类型说明
SEINSString *接收到的 SEI 数据。
userIdNSString *发送 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;

参数说明

参数类型说明
SEINSString *接收到的合流 SEI 数据。

代码示例

Objective C
#import <RongRTCLib/RongRTCLib.h>

#pragma mark - RCRTCRoomEventDelegate

- (void)didReceiveLiveStreamSEI:(NSString *)SEI {
NSLog(@"接收到合流 SEI 数据: %@", SEI);

}
合流 SEI 数据类型

didReceiveLiveStreamSEI 会接收两种类型的数据:

  1. 主播发送的 SEI 数据:由房间内主播通过 sendSEI 方法发送的自定义数据
  2. MCU 服务器信息:融云 MCU 服务器主动发送的合流布局信息,格式为 {"mcuRoomState":"xxx"}

接收跨房间连麦的 SEI 数据

在直播模式下,支持跨房间连麦。通过实现 RCRTCOtherRoomEventDelegateroom:didReceiveSEI:userId: 方法,可以接收副房间内用户发送的 SEI 数据。

接口原型

Objective C
- (void)room:(RCRTCBaseRoom *)room didReceiveSEI:(NSString *)SEI userId:(NSString *)userId;

参数说明

参数类型说明
roomRCRTCBaseRoom *事件所在的房间对象。
SEINSString *接收到的 SEI 数据。
userIdNSString *发送 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 信息。