跳转至

接口说明

一 业务流程说明

场景 1 单一主播

  1. 主播端首先调用 RongRTCEnginejoinRoom 接口创建一个直播类型房间。
  2. 创建直播类型房间成功后,调用 RongRTCRoompublishDefaultLiveAVStream 接口发布音视频资源。
  3. 音视频资源发布成功后会返回一个 RongRTCLiveInfo 对象,对象中包含了直播地址 liveUrl 等信息,将以上信息上传到自己的 APPServer,至此主播已创建好一个直播间等待观众端的加入。
  4. APPServer 在收到上传的直播信息后保存并刷新直播列表。
  5. 通过由 APPServer 拿到的直播地址和直播类型,调用 RongRTCEnginesubscribeLiveAVStream 接口开始观看直播。

  6. 观众端停止观看直播并退出,调用 RongRTCEngineunsubscribeLiveAVStream 接口取消观看直播,并调用 RongIMClientquitChatRoom 接口退出聊天室。

  7. 主播端停止发布并退出,调用 RongRTCEngineleaveRoom 接口取消发布并退出直播房间,并调用RongIMClientquitChatRoom 接口退出聊天室。

场景 2 观众连麦

  1. 参照场景 1 的前 3 步实现 主播端可以创建一个主播间,并发布资源;观众端可以订阅直播资源;
  2. 连麦前还需要主播端进行创建 IM 聊天室:主播端调用 RongIMClientjoinChatRoom 接口创建 IM 聊天室。 获取 IM 聊天室房间 Id(如果聊天室房间 ID 和直播房间 RoomId 为同一个则可以忽略)后上传到自己的APPServer
  3. 观众端通过 APPServer 拿到直播信息后,首先调用 RongIMClientjoinChatRoom 接口加入到由主播创建的 IM 聊天室。
  4. 主播端需要连麦操作时,应先通过自己的 APPServer 获取当前聊天室内所有用户的列表,获取指定上麦用户的 ID,并构建一条连麦的自定义消息,调用 RongIMClientsendMessage 接口将自定义消息发送给对应的用户。
  5. 对端用户收到连麦的自定义消息后,应先调用 RongRTCEngineunsubscribeLiveAVStream 接口取消观看直播。
  6. 取消观看直播后,调用 RongRTCEnginejoinRoom 接口加入到直播房间升级为主播。
  7. 升级为主播后,调用 RongRTCRoompublishDefaultLiveAVStream 接口发布音视频资源,如果需要观看其他主播端音视频资源流,调用 RongRTCRoomsubscribeAVStream 接口来订阅观看。
  8. 主播端如果想要执行取消连麦操作,先获取指定取消连麦用户的 ID,并构建一条取消连麦的自定义消息,调用RongIMClientsendMessage 接口将自定义消息发送给对应的用户。
  9. 对端用户收到取消连麦的自定义消息后,应调用 RongRTCEngineleaveRoom 接口取消发布并退出直播房间。
  10. 如果取消连麦后,用户还需要继续观看直播,则可以调用 RongRTCEnginesubscribeLiveAVStream 接口来观看直播。

二 接口说明

主播端

1.创建直播间
/**
 加入房间,可配置加入房间场景。

 @param roomId 房间 Id(支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式 最长 64 个字符)
 @param config 加入房间的配置,主要用于配置直播场景。
 @param completion 加入房间回调,其中,room 对象中的 remoteUsers ,存储当前房间中的所有人,包括发布资源和没有发布资源的人。
 */
-(void)joinRoom:(NSString *)roomId config:(RongRoomConfig *)config completion:(nullable void (^)( RongRTCRoom  * _Nullable room,RongRTCCode code))completion;

RongRTCRoomConfig 用于配置当前直播类型,该类含有两个枚举:RoomTypeLiveType

RoomType 用于配置当前是正常音视频模式还是直播模式,其中NORMAL表示正常音视频模式(默认),LIVE表示直播模式。

LiveType 用于配置当前直播类型为纯音频模式还是音视频模式(只有RoomType值为LIVE时这个枚举值才会有意义),其中AUDIO_VIDEO表示音视频模式(默认),AUDIO表示纯音频模式。

示例代码:


 RongRTCRoomConfig *config = [[RongRTCRoomConfig alloc] init];
    config.roomType = RongRTCRoomTypeLive;
    config.liveType = RongRTCLiveTypeAudio;
    [[RongRTCEngine sharedEngine] joinRoom:@"123" config:config completion:^(RongRTCRoom * _Nullable room, RongRTCCode code) {

    }];

2.发布资源

