通话过程控制

本章节介绍音视频通话过程中网易云提供的各种控制功能。包括点对点通话的控制多人会议的控制通用控制点对点通话的控制包括发送通话控制信息、设置静音、切换通话模式等 多人会议的控制包括改变自己在会议中的角色(互动者/观众) 通用控制包括是否接收某用户的音频或视频数据、设置扬声器等

点对点通话的控制

切换通话模式

双方通话建立之后,就可以发起音视频切换请求,音视频切换使用发送控制命令接口进行实现。发送音频到视频的切换请求,对方需要同意才能切换成功;发送视频到音频的切换请求,对方默认同意,自动切换。

    /**
     * 音频切换到视频
     */
    byte SWITCH_AUDIO_TO_VIDEO = IAVChatService.ControlCommand.AUDIO_TO_VIDEO;
    /**
     * 视频切换到音频
     */
    byte SWITCH_VIDEO_TO_AUDIO = IAVChatService.ControlCommand.VIDEO_TO_AUDIO;
发送命令的参数值 说明
SWITCH_AUDIO_TO_VIDEO 视频切换到音频。
SWITCH_VIDEO_TO_AUDIO 音频切换到视频。
// 请求音频切换到视频
AVChatManager.getInstance().sendControlCommand(avChatData.getChatId(), AVChatControlCommand.SWITCH_AUDIO_TO_VIDEO, new AVChatCallback<Void>() { ...});

// 请求视频切换到音频
AVChatManager.getInstance().sendControlCommand(avChatData.getChatId(), AVChatControlCommand.SWITCH_VIDEO_TO_AUDIO, new AVChatCallback<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
    //关闭视频
    AVChatManager.getInstance().stopVideoPreview();
    AVChatManager.getInstance().disableVideo();
    ...
    }
    @Override
    public void onFailed(int code) {

    }
    @Override
    public void onException(Throwable exception) {

    }
});

切换通话模式请求的回应

一方发送音视频切换请求之后,对方会收到通知,见监听通话控制通知 。当收到对方音频切换到视频的请求时,用户可以选择同意或者拒绝。对方将收到应答结果的通知,见监听通话控制通知

    /**
     * 同意从音频切换到视频
     */
    byte SWITCH_AUDIO_TO_VIDEO_AGREE = IAVChatService.ControlCommand.AGREE_AUDIO_TO_VIDEO;
    /**
     * 拒绝从音频切换到视频
     */
    byte SWITCH_AUDIO_TO_VIDEO_REJECT = IAVChatService.ControlCommand.REJECT_AUDIO_TO_VIDEO;
发送命令的参数值 说明
SWITCH_AUDIO_TO_VIDEO_AGREE 同意从音频切换到视频。
SWITCH_AUDIO_TO_VIDEO_REJECT 拒绝从音频切换到视频。
// 同意音频切换到视频
AVChatManager.getInstance().sendControlCommand(avChatData.getChatId(), AVChatControlCommand.SWITCH_AUDIO_TO_VIDEO_AGREE, new AVChatCallback<Void>() {
    @Override
    public void onSuccess(Void aVoid) {
    // 切换操作
    // 打开视频
    AVChatManager.getInstance().enableVideo();
    AVChatManager.getInstance().startVideoPreview();
    // 是否在发送视频 即摄像头是否开启
    if (AVChatManager.getInstance().isLocalVideoMuted()) {
        AVChatManager.getInstance().muteLocalVideo(false);
        ...
    }
    ...
    }
    @Override
    public void onFailed(int code) {

    }
    @Override
    public void onException(Throwable exception) {

    }
});

// 拒绝音频切换到视频
AVChatManager.getInstance().sendControlCommand(avChatData.getChatId(), AVChatControlCommand.SWITCH_AUDIO_TO_VIDEO_REJECT, new AVChatCallback<Void>() { ...});

多人通话的控制

改变自己在会议中的角色

