功能说明
本文主要介绍如何在通话过程中动态地开关摄像头及麦克风,以及如何获取远端用户麦克风、摄像头的开关状态。
动态开关摄像头、麦克风
如下几个方案有各自的优点,您可以根据项目需求自行选择。
在下述的三个方案中,如下表现是一致的:
- 在关闭/开启摄像头后,房间内其他用户会收到UserCallback.camera_status_notify事件。
- 在关闭/开启麦克风后,房间内其他用户会收到 UserCallback.microphone_status_notify事件。
方案一(推荐):使用 mute /unmute接口。
该方案关闭麦克风、关闭摄像头,不会停止设备采集,摄像头、麦克风“采集灯”会亮着。该方案关闭设备是“软件层面”的操作,因此其优势是重新打开设备更快速。
// 首次打开摄像头
var video = room.selfUser.getVideo(cameraId1);
video.previewAndPublish(videoElement);
// 关闭摄像头,在关闭摄像头后,摄像头预览画面会变成黑屏,您可以在此时显示业务侧自身的 UI 遮罩。
video.muteCamera();
// 打开摄像头
video.unmuteCamera();
由于麦克风启动需要一些时间,这期间可能会漏掉用户的声音,所以相比于方案二的 audio.closeMicrophone(),我们更推荐您使用该方案来实现静音和解除静音的功能。
此外,在 audio.muteMicrophone()后,会发送码率极低的静音包。
这对于需要云端录制的场景非常适用,因为 MP4 等格式的视频文件,对于音频数据的连续性要求很高,使用 audio.closeMicrophone() 会导致录制出的 MP4 文件不易播放。因此在对录制文件的质量要求较高的场景中,建议选择该方案。
// 首次打开麦克风
var audio = room.selfUseraudio;
audio.openMicrophone();
// 关闭麦克风
audio.muteMicrophone();
// 打开麦克风
audio.unmuteMicrophone();
方案二:使用 video.unpreview(), video.unpublish(), audio.closeMicrophone()方法
该方案关闭麦克风、关闭摄像头后,会停止设备采集,摄像头、麦克风“采集灯”会熄灭。在重新开启摄像头后,会重新采集摄像头。
// 关闭摄像头
video.unpreview();
video.unpublish();
// 打开摄像头
// 'local-video' 为 DOM 中用于播放本地摄像头的视频容器的 element id。
video.previewAndPublish('local-video');
// 关闭麦克风
audio.closeMicrophone();
// 打开麦克风
audio.openMicrophone();
方案三:使用video.unpublish() 参数。
该方案取消本地发布摄像头,不会停止设备采集,摄像头“采集灯”会亮着。该方案与方案二的差异点是,在取消本地发布摄像头后,本地依然能预览摄像头画面,房间内其他用户看不到本地摄像头。
// 首次打开摄像头
video.previewAndPublish('local-video');
// 取消本地发布摄像头。本地任然能预览摄像头,房间内其他用户看不到本地摄像头。
video.unpublish();
// 开启本地发布摄像头
video.publish();