/**
 发布主播默认音视频流,此接口仅直播模式的主播可用,即 RongRTCRoomType 为 RongRTCRoomTypeLive 可用。

 @param completion 发布完成回调
 */
- (void)publishDefaultLiveAVStream:(RongRTCLiveOperationCallback)completion;

如果为直播模式,调用接口之后,completion 会返回一个 RongRTCLiveInfo 对象,该对象中会有当前直播的直播地址 liveUrl ,可以存储到自己的 app server , 观众端拿着这个地址就可以观看该主播的直播。

示例代码:

[self.room publishDefaultLiveAVStream:^(BOOL isSuccess, RongRTCCode desc, RongRTCLiveInfo * _Nullable liveInfo) {
        // 将直播地址上传到 appserver
        NSString *url = liveInfo.liveUrl;
    }];
3.取消发布资源

取消发布资源,接口统一:

/**
 取消发布默认音视频流

 @param comletion 取消发布完成回调
 */
- (void)unpublishDefaultAVStream:(RongRTCOperationCallback)comletion;
4.退出房间
/**
 离开房间(注:离开房间时不需要调用取消资源发布和关闭摄像头,SDK 内部会做好取消发布和关闭摄像头资源释放逻辑)

 @param roomId 房间 Id
 @param completion 加入房间回调
 */
-(void)leaveRoom:(NSString*)roomId
      completion:(void (^) (BOOL isSuccess , RongRTCCode code))completion;

观众端

1.观看直播
/**
仅直播模式可用, 作为观众,直接观看主播的直播,无需加入房间,通过传入主播的 url,仅观众端可用。

@param url 主播直播的 url
@param liveType 当前直播类型
@param handler  动作的回调,会依次回调主播的 RongRTCLiveAVInputStream ,根据 streamType 区分是音频流还是视频流,如主播发布了音视频流,此回调会回调两次,分别为音频的 RongRTCLiveAVInputStream , 和视频的 RongRTCLiveAVInputStream 。
*/
- (void)subscribeLiveAVStream:(NSString *)url liveType:(RongRTCLiveType)liveType handler:(nullable RongRTCLiveCallback)handler;

观众端调用此接口,传入上面主播返回的 liveUrl,就可以观看直播,如果是观众身份,该接口可调用多次,如,先观看 A 的直播,调用此接口,再观看 B,更换 url 即可

示例代码:


 [[RongRTCEngine sharedEngine] subscribeLiveAVStream:kLoginManager.liveUrl liveType:RongRTCLiveTypeAudioVideo handler:^(RongRTCCode desc, RongRTCLiveAVInputStream * _Nullable inputStream) {
                if (inputStream.streamType == RTCMediaTypeVideo) {

                    RongRTCRemoteVideoView *view = [[RongRTCRemoteVideoView alloc] initWithFrame:self.localView.bounds];
                    [self.localView addSubview:view];
                    view.fillMode = RCVideoFillModeAspect;
                    [inputStream setVideoRender:view];

                }

            }];
2.停止观看直播

/**
 仅直播模式可用,作为观众,退出观看主播的直播,仅观众端使用。
 @param url 主播直播的 url,如果为空,则为最后一次 `subscribeLiveAVStream` 接口传入的 url
 @param completion 动作的回调
*/
-(void)unsubscribeLiveAVStream:(nullable NSString *)url completion:(void (^)(BOOL isSuccess , RongRTCCode code))completion;

调用此接口就可以退出观众身份,如果从观众切换到主播身份,必须调用此接口,退出观看

3.获取当前客户端全局唯一 ID (需要给使用场景,放在哪 待定)
/**
当前客户端全局唯一的 ID。

*/
- (NSString *)getClientId;
4.观众上麦
// 先退出观众身份
    [[RongRTCEngine sharedEngine] unsubscribeLiveAVStream:@"直播url" completion:^(BOOL isSuccess, RongRTCCode code) {
        // 上麦
        RongRTCRoomConfig *config = [[RongRTCRoomConfig alloc] init];
        config.roomType = RongRTCRoomTypeLive;
        config.liveType = RongRTCLiveTypeAudio;
        [[RongRTCEngine sharedEngine] joinRoom:@"123" config:config completion:^(RongRTCRoom * _Nullable room, RongRTCCode code) {

        }];
    }];
5.观众下麦
    //退出房间
   [[RongRTCEngine sharedEngine] leaveRoom:@"123" completion:^(BOOL isSuccess, RongRTCCode code) {

    }];

合流布局

合流布局的功能主要是定义直播间连麦后合流视频的布局方式,您可以根据自身业务需求来定义多个连麦者的画面的布局样式。

