合流布局
合流布局
直播合流相关接口仅针对主播可用,分为视频合流和音频合流。
视频合流布局
视频合流布局分为 3 种:自定义布局、悬浮布局 和 自适应布局,主播调用接口 publishLiveStream
或 publishDefaultLiveStreams
发布资源成功后,通过 Block 回调会返回直播合流信息接口类对象 RCRTCLiveInfo
,App 层需要缓存,以便设置合流布局使用,然后可以通过类 RCRTCMixConfig
来进行合流布局配置,再通过类 RCRTCLiveInfo
中 setMixConfig
方法进行设置。
从 5.1.1 版本(RCRTCMixConfig.version == 2)开始,RCRTCMixConfig 中新增加了 customMode
属性,功能为自定义模式开关,打开后,用户可以更加灵活的控制合流布局,建议将其设置为 YES,新版本兼容老版本逻辑,升级 SDK 不需要修改代码。
// 自定义合流布局
- (void)streamlayoutMode:(RCRTCMixLayoutMode)mode {
RCRTCMixConfig *config = [LiveMixStreamTool setOutputConfig:mode];
[self.liveInfo setMixConfig:config completion:^(BOOL isSuccess, RCRTCCode code) {
if (isSuccess) {
//dosomething
} else {
NSLog(@"%ld",(long)code);
}
}];
}
视频自定义布局
视频自定义布局可以根据 RCRTCMixConfig.customLayouts 视频流列表,设置各个连麦者视图位置及大小,根据 RCRTCMixConfig.mediaConfig.videoConfig.videoLayout 和 RCRTCMixConfig.mediaConfig.videoConfig.tinyVideoLayout,分别设置合流后视频大小流属性(大流默认值是 360 * 640,25Fps,1200 kbps;小流默认值 180 * 320,15Fps,360kbps)。
例如需要合流三个用户的视频流,合流后整体视频尺寸 宽*高 = 300 * 300,那么就是以整体视频作为画布,画布的原点(0,0)在左上角,三个用户视频窗口按照 RCRTCMixConfig.customLayouts 列表顺序,分别相对原点的位置进行绘制,整体效果如下图所示:
// 布局配置类
RCRTCMixConfig *streamConfig = [[RCRTCMixConfig alloc] init];
// 选择混流模式,自定义布局开/关效果一致
streamConfig.customMode = YES;
// 选择模式
streamConfig.layoutMode = RCRTCMixLayoutModeCustom;
// 设置合流后视频参数 :宽:300 ,高:300 ,视频帧率 20, 视频码率 500,背景色 0x778899;
streamConfig.mediaConfig.videoConfig.videoLayout.width = 300;
streamConfig.mediaConfig.videoConfig.videoLayout.height = 300;
streamConfig.mediaConfig.videoConfig.videoLayout.fps = 20;
streamConfig.mediaConfig.videoConfig.videoLayout.bitrate = 500;
[streamConfig.mediaConfig.videoConfig setBackgroundColor:0x778899];
// 设置是否裁剪
streamConfig.mediaConfig.videoConfig.videoExtend.renderMode = RCRTCVideoRenderModeCrop;
// 设置合流视频列表
// 添加本地视频流(user1)
RCRTCCustomLayout *inputConfigUser1 = [[RCRTCCustomLayout alloc] init];
inputConfigUser1.videoStream = [RCRTCEngine sharedInstance].defaultVideoStream;
// 坐标示例,具体根据自己布局设置
inputConfigUser1.x = 20;
inputConfigUser1.y = 70;
inputConfigUser1.width = 130;
inputConfigUser1.height = 80;
[streamConfig.customLayouts addObject:inputConfigUser1];
// 添加远端视频流(user2,user3),以下假设远端视频流有 2 个
NSMutableArray *remoteStreamArr = [NSMutableArray array];
NSArray<RCRTCRemoteUser *> *remoteUsers = [RCRTCEngine sharedInstance].room.remoteUsers;
for (RCRTCRemoteUser* remoteUser in remoteUsers) {
for (RCRTCInputStream *inputStream in remoteUser.remoteStreams) {
if (inputStream.mediaType == RTCMediaTypeVideo) {
[remoteStreamArr addObject:inputStream];
}
}
}
RCRTCCustomLayout *inputConfigUser2 = [[RCRTCCustomLayout alloc] init];
inputConfigUser2.videoStream = remoteStreamArr[0];
// 坐标示例,具体根据自己布局设置
inputConfigUser2.x = 20;
inputConfigUser2.y = 100;
inputConfigUser2.width = 120;
inputConfigUser2.height = 150;
[streamConfig.customLayouts addObject:inputConfigUser2];
RCRTCCustomLayout *inputConfigUser3 = [[RCRTCCustomLayout alloc] init];
inputConfigUser3.videoStream = remoteStreamArr[1];
// 坐标示例,具体根据自己布局设置
inputConfigUser3.x = 160;
inputConfigUser3.y = 100;
inputConfigUser3.width = 120;
inputConfigUser3.height = 150;
[streamConfig.customLayouts addObject:inputConfigUser3];
视频悬浮布局
视频悬浮布局混流画布采用 RCRTCMixConfig.hostVideoStream 指定的视频流作为背景视频,如果没有设置采用用户第一个发布的视频,其它视频流是按照用户发布视频流的先后顺序进行悬浮小窗绘制(RCRTCMixConfig.customMode == YES,会筛选 RCRTCMixConfig.customLayouts 列表进行绘制),当有人离开时,系统会自动按照现有发布视频流的次序重新布局。根据 RCRTCMixConfig.mediaConfig.videoConfig.videoLayout 和 RCRTCMixConfig.mediaConfig.videoConfig.tinyVideoLayout,分别设置合流后视频大小流属性(大流默认值是 360 * 640,25Fps,1200 kbps;小流默认值 180 * 320,15Fps,360kbps)。
例如需要合流自己本地视频流加上另外六个远端用户的视频流,合流后整体视频尺寸 宽*高 = 300 * 300,整体效果如下图所示:
// 布局配置类
RCRTCMixConfig *streamConfig = [[RCRTCMixConfig alloc] init];
// 选择混流模式
streamConfig.customMode = YES;
// 选择模式
streamConfig.layoutMode = RCRTCMixLayoutModeSuspension;
// 设置合流后视频参数 :宽:300 ,高:300 ,视频帧率 20, 视频码率 500,背景色 0x778899;
streamConfig.mediaConfig.videoConfig.videoLayout.width = 300;
streamConfig.mediaConfig.videoConfig.videoLayout.height = 300;
streamConfig.mediaConfig.videoConfig.videoLayout.fps = 20;
streamConfig.mediaConfig.videoConfig.videoLayout.bitrate = 500;
[streamConfig.mediaConfig.videoConfig setBackgroundColor:0x778899];
// 设置是否裁剪
streamConfig.mediaConfig.videoConfig.videoExtend.renderMode = RCRTCVideoRenderModeCrop;
// 设置合流视频列表
// 添加本地视频流(user0)
RCRTCCustomLayout *inputConfigUser0 = [[RCRTCCustomLayout alloc] init];
inputConfigUser0.videoStream = [RCRTCEngine sharedInstance].defaultVideoStream;
[streamConfig.customLayouts addObject:inputConfigUser0];
// 添加远端视频流(user2,user3,user4,user5,user6),以下假设远端视频流有6个
NSArray<RCRTCRemoteUser *> *remoteUsers = [RCRTCEngine sharedInstance].room.remoteUsers;
for (RCRTCRemoteUser* remoteUser in remoteUsers) {
for (RCRTCInputStream *inputStream in remoteUser.remoteStreams) {
if (inputStream.mediaType == RTCMediaTypeVideo) {
RCRTCCustomLayout *inputConfig = [[RCRTCCustomLayout alloc] init];
inputConfig.videoStream = inputStream;
[streamConfig.customLayouts addObject: inputConfig];
}
}
}