跳转至

接口说明

一 业务流程

场景 1 单一主播

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

  6. 观众端停止观看直播并退出,调用 RongRTCEngine#unsubscribeLiveAVStream 接口退出聊天室。

  7. 主播端停止发布并退出,调用 RongRTCEngine#quitRoom 接口退出聊天室。

场景 2 观众连麦

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

二 接口

主播端

1.创建直播间
/**
     * 加入房间,可配置加入房间场景
     * @param roomId 房间 Id(支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式 最长 64 个字符)
     * @param roomConfig  加入房间的配置信息,主要用于配置直播场景。
     * @param joinRoomUICallBack 加入房间回调,其中,RongRTCRoom 对象中的 getRemoteUsers() ,存储当前房间中的所有人,包括发布资源和没有发布资源的人。
     */
    public void joinRoom(String roomId, RongRTCRoomConfig roomConfig, JoinRoomUICallBack joinRoomUICallBack)

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

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

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

示例代码:

RongRTCRoomConfig config = new RongRTCRoomConfig.Builder()
          .setRoomType(RongRTCRoomConfig.RoomType.LIVE) //设置房间类型为直播模式
          .setLiveType(RongRTCRoomConfig.LiveType.AUDIO_VIDEO) //设置直播模式为音视频模式
          .build();
