# 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();