多人音视频通话

本章节介绍多人实时音视频通话的相关功能。多人实时音视频通话顾名思义是支持多个人同时进行实时音视频通话,可以选择纯音频模式,或音视频模式。在这里需要明确几个概念:

多人音视频通话流程

sequenceDiagram 管理员->>房间: 创建房间(createRoom) 管理员/用户->>管理员/用户: 注册音视频模块监听(observeAVChatState) 管理员/用户->>房间: 加入房间(joinRoom2) 管理员/用户->>管理员/用户: 进行各种音视频操作 房间->>管理员/用户: 离开房间(leaveRoom2)

创建房间

通过一个房间名 roomName 来创建多人会话房间。

可以传入一个扩展字段 extraMessage。 后续加入房间的用户会收到这个扩展字段。

如果需要兼容 Web 端音视频可以设置字段 webRTCCompatWebRTC从版本4.5.0开始正式商用,如果没有WebRTC客户端参与时不要设置WebRTC相关参数


    /**
     * 创建多人通话房间
     *
     * 如果你需要使用多人会议和互动直播相关功能, 需要通过此接口创建一个多人房间,
     * 然后通过 {@link AVChatManagerLite#joinRoom2(String, AVChatType, AVChatCallback)} 来加入房间。
     * 房间创建成功后会一直保留, 尽量即时使用, 目前有效期为一个月, 超过有效期后再次加入房间会失败。
     * 如果一个房间已经被创建, 那么再次创建时会返回失败, 提示房间已经存在。</p>
     *
     * 房间创建时机不受音视频通话流程限制, 你可以在任意时间预定自己的多人会议房间。创建成功后即可通知所有会议参与者加入此房间,
     * 你将会在 {@link AVChatStateObserverLite#onUserJoined(String)} 中陆续收到不同的用户加入会议。
     *
     * @param roomName     房间名
     * @param extraMessage 自定义的扩展消息, 其它加入房间的用户都会收到
     * @param callback     创建房间回调接口
     * @see AVChatResCode#ERROR_CREATE_ROOM_ALREADY_EXIST
     * @see AVChatManagerLite#createRoom(String, String, boolean, AVChatCallback)
     * @see AVChatManagerLite#joinRoom2(String, AVChatType, AVChatCallback)
     * @see AVChatManagerLite#leaveRoom2(String, AVChatCallback)
     */
    public abstract void createRoom(String roomName,
                                    String extraMessage,
                                    AVChatCallback<AVChatChannelInfo> callback);
参数 说明
roomName 房间名。
extraMessage 自定义的扩展消息, 其它加入房间的用户都会收到。
callback 创建房间回调接口,参考AVChatChannelInfo
AVChatManager.getInstance().createRoom(roomName, extraMessage, new AVChatCallback<AVChatChannelInfo>() {});

AVChatManager.getInstance().createRoom(roomName, extraMessage, webRTCCompat, new AVChatCallback<AVChatChannelInfo>() {});

加入房间

graph TB B[enableRtc] --> C[setChannelProfile 可选 用于设置音频场景模式 ] C --> D[enableVideo 视频通话需要 ] D --> E[setupVideoCapturer 视频通话需要 ] E --> F[setupLocalVideoRender 视频通话需要 ] F --> G[setParameter/setParameters 可选 用于设置参数 ] G --> H[startVideoPreview 视频通话需要 ] H --> I[joinRoom2]

通过一个房间名 roomName 来加入一个已经创建好的多人会话房间。

加入房间时需要指定自己的会话类型 AVChatType。 主要为音频通话和视频通话两种。

加入房间前需要进行和双人通话流程中类似的开启音视频引擎、设置通话可选参数、视频通话设置等初始化设置。

其中,enableRtcenableVideosetupVideoCapturersetupLocalVideoRendersetParameter详见主叫发起通话请求节,设置音频场景模式(可选)setChannelProfile详见音频场景模式节;设置打开预览startVideoPreview详见开始和停止视频采集节。

    /**
     * 加入已经预先创建的多人会议房间
     *
     * 加入一个多人会议房间前需要调用以下接口:
     *
     *     开启音视频引擎  {@link AVChatManagerLite#enableRtc()}
     *     可选, 激活视频模块 {@link AVChatManagerLite#enableVideo()}
     *     可选, 设置本地预览画布,{@link AVChatManagerLite#setupLocalVideoRender(IVideoRender, boolean, int)}
     *     可选, 开启视频预览,{@link AVChatManagerLite#startVideoPreview()}
     *     可选, 通话相关参数设置 {@link AVChatManagerLite#setParameters(AVChatParameters)}
     *
     * 当你成功加入会议后, 你会收到 {@link AVChatStateObserverLite#onUserJoined(String)} 来通知目前会议室内已经存在的用户。
     * 在离开房间时需要调用 {@link AVChatManagerLite#leaveRoom2(String, AVChatCallback)}。
     *
     * 多人会议的加入其他用户是不会收到信令层的通知,只能通过媒体层的通知来获取用户加入 {@link AVChatStateObserverLite#onUserJoined(String)}。
     *
     * 如果你的产品加入多人会议是为了进行互动直播, 那么你还需要额外设置以下参数 {@link AVChatManagerLite#setParameter(AVChatParameters.Key, Object)}:
     *     打开互动直播模式, {@link AVChatParameters#KEY_SESSION_LIVE_MODE}
     *     如果你是主播, 还需要设置推流地址 {@link AVChatParameters#KEY_SESSION_LIVE_URL}
     *
     * @param roomName 房间名
     * @param callType 房间通话类型
     * @param callback 加入房间回调接口
     *
     * @see AVChatManagerLite#createRoom(String, String, AVChatCallback)
     * @see AVChatManagerLite#createRoom(String, String, boolean, AVChatCallback)
     * @see AVChatManagerLite#leaveRoom2(String, AVChatCallback)
     */
    public abstract void joinRoom2(String roomName,
                                   final AVChatType callType,
                                   AVChatCallback<AVChatData> callback);