多人模式下用户角色设定是通过setParameters或者setParameter接口进行设置的,参数名称在AVChatParameters中的KEY_SESSION_MULTI_MODE_USER_ROLE。在普通模式下,允许发送和接收数据。当切换到观众模式时,自己仅接收数据,不再发送数据。

    /**
     * 多人模式下用户角色设定。
     *
     * 普通模式下,允许发送和接收数据。当切换到观众模式时,自己仅接收数据,不再发送数据。
     * @see AVChatUserRole#AUDIENCE
     * @see AVChatUserRole#NORMAL
     */
    public static final Key<Integer> KEY_SESSION_MULTI_MODE_USER_ROLE = new Key<>(RtcParameters.KEY_SESSION_MULTI_MODE_USER_ROLE, Integer.class);
参数 说明
value 角色,参考AVChatUserRole,AUDIENCE是观众模式,NORMAL是普通模式。
AVChatManager.getInstance().setParameter(AVChatParameters.KEY_SESSION_MULTI_MODE_USER_ROLE, AVChatUserRole.NORMAL);

通用控制

发送通话控制信息

通话时发送控制命令,在通话控制通知中处理对方发来的不同的命令。

    /**
     * 通用信令消息发送
     *
     * 在通话过程中, 你可以发送信令消息通知到房间内的其他用户。
     * 当用户注册了 {@link AVChatManagerLite#observeControlNotification(Observer, boolean)} 监听器后都会
     * 收到你发送的信令消息。
     *
     * SDK内部定义了一些通用信令,参考 {@link AVChatControlCommand}, 通过这些信令能够实现 正忙发送, 音视频通话模式切换等常用功能。
     * 如果你需要实现属于自己的信令, 可以在 {@link AVChatControlCommand#NOTIFY_CUSTOM_BASE} 基础上去定义自己的信令。
     *
     * 信令的发送和接收仅仅是消息的透传, 它不会影响SDK内部任何逻辑。如果你需要对接收到的指令进行响应, 请调用相关其他引擎接口。
     *
     * @param chatId         会话ID
     * @param controlCommand 控制命令值
     * @param callback       回调函数
     *
     * @see AVChatControlCommand
     */
    public abstract void sendControlCommand(long chatId,
                                            byte controlCommand,
                                            AVChatCallback<Void> callback);
参数 说明
chatId 会话ID。
controlCommand 控制命令值。
callback 回调函数。
AVChatManager.getInstance().sendControlCommand(chatId, controlCommand, new AVChatCallback<Void>() { ... });

收到通话控制信息回调

注册/注销网络通话控制消息的监听,在此监听中可以根据收到的收到通话控制信息回调做对应的处理。

    /**
     * 注册/注销网络通话控制消息(音视频模式切换通知)
     *
     * 会话相关的控制指令通知,用户可以自定义私有的控制指令。
     *
     * @param observer 观察者, 参数为接收到的网络通话控制消息
     * @param register {@code true} 注册监听,{@code false} 注销监听
     */
    public abstract void observeControlNotification(Observer<AVChatControlEvent> observer, boolean register);
参数 说明
observer 观察者。
register 是否注册监听。
 /**
  * 注册/注销网络通话控制消息(音视频模式切换通知和其他用户自定义控制指令通知)
  */