接口调用时机可以在主播加入房间后的任意时刻。使用自定义布局时需要在房间有人加入和退出时分别调用,以便合流视频中的画面按照您app设计规则展示;

看一下布局的类,是一个数据结构,其实可以理解为几个json的嵌套,最外层的 RongRTCMixConfig 是总的配置类,可以理解为最外层的大 json ,然后这个配置类里面可以配置合流整体的输出样式和直播连麦者视图的布局样式,分别对应 mediaConfigcustomLayouts,其中有个 layoutMode 为设置当前布局类型,是个枚举


/**
 合流服务版本,不支持修改。
 */
@property(nonatomic,assign,readonly) int version;

/**
 合流模式,1: 自定义布局    2:悬浮布局  3:自适应布局

 模式 2 和 3 时不需要设置 用户的 customLayoutList
 */
@property(nonatomic,assign) RongRTCMixLayoutMode layoutMode;

/**
 layoutMode 为 2 或者 3 时可用,作用将此 userId 的视图设置为悬浮布局的背景或自适应布局的左上角
 */
@property(nonatomic , copy)NSString *hostUserId;

,紧接着看 mediaConfig;可以设置合流整体的音频参数和视频参数,可以设置合流整体视频尺寸,码率等


/**
 合流整体的配置,包括音频和视频
 */
@property (nonatomic,strong) RongRTCMediaConfig *mediaConfig;

/**
 视频配置
 */
@property(nonatomic , strong)RongRTCVideoConfig *videoConfig;

/**
 音频配置
 */
@property(nonatomic , strong)RongRTCAudioConfig *audioConfig;

在选在自定义布局时,需要通过 customLayouts 设置每个连麦者的视图位置和大小,并且保证这些人的视图能在合流整体视频中放的下。


/**
 自定义各个连麦者子视图的位置和大小
 */
@property (nonatomic,strong) NSMutableArray <RongRTCCustomLayout *> *customLayouts;

/**
 要混流的流所属 userId
 */
@property (nonatomic,copy) NSString *userId;

/**
 混流图层坐标的 y 值
 */
@property (nonatomic,assign) int y;

/**
 混流图层坐标的 x 值
 */
@property (nonatomic,assign) int x;

/**
 视频流的宽
 */
@property (nonatomic,assign) int width;

/**
 视频流的高
 */
@property (nonatomic,assign) int height;

示例代码

- (RongRTCMixConfig *)setOutputConfig:(RCCRLiveLayoutModel *)model{

	 // 布局配置类
    RongRTCMixConfig *streamConfig = [[RongRTCMixConfig alloc] init];

    // 设置布局类型为自定义布局
    streamConfig.layoutMode = RongRTCMixLayoutModeCustom;

    // 设置合流视频参数 :宽:300 ,高:300 ,视频帧率 30, 视频码率 500;
    streamConfig.mediaConfig.videoConfig.videoLayout.width = 300;
    streamConfig.mediaConfig.videoConfig.videoLayout.height = 300;
    streamConfig.mediaConfig.videoConfig.videoLayout.fps = 30;
    streamConfig.mediaConfig.videoConfig.videoLayout.bitrate = 500;

    // 音频配置
    streamConfig.mediaConfig.audioConfig.bitrate = 300;

    // 设置是否裁剪
    streamConfig.mediaConfig.videoConfig.videoExtend.renderMode = 1;

    // 如果是自定义布局需要设置下面这些
    RongRTCCustomLayout *inputConfig = [[RongRTCCustomLayout alloc] init];

    inputConfig.userId = @"user1";
    inputConfig.x = 70;
    inputConfig.y = 20;
    inputConfig.width = 130;
    inputConfig.height = 80;
    [streamConfig.customLayouts addObject:inputConfig];

    inputConfig.userId = @"user2";
    inputConfig.x = 20;
    inputConfig.y = 100;
    inputConfig.width = 120;
    inputConfig.height = 150;
    [streamConfig.customLayouts addObject:inputConfig];

    inputConfig.userId = @"user3";
    inputConfig.x = 160;
    inputConfig.y = 100;
    inputConfig.width = 120;
    inputConfig.height = 150;
    [streamConfig.customLayouts addObject:inputConfig];

}
当上面设置好合流配置之后,需要调用合流布局的接口,就可以实现布局了。

示例代码


 [self.liveInfo setMixStreamConfig:streamConfig completion:^(BOOL isSuccess, RongRTCCode code) {
    NSLog(@"setconfig code:%@",@(code));
 }];