参数 说明
roomName 房间名。
callType 房间通话类型,UNKNOWN未知,AUDIO音频通话,VIDEO视频通话。 参考AVChatType
callback 加入房间回调接口, AVChatCallback 参考AVChatCallback,AVChatData 参考AVChatData
//开启音视频引擎
AVChatManager.getInstance().enableRtc();
//设置场景, 如果需要高清音乐场景,设置 AVChatChannelProfile#CHANNEL_PROFILE_HIGH_QUALITY_MUSIC
AVChatManager.getInstance.setChannelProfile(CHANNEL_PROFILE_DEFAULT);
//设置通话可选参数
AVChatParameters parameters = new AVChatParameters();
AVChatManager.getInstance().setParameters(parameters);
//视频通话设置
AVChatManager.getInstance().enableVideo();
AVChatManager.getInstance().setupLocalVideoRender(IVideoRender render, boolean mirror, int scalingType);
//设置视频采集模块
AVChatCameraCapturer videoCapturer = AVChatVideoCapturerFactory.createCameraCapturer();
AVChatManager.getInstance().setupVideoCapturer(videoCapturer);
//设置视频质量调整策略
AVChatManager.getInstance().setVideoQualityStrategy(boolean preferImageQuality);
//开启视频预览
AVChatManager.getInstance().startVideoPreview();
//加入房间
AVChatManager.getInstance().joinRoom2(roomName, callType, new AVChatCallback<AVChatData>() {});

注意: (1)超时挂断请在APP上层实现,sdk未来会移除超时相关接口,可以参考demo中的AVChatTimeoutObserver类进行实现。 (2)在通话时可以根据需要设置与取消画布,示例如下:

        //取消用户的画布
        AVChatManager.getInstance().setupLocalVideoRender(null, false, 0);

        AVChatManager.getInstance().setupRemoteVideoRender(user, null, false, 0);

        //设置用户的画布
        AVChatManager.getInstance().setupLocalVideoRender(render1, false, AVChatVideoScalingType.SCALE_ASPECT_BALANCED);

        AVChatManager.getInstance().setupRemoteVideoRender(user, render2, false, AVChatVideoScalingType.SCALE_ASPECT_BALANCED);

离开房间

graph TB B[stopVideoPreview 视频通话需要] --> C[disableVideo 视频通话需要] C --> D[leaveRoom2 ] D --> E[disableRtc]

通过一个房间名 roomName 来离开一个已经加入的多人会话房间。

    /**
     * 离开加入的多人会议房间
     *
     * 此接口仅仅是离开多人会话房间,如果需要销毁引擎释放资源需要调用以下接口:
     *
     *     可选, 关闭视频预览 {@link AVChatManagerLite#stopVideoPreview()} ()}
     *     可选, 关闭视频模块 {@link AVChatManagerLite#disableVideo()}}
     *     释放通话资源 {@link AVChatManagerLite#disableRtc()}
     *
     * 多人会议的离开其他用户是不会收到信令层的通知,只能通过媒体层的通知来获取用户离开 {@link AVChatStateObserverLite#onUserLeave(String, int)}。
     *
     *
     * @param roomName 房间名
     * @param callback 离开房间的回调接口
     *
     * @see AVChatManagerLite#createRoom(String, String, AVChatCallback)
     * @see AVChatManagerLite#createRoom(String, String, boolean, AVChatCallback)
     * @see AVChatManagerLite#joinRoom2(String, AVChatType, AVChatCallback)
     *
     */
    public abstract void leaveRoom2(String roomName,
                                    AVChatCallback<Void> callback);
参数 说明
roomName 房间名。
callback 离开房间回调接口,AVChatCallback 参考AVChatCallback
//关闭视频预览
AVChatManager.getInstance().stopVideoPreview();
// 如果是视频通话,关闭视频模块
AVChatManager.getInstance().disableVideo();
//离开房间
AVChatManager.getInstance().leaveRoom2(roomName, new AVChatCallback<Void>() {});
//关闭音视频引擎
AVChatManager.getInstance().disableRtc();