互动直播接入流程

网易云通信提供简单的互动直播和连麦接口,只需要创建并加入互动房间即可以实现直播推流;连麦者使用相同的房间名加入互动房间即可以实现实时连麦互动。阅读该章节,您可以迅速完成一个最简单的互动直播房间的创建、加入,快速实现互动直播的功能。 在这里需要明确几个基本概念:

房间:互动直播房间与云通信音视频多人会议的房间概念一致,以房间名称为唯一标识。互动直播房间需要先创建成功后才能加入,当所有用户都离开房间后,可以复用该房间名重新创建。

主播:是互动直播房间的主用户,推流地址的指定者,直播的主画面源。主播需要首先加入房间。一个互动直播房间同时只能有一个主播。

连麦者:是互动直播房间的次用户,直播辅画面源,与主播加入同一房间,即能实现实时连麦互动,需要主播在房间时才能加入。

观众:互动直播中除了主播和连麦者,观看直播画面的其他用户。可以通过停止播放直播并加入互动房间转变为连麦者。

另外,理解网易云通信互动直播与音视频音视频通话的关系可以更好地帮助开发者快速集成: 互动直播与多人音视频通话:云通信互动直播基于多人音视频通话开发,通过将多人会议中用户的音视频数据处理后推送给视频流服务器实现直播和实时连麦。在功能的提供上,互动直播复用多人音视频接口,增加互动开关、推流地址指定与切换、直播角色指定等扩展设置。

互动直播房间接入

sequenceDiagram participant 主播 participant Meeting participant 连麦者 participant ... Meeting->>Meeting:创建互动直播房间 主播->>Meeting:加入互动直播房间 连麦者->>Meeting:加入互动直播房间 Meeting->>主播:用户加入房间通知 Meeting->>主播:播放本地和远端画面 Meeting->>连麦者:离开互动直播房间 Meeting->>主播:用户离开房间通知 Meeting->>Meeting:互动直播状态回调 Meeting->>Meeting:房间发生了错误

创建互动直播房间

用预订会议接口创建一个互动直播房间,该接口与音视频通话的预订会议接口相同

@protocol NIMNetCallManager <NSObject>
/**
 *  预订多人会议
 *
 *  @param meeting    预订的多人会议
 *  @param completion 预订会议结果
 */
- (void)reserveMeeting:(NIMNetCallMeeting *)meeting
            completion:(nullable NIMNetCallMeetingHandler)completion;
@end
参数 类型 说明
meeting NIMNetCallMeeting 预订的多人会议
completion nullable NIMNetCallMeetingHandler 预订会议结果
//初始化会议
NIMNetCallMeeting *meeting = [[NIMNetCallMeeting alloc] init];
//指定会议名
meeting.name = @"meetingName";
meeting.type = NIMNetCallMediaTypeVideo;
meeting.actor = YES;

//指定互动直播推流地址
NIMNetCallOption *option = [[NIMNetCallOption alloc]init];
option.bypassStreamingUrl = url;
meeting.option = option;

//预订会议  
[[NIMAVChatSDK sharedSDK].netCallManager reserveMeeting:meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
    //预订会议失败
    if (error) {
    }

    //预订会议成功
    else { 
        //加入会议
    }
 }];

互动直播混屏的说明:

1.互动直播音视频混屏模式,图文介绍

2.互动直播音视频混屏自定义布局配置,详见布局参数配置介绍,同时我们提供了一个参数校验工具,帮助开发者校验参数有效性并快速看到布局效果图。

注:参数设置请参考 option通话参数bypassStreamingMixModebypassStreamingMixCustomLayoutConfig

加入互动直播房间

房间创建成功后,主播首先使用加入会议接口进入房间

@protocol NIMNetCallManager <NSObject>
/**
 *  加入多人会议
 *
 *  @param meeting    需要加入的多人会议
 *  @param completion 加入会议结果
 *
 *  @discussion 如果需要 SDK 自动开启摄像头,需要在 meeting 中指定 option 的视频采集参数 videoCaptureParam
 */
- (void)joinMeeting:(NIMNetCallMeeting *)meeting
         completion:(nullable NIMNetCallMeetingHandler)completion;
参数 类型 说明
meeting NIMNetCallMeeting 需要加入的多人会议
completion NIMNetCallMeetingHandler 加入会议结果
//主播获取当前预定成功的meeting
NIMNetCallMeeting *meeting = [self getCurrentMeeting];

//指定 option 中的 videoCaptureParam 参数
NIMNetCallVideoCaptureParam *param = [[NIMNetCallVideoCaptureParam alloc] init];
//清晰度480P
param.preferredVideoQuality = NIMNetCallVideoQuality480pLevel;
//裁剪类型 16:9
param.videoCrop  = NIMNetCallVideoCrop16x9;
//打开初始为前置摄像头
param.startWithBackCamera = NO;
//若需要开启前处理指定 videoProcessorParam
NIMNetCallVideoProcessorParam *videoProcessorParam = [[NIMNetCallVideoProcessorParam alloc] init];
//若需要通话开始时就带有前处理效果(如美颜自然模式)
videoProcessorParam.filterType = NIMNetCallFilterTypeZiran;
param.videoProcessorParam = videoProcessorParam;


meeting.option.videoCaptureParam = param;

