阿里云ARTC Web SDK提供音视频设备管理功能,涉及到用户的麦克风、摄像头和扬声器等设备的选择和控制,正确管理这些设备可以确保用户能够享受到良好的通信体验。本文为您介绍音视频设备管理相关功能的示例代码。
管理视频设备
获取摄像头设备列表
开发者可以通过静态方法getCameraList
获取当前可用的摄像头列表。
// 静态方法
const cameraList = await AliRtcEngine.getCameraList();
cameraList.forEach((device) => {
console.log(`camera label: ${device.label}, deviceId: ${device.deviceId}`);
});
开关摄像头
如果不需要使用摄像头时,可以调用enableLocalVideo
接口传入false
进行停用。
摄像头停用后,调用leaveChannel
接口,再调用joinChannel
接口,也不会启用摄像头,需要调用enableLocalVideo
传入true
重新开启。
// 前提:需要先创建引擎实例
await aliRtcEngine.enableLocalVideo(false);
如果需要再次使用摄像头,可调用enableLocalVideo
传入true
重新开启。
await aliRtcEngine.enableLocalVideo(true);
切换摄像头设备
如果用户需要切换摄像头时,可以调用switchCamera
接口传入设备ID进行切换。
// 前提:需要先创建引擎实例
// 可以从摄像头列表中获取对应的设备ID
const targetCameraId = cameraList[0].deviceId;
await aliRtcEngine.switchCamera(targetCameraId);
获取当前摄像头设备
如果需要获取当前使用的摄像头设备,可以通过getCurrentMicDeviceId
获取到对应的设备ID。
// 前提:需要先创建引擎实例
// 当未使用摄像头等情况时,currentCameraId、currentCamera 会是 undefined
const currentCameraId = aliRtcEngine.getCurrentCameraDeviceId();
const currentCamera = cameraList.find((device) => device.deviceId === currentCameraId);
停止/恢复本地视频数据发送
如果不想发送本地视频数据,但不需要停止采集,可以使用muteLocalCamera
接口传入true
,将停止发送本地视频数据。如果再次需要发送本地视频数据,再次调用传入false ,即可恢复发送本地视频数据。
// 不需要发送时传入 true
aliRtcEngine.muteLocalCamera(true);
// 恢复时传入 false
aliRtcEngine.muteLocalCamera(false);
管理音频设备
获取麦克风设备列表
开发者可以通过静态方法getCameraList
获取当前可用的摄像头列表。
// 静态方法
const micList = await AliRtcEngine.getMicrophoneList();
micList.forEach((device) => {
console.log(`microphone label: ${device.label}, deviceId: ${device.deviceId}`);
});
开关麦克风
如果不需要使用麦克风时,可以调用stopAudioCapture
接口进行停用。
麦克风停用后,调用leaveChannel
接口,再调用joinChannel
接口,也不会启用麦克风,需要调用startAudioCapture
或switchMicrophone
重新开启。
// 前提:需要先创建引擎实例
aliRtcEngine.stopAudioCapture();
如果再次需要使用麦克风时,可以调用startAudioCapture
重新开启。
aliRtcEngine.startAudioCapture();
切换麦克风设备
如果用户需要切换麦克风时,可以调用switchMicrophone
接口传入设备ID进行切换。
// 前提:需要先创建引擎实例
// 可以从麦克风列表中获取对应的设备ID
const targetMicId = micList[0].deviceId;
await aliRtcEngine.switchMicrophone(targetMicId);
获取当前麦克风设备
如果需要获取当前使用的麦克风设备,可以通过getCurrentMicDeviceId
获取到对应的设备ID。
// 前提:需要先创建引擎实例
// 当未使用麦克风等情况时,currentMicId、currentMic 会是 undefined
const currentMicId = aliRtcEngine.getCurrentMicDeviceId();
const currentMic = micList.find((device) => device.deviceId === currentMicId);
停止/恢复本地音频数据发送
如果需要静音,但不需要停止采集,可以使用muteLocalMic
接口传入true
,将停止发送本地音频数据。如果需要恢复静音,再次调用传入false ,即可恢复发送本地音频数据。
// 静音时传入 true
aliRtcEngine.muteLocalMic(true);
// 恢复时传入 false
aliRtcEngine.muteLocalMic(false);
监听设备异常
如果需要处理正在输入设备被拔除等异常时,可以监听localDeviceException
事件,通过判断异常类型做对应的处理,比如切换至其他可用的输入设备。
// 从静态属性中获取异常类型枚举对象
const AliRtcEngineLocalDeviceExceptionType = AliRtcEngine.AliRtcEngineLocalDeviceExceptionType;
// 监听 localDeviceException 事件,判断异常类型做对应的处理
aliRtcEngine.on('localDeviceException', async (deciveType, exceptionType, message) => {
console.log(`Device type ${deciveType} encounters an ${exceptionType} exception, message: ${message || 'empty'}.`);
if (exceptionType === AliRtcEngineLocalDeviceExceptionType.AliEngineLocalDeviceExceptionTypeMicInterrupt) {
// 如果是麦克风被打断异常,可能是设备被拔除了,可以重新获取麦克风设备列表,切换至其他设备
const micList = await AliRtcEngine.getMicrophoneList();
aliRtcEngine.switchMicrophone(micList[0].deviceId);
} else if (exceptionType === AliRtcEngineLocalDeviceExceptionType.AliEngineLocalDeviceExceptionTypeCameraInterrupt) {
// 如果是摄像头被打断异常,可能是设备被拔除了,可以重新获取摄像头设备列表,切换至其他设备
const cameraList = await AliRtcEngine.getCameraList();
aliRtcEngine.switchCamera(cameraList[0].deviceId);
}
});
设备热插拔
开发者可以通过监听浏览器deviceChange
事件处理设备变化。
navigator.mediaDevices.addEventListener('devicechange', async() => {
// 监听到设备变化后,可以重新获取设备列表
const cameraList = await AliRtcEngine.getCameraList();
const micList = await AliRtcEngine.getMicrophoneList();
});