功能描述
在进行视频通话之前,建议先进行摄像头和麦克风等设备的测试,避免因为设备异常而影响实时通讯的体验。
注意:
由于浏览器安全策略的限制,获取音视频设备列表、采集音视频轨道只能在 localhost
、 127.0.0.1
或者安全的 HTTPS
环境下操作。
获取可用的设备列表
API | API 说明 |
---|---|
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);
// 同时更新摄像头列表
...
}
}
}
测试音视频采集设备
参考以下步骤采集麦克风和摄像头:
- 调用
ArRTC.getDevices
获取可用设备列表。 - 在调用
ArRTC.createCameraVideoTrack
和ArRTC.createMicrophoneAudioTrack
创建本地音视频轨道对象时,传入cameraId
和microphoneId
指定音视频输入/输出设备。 - 测试采集到的音视频轨道是否正常:
- 音频轨道,调用
MicrophoneAudioTrack.getVolumeLevel
获取音量,音量大于 0 说明麦克风正常。 - 视频轨道,调用
CameraVideoTrack.play(<ELEMENT_ID_IN_DOM>)
预览本地视频轨道,看到画面说明摄像头正常。
- 音频轨道,调用
- 重复步骤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.setDevice
和 MicrophoneAudioTrack.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 参考
- getDevices
- getCameras
- getMicrophones
- createMicrophoneAudioTrack
- createCameraVideoTrack
- CameraVideoTrack
- MicrophoneAudioTrack
开发注意事项
设备 ID 是随机生成的,部分情况下同一个设备的 ID 可能会改变,因此我们建议每次测试设备时都先调用 ArRTC.getDevices
获取设备 ID。