//加入会议
[[NIMAVChatSDK sharedSDK].netCallManager joinMeeting:_meeting completion:^(NIMNetCallMeeting * _Nonnull meeting, NSError * _Nonnull error) {
     //加入会议失败
     if (error) {
     }
     //加入会议成功
     else
     {
     }
}];

用户加入房间通知

其他用户加入会议时,会收到通知,在互动直播中可以表示连麦用户连麦成功

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  用户加入了多人会议
 *
 *  @param uid     用户 id
 *  @param meeting 用户加入的会议
 */
- (void)onUserJoined:(NSString *)uid
             meeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
uid NSString 用户 id
meeting NIMNetCallMeeting 用户加入的会议
//收到用户加入通知
- (void)onUserJoined:(NSString *)uid meeting:(NIMNetCallMeeting *)meeting
{
    //连麦成功
}

播放本地画面

本地摄像头预览就绪回调,通过此接口进行本地预览显示

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  本地摄像头预览就绪
 *
 *  @param displayView 本地摄像头预览层
 */
- (void)onLocalDisplayviewReady:(UIView *)displayView;
@end
参数 类型 说明
displayView UIView 本地摄像头预览层
- (void)onLocalDisplayviewReady:(UIView *)displayView
{
    if (self.localPreView) {
        [self.localPreView removeFromSuperview];
    }
    self.localPreView = displayView;
    displayView.frame = self.localVideoView.bounds;
    [self.localVideoView addSubview:displayView];
}

播放远端画面

当连麦者与主播进行连麦后,可以收到远端画面回调,与音视频通话中远程视频 YUV 数据就绪接口相同。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  远程视频YUV数据就绪
 *
 *  @param yuvData  远程视频YUV数据, 紧凑型 (stride 等于 width)
 *  @param width    远程视频画面宽度
 *  @param height   远程视频画面长度
 *  @param user     远程视频画面属于的用户
 *
 *  @discussion 将YUV数据直接渲染在OpenGL上比UIImageView贴图占用更少的cpu
 */
- (void)onRemoteYUVReady:(NSData *)yuvData
                   width:(NSUInteger)width
                  height:(NSUInteger)height
                    from:(NSString *)user;
@end
参数 类型 说明
yuvData NSData 远程视频YUV数据, 紧凑型 (stride 等于 width)
width NSUInteger 远程视频画面宽度
height NSUInteger 远程视频画面长度
user NSString 远程视频画面属于的用户
//远程YUV数据就绪回调
- (void) onRemoteYUVReady:(NSData *)yuvData
                   width:(NSUInteger)width
                  height:(NSUInteger)height
                    from:(NSString *)user
{
    //_remoteGLView 是 NTESGLView 类型  DEMO 提供 NTESGLView 类来渲染yuv数据  
    [_remoteGLView render:yuvData width:width height:height];
}

离开互动直播房间

主播离开互动直播房间,连麦者调用此接口表示退出连麦。

@protocol NIMNetCallManager <NSObject>
/**
 *  离开多人会议
 *
 *  @param meeting 需要离开的多人会议
 * 
 *  @discussion 当所有加入的人都离开了某会议, 该会议对应的名称才可以被重复预订
 *
 */
- (void)leaveMeeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
meeting NIMNetCallMeeting 需要离开的多人会议
//获取当前会议
NIMNetCallMeeting *meeting = [self getCurrentMeeting];

//离开当前多人会议
[[NIMAVChatSDK sharedSDK].netCallManager leaveMeeting:meeting];

用户离开房间通知

当其他用户离开会议时,用户将会收到离开通知

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  用户离开了多人会议
 *
 *  @param uid    用户 id
 *  @param meeting 用户离开的会议
 */
- (void)onUserLeft:(NSString *)uid
           meeting:(NIMNetCallMeeting *)meeting;
@end
参数 说明
uid 用户 id
meeting 用户离开的会议
//用户离开通知
- (void)onUserLeft:(NSString *)uid meeting:(NIMNetCallMeeting *)meeting
{
    //用户已退出连麦 刷新UI
}

互动直播状态回调

互动直播状态回调

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 互动直播状态回调

 @param code 互动直播状态码
 */
- (void)onBypassStreamingStatus:(NIMBypassStreamingStatus)code;
@end
参数 类型 说明
code NIMBypassStreamingStatus 互动直播状态码
- (void)onBypassStreamingStatus:(NIMBypassStreamingStatus)code
{
    switch (code) {
        case NIMBypassStreamingStatusInitial:
            NSLog(@"开始连接");
            break;

        case NIMBypassStreamingStatusConnecting:
            NSLog(@"连接中");
            break;

        case NIMBypassStreamingStatusConnectFailed:
            NSLog(@"连接失败");
            break;

         //其他情况
         ...     

        default:
            break;
    }
}

房间发生了错误

一些异常情况可能会引起会议出错,请在收到该回调以后主动离开会议。

@protocol NIMNetCallManagerDelegate <NSObject>
/**
 *  会议发生了错误
 *
 *  @param error   错误信息
 *  @param meeting 发生错误的会议
 */
- (void)onMeetingError:(NSError *)error
               meeting:(NIMNetCallMeeting *)meeting;
@end
参数 类型 说明
error NSError 错误信息
meeting NIMNetCallMeeting 发生错误的会议
//会议发生错误
- (void)onMeetingError:(NSError *)error meeting:(NIMNetCallMeeting *)meeting
{
    //互动直播发生错误 刷新UI
}