音视频设备测试

最近更新时间:2022-09-20 05:17:40

功能描述

在进行视频通话之前,建议先进行摄像头和麦克风等设备的测试,避免因为设备异常而影响实时通讯的体验。

注意:
由于浏览器安全策略的限制,获取音视频设备列表、采集音视频轨道只能在 localhost127.0.0.1 或者安全的 HTTPS 环境下操作。

获取可用的设备列表

APIAPI 说明
getDevices获取所有可用的媒体输入/输出设备,比如麦克风、摄像头、耳机等。
getCameras获取所有可用的视频输入设备,比如摄像头、视频采集卡。
getMicrophones获取所有可用的音频输入设备,比如麦克风。
getPlaybackDevices获取所有可用的音频输出设备,比如扬声器、耳机等。

示例代码:

// 获取所有音视频设备
ArRTC.getDevices()
  .then(devices => {
    // 音频输入设备
    const audioDevices = devices.filter(function(device){
      return device.kind === "audioinput";
    });
    // 视频输入设备
    const videoDevices = devices.filter(function(device){
      return device.kind === "videoinput";
    });
    // 音频输出设备
    const playbackDevices = devices.filter(function(device){
      return device.kind === "audiooutput";
    });
    console.log("可用的麦克风:", audioDevices);
    console.log("可用的摄像头:", videoDevices);
    console.log("可用的扬声器:", playbackDevices);
  });

监听设备热拔插

SDK 提供了三个全局设备状态变化的事件回调:

全局事件回调说明
onCameraChanged监听视频输入设备的状态变化,例如:USB 摄像头的插入或移除。
onMicrophoneChanged监听音频输入设备的状态变化,例如:麦克风的插入或移除。
onPlaybackDeviceChanged监听音频输出设备的状态变化,例如:音响或者耳机的插入或移除。

通过这些事件的回调,可以实现:

  • 实时更新可用的设备列表,规避采集不存在的设备而导致异常的情况。
  • 在会议过程中,如果当前采集的设备被拔出或者意外损坏,导致音视频通讯无法正常进行,我们可以通过以下两种方法来修复:
    • 方法1: 音视频设备切换
    • 方法2: 将已发布的轨道取消发布并释放,同时采集其他可用设备的音视频数据并发布来替换异常的轨道,从而保证音视频通讯的正常进行。
// 摄像头列表
let currentCameras = [];

ArRTC.onCameraChanged = async (changedDevice) => {
  // 插入设备时,更新摄像头列表。
  if (changedDevice.state === "ACTIVE") {
    currentCameras.push(changedDevice);
  } else if (changedDevice.device.label === cameraTrack.getTrackLabel()) { // 拔出设备为当前设备时,切换到一个已有的设备。
    if (currentCameras[0]) {
      cameraTrack.setDevice(currentCameras[0].deviceId);
      // 同时更新摄像头列表
      ...
    }
  }
}

测试音视频采集设备

参考以下步骤采集麦克风和摄像头:

  1. 调用 ArRTC.getDevices 获取可用设备列表。
  2. 在调用 ArRTC.createCameraVideoTrackArRTC.createMicrophoneAudioTrack 创建本地音视频轨道对象时,传入 cameraIdmicrophoneId 指定音视频输入/输出设备。
  3. 测试采集到的音视频轨道是否正常:
    • 音频轨道,调用 MicrophoneAudioTrack.getVolumeLevel 获取音量,音量大于 0 说明麦克风正常。
    • 视频轨道,调用 CameraVideoTrack.play(<ELEMENT_ID_IN_DOM>) 预览本地视频轨道,看到画面说明摄像头正常。
  4. 重复步骤2、3,直到所有设备都测试到。
// 获取所有音视频设备
ArRTC.getDevices()
  .then(devices => {
    // 音频输入设备
    const audioDevices = devices.filter(function(device){
      return device.kind === "audioinput";
    });
    // 视频输入设备
    const videoDevices = devices.filter(function(device){
      return device.kind === "videoinput";
    });
    // 音频输出设备
    const playbackDevices = devices.filter(function(device){
      return device.kind === "audiooutput";
    });

    // 根据设备情况采集音视频轨道
    if (audioDevices.length > 0 && videoDevices.length > 0) { // 有摄像头和麦克风设备
      var selectedMicrophoneId = audioDevices[0].deviceId;
      var selectedCameraId = videoDevices[0].deviceId;
      return ArRTC.createMicrophoneAndCameraTracks(
        {
          microphoneId: selectedMicrophoneId
        },
        {
          cameraId: selectedCameraId
        }
      );
    } else if (videoDevices.length > 0) { // 仅有摄像头设备
      var selectedCameraId = videoDevices[0].deviceId;
      return [ArRTC.createCameraVideoTrack({ cameraId: selectedCameraId }), null];
    } else if (audioDevices.length > 0) {  // 仅有麦克风设备
      var selectedMicrophoneId = audioDevices[0].deviceId;
      return [null, ArRTC.createMicrophoneVideoTrack({ microphoneId: selectedMicrophoneId })];
    } else { // 无摄像头和麦克风设备
      throw new Error("异常: 无音视频输入/输出设备");
    }
  })
  .then([videoTrack, audioTrack] => {
    if (videoTrack) {
      // 开始预览
      videoTrack.play("<ELEMENT_ID_IN_DOM>");
    }
    if (audioTrack) {
      // 测试音频是否有声音,或者通过 `audioTrack.play()` 测试是否可以听到声音
      setInterval(() => {
        const level = audioTrack.getVolumeLevel();
        console.log("local stream audio level", level);
      }, 100);
    }
  });

建议将音量大小的变化和摄像头画面绘制在页面上,方便用户更直观的判断设备是否正常工作。

测试音频播放设备

Web SDK 不提供 API 校验音频播放设备是否正常工作。产品(用户场景)可以引导用户通过以下方法测试音频播放设备:

  • 使用 HTML5 的 <audio> 标签在页面上创建一个音频播放器,让用户播放在线音频文件并确认是否有声音。
  • 采集完麦克风后,调用 MicrophoneAudioTrack.play 来播放麦克风声音,让用户主观确认是否可以听到麦克风声音。

测试过程中必须要确保用户没有关闭扬声器。

音视频设备切换

创建本地音视频轨道成功之后,可以通过 CameraVideoTrack.setDeviceMicrophoneAudioTrack.setDevice 动态切换采集的音视频设备。

示例代码中的 videoTrack 是指通过 ArRTC.createCameraVideoTrack 创建的本地视频轨道对象。

ArRTC.createCameraVideoTrack()
  .then(videoTrack => {
    // 切换摄像头。
    videoTrack.setDevice("<NEW_DEVICE_ID>").then(() => {
      console.log("set device success");
    });
  }).catch(e => {
    console.log("createCameraVideoTrack or videoTrack.setDevice set device error", e);
  });

注意:

  • 该方法对已发布的轨道同样有效。
  • 该方法在部分移动设备上不生效。

API 参考

开发注意事项

设备 ID 是随机生成的,部分情况下同一个设备的 ID 可能会改变,因此我们建议每次测试设备时都先调用 ArRTC.getDevices 获取设备 ID。