AVChatManager.getInstance().observeControlNotification(callControlObserver, register);
Observer<AVChatControlEvent> callControlObserver = new Observer<AVChatControlEvent>() {
    @Override
    public void onEvent(AVChatControlEvent netCallControlNotification) {
       handleCallControl(netCallControlNotification);
    }
};
    private void handleCallControl(AVChatControlEvent event) {
        switch (event.getControlCommand()) {
            case SWITCH_AUDIO_TO_VIDEO:
                // 对方请求切换音频到视频
                break;
            case SWITCH_AUDIO_TO_VIDEO_AGREE:
                // 对方同意切换音频到视频
                // 切换操作
                // 打开视频
                AVChatManager.getInstance().enableVideo();
                AVChatManager.getInstance().startVideoPreview();
                // 是否在发送视频 即摄像头是否开启
                if (AVChatManager.getInstance().isLocalVideoMuted()) {
                    AVChatManager.getInstance().muteLocalVideo(false);
                    ...
                }
                ...
                break;
            case SWITCH_AUDIO_TO_VIDEO_REJECT:
                // 对方拒绝切换音频到视频
                break;
            case SWITCH_VIDEO_TO_AUDIO:
                // 对方请求视频切换到音频
                //关闭视频
                AVChatManager.getInstance().stopVideoPreview();
                AVChatManager.getInstance().disableVideo();
                ...
                break;
            case NOTIFY_VIDEO_OFF:
                // 对方关闭视频的通知
                break;
            case NOTIFY_VIDEO_ON:
                // 对方开启视频的通知
                break;
            default:
                break;
        }
    }

设置静音

设置静音是设置本地音频,也不发送本地音频数据。

    /**
     * 开/关本地音频.
     *
     * @param muted {@code true} 静音本地语音,{@code false} 取消本地语音静音
     */
    public abstract void muteLocalAudio(boolean muted);
参数 说明
account 用户账号。
muted true 静音;false 取消静音。
//关闭语音发送.
 AVChatManager.getInstance().muteLocalAudio(true);

设置视频

设置本地视频流的发送

    /**
     * 开/关本地视频流的发送.
     *
     * @param muted {@code true} 不发送本地视频流,{@code false} 发送本地视频流
     */
    public abstract void muteLocalVideo(boolean muted);
参数 说明
account 用户账号。
muted true 不发送;false 发送数据据。
 // 关闭摄像头
 AVChatManager.getInstance().muteLocalVideo(true);

指定某用户设置是否对其静音

设置是否允许播放远端用户语音流数据。

   /**
     * 设置是否允许播放远端用户数据.
     *
     * @param account 用户账号
     * @param muted   {@code true} 不解码播放远端语音流,{@code false} 解码播放远端语音流
     */
    public abstract void muteRemoteAudio(String account, boolean muted);
参数 说明
account 用户账号。
muted true 不解码语音流数据;false 解码语音流数据。
 // 不解码播放远端语音流
 AVChatManager.getInstance().muteRemoteAudio(account, true);

指定某用户设置是否接收其视频

设置是否允许播放远端用户视频流数据。

    /**
     * 设置是否允许播放远端用户数据.
     *
     * @param account 用户账号
     * @param muted   {@code true} 不解码绘制远端视频流,{@code false} 解码绘制远端视频流
     */
    public abstract void muteRemoteVideo(String account, boolean muted);
参数 说明
account 用户账号。
muted true 不解码视频流数据;false 解码视频流数据。
 //不解码绘制远端视频流
 AVChatManager.getInstance().muteRemoteVideo(account, true);

设置扬声器

设置是否使用扬声器。

    /**
     * 是否使用扬声器
     *
     * @param enable {@code true} 打开扬声器,{@code false} 关闭扬声器
     */
    public abstract void setSpeaker(boolean enable);
参数 说明
enable 是否打开扬声器。
boolean speakerMode = true;
AVChatManager.getInstance().setSpeaker(speakerMode = !speakerMode);

获取麦克风状态

检查麦克风是否静音。

    /**
     * 检查麦克风是否静音
     *
     * @return 麦克风是否静音
     */
    public abstract boolean isMicrophoneMute();
boolean isMute = AVChatManager.getInstance().isMicrophoneMute();

设置麦克风静音

设置麦克风是否静音。

    /**
     * 设置麦克风是否静音
     *
     * @param mute 麦克风是否静音
     */
    public abstract void setMicrophoneMute(boolean mute);
参数 说明
mute 麦克风是否静音。
boolean mute = true;
AVChatManager.getInstance(). setMicrophoneMute(mute = ! mute);