RongRTCEngine.getInstance().joinRoom(roomId,config, new JoinRoomUICallBack() {...}
2.发布资源
/**
     * 发布主播默认音视频流,此接口仅直播模式的主播可用,即 RoomType 为 LIVE 时可用。
     *
     * @param callBack 发布结果回调
     */
    public void publishDefaultLiveAVStream(RongRTCDataResultCallBack<RongRTCLiveInfo> callBack)

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

示例代码:

localUser.publishDefaultLiveAVStream(new RongRTCDataResultCallBack<RongRTCLiveInfo>() {
            @Override
            public void onSuccess(RongRTCLiveInfo room) {
                //TODO 将liveUrl上传到app server
                .....
  }
3.取消发布资源

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

/**
     * 取消发布音视频流
     *
     * @param stream   要取消发布的音视频流
     * @param callback 取消发布结果回调
     */
    public void unpublishAVStream(RongRTCAVOutputStream stream, RongRTCResultUICallBack callback)
4.退出房间
/**
     * 离开房间
     *
     * @param roomId   房间 id
     * @param callback 离开房间结果回调
     */
    @Override
    public void quitRoom(String roomId, RongRTCResultUICallBack callback)

观众端

1.观看直播

    /**
     * 仅直播模式可用, 作为观众,直接观看主播的直播,无需加入房间,通过传入主播的 url,仅观众端可用
     *
     * @param liveUrl   直播URL
     * @param callBack 加入直播房间结果回调
     * @param liveType 要观看直播的类型
     */
    @Override
    public void subscribeLiveAVStream(String liveUrl, LiveType liveType,JoinLiveUICallBack callBack)

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

示例代码:

  RongRTCEngine.getInstance()
                .subscribeLiveAVStream(liveUrl,RongRTCRoomConfig.LiveType.AUDIO_VIDEO, new JoinLiveUICallBack() {
                            @Override
                            public void onUiSuccess() {
                                //TODO 订阅成功
                            }

                            @Override
                            public void onUiFailed(RTCErrorCode rtcErrorCode) {
                                //TODO 订阅失败
                            }

                            @Override
                            public void onUiVideoStreamReceived(RongRTCLiveAVInputStream rongRTCLiveAVInputStream) {
                                //TODO 收到主播端的视频流进行展示
                                //创建RongRTCVideoView
                                RongRTCVideoView remoteView = RongRTCEngine.getInstance().createVideoView(RoomInfoActivity.this);
                                //将RongRTCVideoView添加到自己的Layout容器中
                                mLayoutContainer.addView(remoteView, new RongRTCUser(mInfo.getPubUserId(), null), "live");
                                //将RongRTCVideoView对象和RongRTCLiveAVInputStream对象绑定
                rongRTCLiveAVInputStream.setRongRTCVideoView(remoteView);
                            }

                            @Override
                            public void onUiAudioStreamReceived(RongRTCLiveAVInputStream rongRTCLiveAVInputStream) {
                                //TODO 收到主播端的音频流
                            }
                        });
2.停止观看直播
 /**
     * 仅直播模式可用,作为观众,退出观看主播的直播,仅观众端使用。
     * @param liveUrl 直播URL
     * @param callBack 离开直播间结果回调
     */
    @Override
    public void unsubscribeLiveAVStream(String liveUrl, RongRTCResultUICallBack callBack)

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

3.获取客户端全局唯一 ID
/**
     * 当前客户端全局唯一 ID
     * @return
     */
    public String getClientId()
4.观众上麦
    //观众端取消订阅
    RongRTCEngine.getInstance()
                .unsubscribeLiveAVStream(liveUrl, new RongRTCResultUICallBack() {
                    @Override
                    public void onUiSuccess() {
                        //配置房间模式为直播模式
                        RongRTCRoomConfig config = new  RongRTCRoomConfig.Builder()
                                .setRoomType(RongRTCRoomConfig.RoomType.LIVE) //设置房间类型为直播类型
                                .build();
                        //加入房间,开始连麦
                        RongRTCEngine.getInstance()
                                .joinRoom(roomId,config, new JoinRoomUICallBack() {

                                    @Override
                                    protected void onUiSuccess(RongRTCRoom rongRTCRoom) {
                                      //TODO 加入房间成功,参考主播端的第二步发布资源流程即可实现连麦功能  
                                    }

                                    @Override
                                    protected void onUiFailed(RTCErrorCode rtcErrorCode) {
                                     //加入房间失败
                                    }
                                });
                    }
                    @Override
                    public void onUiFailed(RTCErrorCode rtcErrorCode) {

                    }
                });
5.观众下麦
    //退出房间
    RongRTCEngine.getInstance()
                .quitRoom(roomId, new RongRTCResultUICallBack() {
                    @Override
                    public void onUiSuccess() {
                        //TODO 下麦成功后,如果需要继续观看可以参照第一步重新订阅观看直播即可
                    }

                    @Override
                    public void onUiFailed(RTCErrorCode rtcErrorCode) {
                        FinLog.log(TAG,"quitRoom Faild: "+rtcErrorCode);
                    }
                });

合流布局设置

		/**
     * 合流布局设置
     * @param mixConfig
     * @param callBack
     */
    public void setMixConfig(RongRTCMixConfig mixConfig, final RongRTCResultUICallBack callBack){...}
    //代码示例
    RongRTCMixConfig mixConfig = createMixConfig();
    mLiveInfo.setMixConfig(mixConfig, new RongRTCResultUICallBack() {...}

RongRTCMixConfig 合流布局设置参数

	  private MixLayoutMode mode = MixLayoutMode.SUSPENSION;	// 合流布局模式 1: 自定义布局    2:悬浮布局  3:自适应布局
    private String hostUserId;   // 用来做背景画布的主播UserID,注意:只有当布局模式为2或3时,此参数才会有效
    private MediaConfig mediaConfig; //合流布局输出参数配置
    private List<CustomLayout> customLayouts;	// 自定义视频合流布局配置参数,注意: 只有当布局模式为1时,此参数才会有效

MixLayoutMode 合流布局模式枚举

CUSTOM(1),   //自定义
SUSPENSION(2),   //悬浮
ADAPTIVE(3);   //自适应

MediaConfig 合流布局输出配置

private VideoConfig videoConfig;	//视频输出配置
private AudioConfig audioConfig;	//音频输出配置,允许为Null

VideoConfig 视频输出配置

private VideoLayout videoLayout;	//标准视频流的输出布局参数
private VideoLayout tinyVideoLayout;//小流视频流的输出配置参数,允许为Null
private VideoExtend extend;//扩展参数

VideoLayout 视频输出布局参数

private int width;	//视频宽
private int height;	//视频高
private int fps;	//视频帧率
private int bitrate;	//视频码率

VideoExtend 视频输出扩展参数

private VideoRenderMode renderMode = VideoRenderMode.WHOLE;

VideoRenderMode 视频输出渲染模式

CROP(1),   //裁剪
WHOLE(2);   //填充

AudioConfig 音频输出配置

private int bitrate;	//音频输出码率

CustomLayout 自定义视频合流布局参数

private String userId;	//当前视频流的UserId
private int x;
private int y;
private int width;
private int height;

创建合流布局设置参数示例代码

public RongRTCMixConfig createMixConfig(RongRTCMixConfig.MixLayoutMode model,boolean isCrop,int x,int y,int width,int height List<String> remoteUserIdList){
        RongRTCMixConfig config = new RongRTCMixConfig();
        //设置合流布局模式
        config.setLayoutMode(model);
        //当做背景Video的用户Id
        config.setHostUserId(mRTCRoom.getLocalUser().getUserId());

        //合流布局输出参数配置
        RongRTCMixConfig.MediaConfig mediaConfig = new RongRTCMixConfig.MediaConfig();

        //视频输出配置
        RongRTCMixConfig.MediaConfig.VideoConfig videoConfig = new RongRTCMixConfig.MediaConfig.VideoConfig();
        //标准视频流的输出布局参数
        RongRTCMixConfig.MediaConfig.VideoConfig.VideoLayout normal = new RongRTCMixConfig.MediaConfig.VideoConfig.VideoLayout();
        RongCenterConfig rongRTCConfig = RongRTCLocalSourceManager.getInstance().getRongRTCConfig();
        int videoWidth = rongRTCConfig.getVideoWidth();
        normal.setWidth(videoWidth);
        int videoHeight = rongRTCConfig.getVideoHeight();
        normal.setHeight(videoHeight);
        normal.setFps(rongRTCConfig.getVideoFPS());
        videoConfig.setVideoLayout(normal);
        //设置渲染模式
        videoConfig.setExtend(new RongRTCMixConfig.MediaConfig.VideoConfig.VideoExtend(isCrop ? RongRTCMixConfig.VideoRenderMode.CROP : RongRTCMixConfig.VideoRenderMode.WHOLE));
        //设置视频合流布局输出参数配置
        mediaConfig.setVideoConfig(videoConfig);
        //如果音频码率没有要求可以不设置
        //mediaConfig.setAudioConfig(new RongRTCMixConfig.MediaConfig.AudioConfig(rongRTCConfig.getAudioBitRate()));
        config.setMediaConfig(mediaConfig);

        //如果非自定义合流模式,则不需要设置CustomLayoutList
        if (model != RongRTCMixConfig.MixLayoutMode.CUSTOM){
            return config;
        }
        ArrayList<RongRTCMixConfig.CustomLayoutList.CustomLayout> list = new ArrayList<>();
        //设置背景Video渲染坐标
        RongRTCMixConfig.CustomLayoutList.CustomLayout iv = new RongRTCMixConfig.CustomLayoutList.CustomLayout();
        //当做背景Video的用户Id
        iv.setUserId(mRTCRoom.getLocalUser().getUserId());
        iv.setX(0);
        iv.setY(0);
        iv.setWidth(normal.getWidth());
        iv.setHeight(normal.getHeight());
        list.add(iv);
        //其他自定义视频合流布局参数
        if (remoteUserIdList != null && !remoteUserIdList.isEmpty()){
            int i = 0;
            for (String uid : remoteUserIdList) {
                RongRTCMixConfig.CustomLayoutList.CustomLayout vb = new RongRTCMixConfig.CustomLayoutList.CustomLayout();
                vb.setUserId(uid);
                vb.setX(x);
                vb.setY(height*i);
                vb.setWidth(width);
                vb.setHeight(.height);
                list.add(vb);
                i++;
            }
        }
        //设置自定义视频合流布局参数列表
        config.setCustomLayouts(list);
        return config;
    }