在对通话质量要求高的场景下,进行通话前检测可以帮助提前识别并排查问题,保证实时通信体验。通话前检测通常可以从如下两个角度开展:
声网 SDK 提供了完备的网络探测及设备检测接口,帮助你实现如上功能,保证用户的使用体验。本文介绍如何使用相关 API 实现上述功能。
声网在 GitHub 上提供已实现通话前检测功能的开源示例项目。你可以查看 recordingDeviceControl.js
中的源代码。
参考以下步骤测试麦克风和摄像头:
AgoraRTC.createCameraVideoTrack
和 AgoraRTC.createMicrophoneAudioTrack
创建本地音视频轨道对象时,传入 cameraId
和 microphoneId
指定想测试的设备。CameraVideoTrack.play
播放本地视频轨道:MicrophoneAudioTrack.getVolumeLevel
获取音量,音量大于 0 说明麦克风正常。// 获取所有音视频设备。
AgoraRTC.getDevices()
.then(devices => {
const audioDevices = devices.filter(function(device){
return device.kind === "audioinput";
});
const videoDevices = devices.filter(function(device){
return device.kind === "videoinput";
});
var selectedMicrophoneId = audioDevices[0].deviceId;
var selectedCameraId = videoDevices[0].deviceId;
return Promise.all([
AgoraRTC.createCameraVideoTrack({ cameraId: selectedCameraId }),
AgoraRTC.createMicrophoneAudioTrack({ microphoneId: selectedMicrophoneId }),
]);
})
.then([videoTrack, audioTrack] => {
videoTrack.play("<ELEMENT_ID_IN_DOM>");
setInterval(() => {
const level = audioTrack.getVolumeLevel();
console.log("local stream audio level", level);
}, 1000);
});
我们建议你将音量变化和摄像头画面绘制在 UI 上,以便用户自行判断设备是否正常工作。
设备 ID 是随机生成的,部分情况下同一个设备的 ID 可能会改变,因此我们建议每次测试设备时都先调用 AgoraRTC.getDevices
获取设备 ID。
声网 Web SDK 不提供 API 用于音频播放设备的测试。你可以通过以下方法测试音频播放设备:
<audio>
元素在页面上创建一个音频播放器,让用户播放在线音频文件并确认是否有声音。MicrophoneAudioTrack.play
来播放麦克风声音,让用户主观确认是否可以听到麦克风声音。参考下列步骤在正式通话或直播前进行网络质量探测:
调用两次 createClient
创建两个 Client:
调用 createMicrophoneAndCameraTracks
创建音视频轨道。
两个 Client 均调用 join
,进入一个测试用的频道。
在 uplinkClient 上调用 publish
发布音视频轨道,在 downlinkClient 上调用 subscribe
方法订阅音视频轨道。
监听 uplinkClient.on("network-quality")
事件获取本地与声网服务器之间的上行网络状况。
监听 downlinkClient.on("network-quality")
事件获取本地与声网服务器之间的下行网络状况。
client.on("network-quality")
回调。如果你想获得发送或者接收媒体轨道的具体统计数据,如发送/接收码率、端到端延迟等,可以在 uplinkClient 上调用 getLocalAudioStats
和 getLocalVideoStats
获取上行统计数据,在 downlinkClient 上调用 getRemoteAudioStats
和 getRemoteVideoStats
获取下行统计数据。
// 获取上行网络质量
uplinkClient.on("network-quality", (quality) => {
console.log("uplink network quality", quality.uplinkNetworkQuality);
});
// 获取下行网络质量
downlinkClient.on("network-quality", (quality) => {
console.log("downlink network quality", quality.downlinkNetworkQuality);
});
// 获取上行统计数据
uplinkVideoStats = uplinkClient.getLocalVideoStats();
// 获取下行统计数据
downlinkVideoStats = downlinkClient.getRemoteVideoStats()[<UPLINKCLIENT_UID>];
console.log("uplink video stats", uplinkVideoStats);
console.log("downlink video stats", downlinkVideoStats);