通话过程控制
更新时间: 2024/08/23 10:24:52
本章节介绍音视频通话过程中网易云信提供的各种控制功能。包括点对点通话的控制、多人会议的控制和通用控制。 点对点通话的控制包括发送通话控制信息、设置静音、切换通话模式等 多人会议的控制包括改变自己在会议中的角色(互动者/观众) 通用控制包括是否接收某用户的音频或视频数据、设置扬声器等
点对点通话的控制
切换通话模式
- API介绍
双方通话建立之后,就可以发起音视频切换请求,音视频切换使用发送控制命令接口进行实现。发送音频到视频的切换请求,对方需要同意才能切换成功;发送视频到音频的切换请求,对方默认同意,自动切换。
- API原型
java /**
* 音频切换到视频
*/
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 | 音频切换到视频。 |
- 示例
java// 请求音频切换到视频
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) {
}
});
切换通话模式请求的回应
- API介绍
一方发送音视频切换请求之后,对方会收到通知,见监听通话控制通知 。当收到对方音频切换到视频的请求时,用户可以选择同意或者拒绝。对方将收到应答结果的通知,见监听通话控制通知 。
- API原型
java /**
* 同意从音频切换到视频
*/
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 | 拒绝从音频切换到视频。 |
- 示例
java// 同意音频切换到视频
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>() { ...});
多人通话的控制
改变自己在会议中的角色
- API介绍
多人模式下用户角色设定是通过setParameters或者setParameter接口进行设置的,参数名称在AVChatParameters中的KEY_SESSION_MULTI_MODE_USER_ROLE
。在普通模式下,允许发送和接收数据。当切换到观众模式时,自己仅接收数据,不再发送数据。
- API原型
java /**
* 多人模式下用户角色设定。
*
* 普通模式下,允许发送和接收数据。当切换到观众模式时,自己仅接收数据,不再发送数据。
* @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 是普通模式。 |
- 示例
javaAVChatManager.getInstance().setParameter(AVChatParameters.KEY_SESSION_MULTI_MODE_USER_ROLE, AVChatUserRole.NORMAL);
通用控制
发送通话控制信息
- API介绍
通话时发送控制命令,在通话控制通知中处理对方发来的不同的命令。
- API原型
java /**
* 通用信令消息发送
*
* 在通话过程中, 你可以发送信令消息通知到房间内的其他用户。
* 当用户注册了 {@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 | 回调函数。 |
- 示例
javaAVChatManager.getInstance().sendControlCommand(chatId, controlCommand, new AVChatCallback<Void>() { ... });
收到通话控制信息回调
- API介绍
注册/注销网络通话控制消息的监听,在此监听中可以根据收到的收到通话控制信息回调做对应的处理。
- API原型
java /**
* 注册/注销网络通话控制消息(音视频模式切换通知)
*
* 会话相关的控制指令通知,用户可以自定义私有的控制指令。
*
* @param observer 观察者, 参数为接收到的网络通话控制消息
* @param register {@code true} 注册监听,{@code false} 注销监听
*/
public abstract void observeControlNotification(Observer<AVChatControlEvent> observer, boolean register);
- 参数说明
参数 | 说明 |
---|---|
observer | 观察者。 |
register | 是否注册监听。 |
- 示例
java /**
* 注册/注销网络通话控制消息(音视频模式切换通知和其他用户自定义控制指令通知)
*/
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;
}
}
设置静音
- API介绍
设置静音是设置本地音频,也不发送本地音频数据。
- API原型
java /**
* 开/关本地音频.
*
* @param muted {@code true} 静音本地语音,{@code false} 取消本地语音静音
*/
public abstract void muteLocalAudio(boolean muted);
- 参数说明
参数 | 说明 |
---|---|
account | 用户账号。 |
muted | true 静音;false 取消静音。 |
- 示例
java//关闭语音发送.
AVChatManager.getInstance().muteLocalAudio(true);
设置视频
- API介绍
设置本地视频流的发送
- API原型
java /**
* 开/关本地视频流的发送.
*
* @param muted {@code true} 不发送本地视频流,{@code false} 发送本地视频流
*/
public abstract void muteLocalVideo(boolean muted);
- 参数说明
参数 | 说明 |
---|---|
account | 用户账号。 |
muted | true 不发送;false 发送数据据。 |
- 示例
java // 关闭摄像头
AVChatManager.getInstance().muteLocalVideo(true);
指定某用户设置是否对其静音
- API介绍
设置是否允许播放远端用户语音流数据。
- API原型
java /**
* 设置是否允许播放远端用户数据.
*
* @param account 用户账号
* @param muted {@code true} 不解码播放远端语音流,{@code false} 解码播放远端语音流
*/
public abstract void muteRemoteAudio(String account, boolean muted);
- 参数说明
参数 | 说明 |
---|---|
account | 用户账号。 |
muted | true 不解码语音流数据;false 解码语音流数据。 |
- 示例
java // 不解码播放远端语音流
AVChatManager.getInstance().muteRemoteAudio(account, true);
指定某用户设置是否接收其视频
- API介绍
设置是否允许播放远端用户视频流数据。
- API原型
java /**
* 设置是否允许播放远端用户数据.
*
* @param account 用户账号
* @param muted {@code true} 不解码绘制远端视频流,{@code false} 解码绘制远端视频流
*/
public abstract void muteRemoteVideo(String account, boolean muted);
- 参数说明
参数 | 说明 |
---|---|
account | 用户账号。 |
muted | true 不解码视频流数据;false 解码视频流数据。 |
- 示例
java //不解码绘制远端视频流
AVChatManager.getInstance().muteRemoteVideo(account, true);
设置扬声器
- API介绍
设置是否使用扬声器。
- API原型
java /**
* 是否使用扬声器
*
* @param enable {@code true} 打开扬声器,{@code false} 关闭扬声器
*/
public abstract void setSpeaker(boolean enable);
- 参数说明
参数 | 说明 |
---|---|
enable | 是否打开扬声器。 |
- 示例
javaboolean speakerMode = true;
AVChatManager.getInstance().setSpeaker(speakerMode = !speakerMode);
设置音频输出设备
- API介绍
设置音频输出设备
- API原型
java /**
* 设置音频输出设备
* 可选设备列表来自此回调 {@link AVChatStateObserverLite#onAudioDeviceChanged}
*
* @param audioDevice {@link com.netease.nimlib.sdk.avchat.constant.AVChatAudioDevice}
*/
public abstract void selectAudioDevice(int audioDevice);
- 参数说明
参数 | 说明 |
---|---|
int | 音频输出设备id,具体类型参考AVChatAudioDevice。 |
- 示例
javaAVChatManager.getInstance(). selectAudioDevice(AVChatAudioDevice.SPEAKER_PHONE);
获取麦克风状态
- API介绍
检查麦克风是否静音。
- API原型
java /**
* 检查麦克风是否静音
*
* @return 麦克风是否静音
*/
public abstract boolean isMicrophoneMute();
- 示例
javaboolean isMute = AVChatManager.getInstance().isMicrophoneMute();
设置麦克风静音
- API介绍
设置麦克风是否静音。
- API原型
java /**
* 设置麦克风是否静音
*
* @param mute 麦克风是否静音
*/
public abstract void setMicrophoneMute(boolean mute);
- 参数说明
参数 | 说明 |
---|---|
mute | 麦克风是否静音。 |
- 示例
javaboolean mute = true;
AVChatManager.getInstance(). setMicrophoneMute(mute = ! mute);
此文档是否对你有帮助?