Tutorial: 开关摄像头和麦克风

开关摄像头和麦克风

功能说明

本文主要介绍如何在通话过程中动态地开关摄像头及麦克风,以及如何获取远端用户麦克风、摄像头的开关状态。

动态开关摄像头、麦克风

如下几个方案有各自的优点,您可以根据项目需求自行选择。

在下述的三个方案中,如下表现是一致的:

  • 在关闭/开启摄像头后,房间内其他用户会收到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();