音视频设备管理

阿里云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接口,也不会启用麦克风,需要调用startAudioCaptureswitchMicrophone重新开启。

// 前提:需要先创建引擎实例
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();
});