通话前检测
在对通话质量要求高的场景下,进行通话前检测可以帮助提前识别并排查问题,保证实时通信体验。通话前检测通常可以从如下两个角度开展:
- 设备检测:检测本地麦克风、摄像头等音视频设备能否正常工作。
- 网络探测:通过探测当前的上下行 Last mile 网络质量,判断或预测用户当前的网络状况是否良好,是否可以满足音频码率或者当前选定的视频属性的目标码率。
声网 SDK 提供了完备的网络探测及设备检测接口,帮助你实现如上功能,保证用户的使用体验。本文介绍如何使用相关 API 实现上述功能。
前提条件
开始前,请确保你已参考快速开始在你的项目中实现基本的实时音视频功能。
实现方法
本节介绍如何进行设备检测和网络探测。
设备检测
你需要分别检测采集设备和播放设备。
采集设备检测
参考以下步骤检测本地麦克风和摄像头:
- 调用
AgoraRTC.getDevices
获取可用设备及设备 ID。 - 在调用
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 用于音频播放设备的测试。你可以通过以下方法测试音频播放设备:
- 使用 HTML5 的
<audio>
元素在页面上创建一个音频播放器,让用户播放在线音频文件并确认是否有声音。 - 采集完麦克风后,调用
MicrophoneAudioTrack.play
来播放麦克风声音,让用户主观确认是否可以听到麦克风声音。
网络探测
参考下列步骤在正式通话或直播前进行网络质量探测:
-
调用两次
createClient
创建两个 Client:- uplinkClient:用于测试上行网络的连接状况
- downlinkClient:用于测试下行网络的连接状况。
-
两个 Client 均调用
join
,进入一个测试用的频道。 -
调用
createMicrophoneAndCameraTracks
创建音视频轨道。 -
在 uplinkClient 上调用
publish
发布音视频轨道,在 downlinkClient 上调用subscribe
方法订阅音视频轨道。 -
监听
uplinkClient.on("network-quality")
事件获取本地与声网服务器之间的上行网络状况。 -
监听
downlinkClient.on("network-quality")
事件获取本地与声网服务器之间的下行网络状况。SDK 每两秒触发一次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);
参考信息
示例项目
声网提供了已实现通话前检测功能的开源示例项目供你参考,你可以前往下载或查看 index.js
中的源代码。