在对质量要求高的场景下,进行通话前检测可以帮助提前识别并排查问题,保证实时通信体验。通话前检测通常可以从如下两个角度开展:
Agora SDK 提供了完备的网络探测及设备检测接口,帮助你实现如上功能,保证用户的使用体验。本文介绍如何使用相关 API 实现上述功能。
Agora 在 GitHub 上提供已实现通话前检测功能的开源示例项目。你可以下载体验或查看其中的源代码。
从 v2.4.0 起,Agora RTC Native SDK 提供了一个 startLastmileProbeTest
方法,支持用户在加入频道前进行网络质量探测,然后通过回调将当前网络质量的相关数据,包括往返时延、上下行丢包率、上下行网络带宽等返回给 app。
开始检测网络质量前,请确保你已在项目中实现了基本的音视频通信或直播功能。详见开始音视频通话或开始互动直播。
参考如下步骤了解相关 API 的工作原理。
startLastmileProbeTest
进行网络质量探测。调用该方法时,你需要指定期望的最大上下行码率。onLastmileQuality
:约 2 秒内返回。该回调通过打分反馈上下行网络质量,更贴近主观感受onLastmileProbeResult
:约 30 秒内返回。该回调通过客观数据反馈上下行网络质量,更客观stopLastmileProbeTest
停止通话前网络质量探测。各 API 的调用时序如下图所示:
你可以参考如下示例代码实现网络质量探测功能。
// 注册回调接口
// 开始 Last-mile 网络探测后,约 2 秒后发生该回调
void onLastmileQuality(int quality) {
}
// 开始 Last-mile 网络探测后,约 30 秒后发生该回调
void onLastmileProbeResult(LastmileProbeResult) {
// (1)可以选择在回调内部结束测试。在测试结束前,Agora 建议不要调用其他 API 方法
lpAgoraEngine->stopLastmileProbeTest();
}
// 配置一个 LastmileProbeConfig 实例
LastmileProbeConfig config;
// 确认探测上行网络质量
config.probeUplink = true;
// 确认探测下行网络质量
config.probeDownlink = true;
// 期望的最高发送码率,单位为 bps,范围为 [100000,5000000]
config.expectedUplinkBitrate = 100000;
// 期望的最高接收码率,单位为 bps,范围为 [100000,5000000]
config.expectedDownlinkBitrate = 100000;
// 加入频道前开始 Last-mile 网络探测
lpAgoraEngine->startLastmileProbeTest(config);
// (2)也可以选择在其他时候结束测试。在测试结束前,Agora 建议不要调用其他 API 方法
lpAgoraEngine->stopLastmileProbeTest();
为保证通话或直播质量,我们推荐在进入频道前进行音视频设备测试,检测麦克风、摄像头等音视频设备能否正常工作。该功能对于有高质量要求的场景,如在线教育等,尤为适用。
开始前请确保已在项目中实现了基本的音视频通话或直播功能。详见实现音视频通话或互动直播。
参考以下步骤测试音视频设备:
startEchoTest
测试系统的音频设备(耳麦、扬声器等)和网络连接。startRecordingDeviceTest
测试录音设备,调用 startPlaybackDeviceTest
测试音频播放设备。startAudioDeviceLoopbackTest
测试音频设备回路(包括录音设备和音频播放设备)。startDeviceTest
方法测试视频采集设备。startEchoTest
,并使用该方法的 intervalInSeconds
参数设置返回测试结果的时间间隔;用户说话;SDK 在设定的时间间隔后,如果能正常播放该用户说的话,则说明音频设备及网络连接正常。// 开启回声测试
rtcEngine.startEchoTest(10);
// 等待并检查是否可以听到自己的声音回放
// 停止测试
rtcEngine.stopEchoTest;
startRecordingDeviceTest
,并使用该方法的 indicationInterval
参数设置返回音量提示的间隔;用户说话,如果录制设备正常工作,SDK 会触发 onAudioVolumeIndication
回调并报告音量信息。UID 为 0 表示本地音量。完成测试后,需调用 stopRecordingDeviceTest
停止录制设备测试。indicationInterval
参数设置到大于 200 毫秒,最小不得少于 10 毫秒,否则会收不到 onAudioVolumeIndication
回调。// 选择一个音频采集设备
lpDeviceManager->setRecordingDevice(strDeviceID);
// 实现音频音量回调接口
virtual void onAudioVolumeIndication(const AudioVolumeInfo* speakers, unsigned int speakerNumber, int totalVolume) {
(void)speakers;
(void)speakerNumber;
(void)totalVolume;
}
// 开始音频采集设备测试
(*lpDeviceManager)->startRecordingDeviceTest(1000);
// 停止音频采集设备测试
(*lpDeviceManager)->stopRecordingDeviceTest();
startPlaybackDeviceTest
,并指定播放的音频文件。如果能听到声音,说明播放设备能正常工作,SDK 会触发 onAudioVolumeIndication
回调报告音频播放设备(UID 为 1)的音量信息。完成测试后,需调用 stopPlaybackDeviceTest
停止播放设备测试。// 选择一个音频播放设备
lpDeviceManager->setPlaybackDevice(strDeviceID);
// 指定音频文件的绝对路径,启动播放设备测试。
(*lpDeviceManager)->startPlaybackDeviceTest(filePath);
// 停止音频播放设备测试。
(*lpDeviceManager)->stopPlaybackDeviceTest();
startAudioDeviceLoopbackTest
,并使用该方法的 indicationInterval
参数设置返回音量提示的间隔;用户说话,麦克风会采集本地讲话声音,然后用扬声器播放,同时 SDK 会返回两个onAudioVolumeIndication
回调,分别报告音频采集设备(UID 为 0)的音量信息和音频播放设备(UID 为 1)的音量信息。完成测试后,需调用 stopAudioDeviceLoopbackTest
停止录制设备测试。indicationInterval
参数设置到大于 200 毫秒,最小不得少于 10 毫秒,否则会收不到 onAudioVolumeIndication
回调。enableVideo
开启视频模块后,调用 startDeviceTest
,并指定显示图像的窗口句柄,如果能看到本地采集的图像,则说明视频设备正常工作。完成测试后,需调用 stopDeviceTest
停止视频设备测试。// 选择一个视频采集设备
lpDeviceManager->setDevice(strDeviceID);
// 开始视频采集设备测试,如果正常的话,你将会看到画面预览
(*lpDeviceManager)->startDeviceTest(view);
// 停止视频采集设备测试
(*lpDeviceManager)->stopDeviceTest();
startEchoTest
stopEchoTest
enableAudioVolumeIndication
enumerateRecordingDevices
setRecordingDevice
enumeratePlaybackDevices
setPlaybackDevice
startRecordingDeviceTest
stopRecordingDeviceTest
startAudioDeviceLoopbackTest
stopAudioDeviceLoopbackTest
enumerateVideoDevices
startDeviceTest
stopDeviceTest
startLastmileProbeTest
进行通话前网络质量探测时,会消耗一定的网络流量。因此调用方法后,Agora 建议在收到 lastmileProbeResult
回调之前不要调用其他方法,避免因 API 操作过于频繁导致其他方法无法执行。lastmileQuality
回调第一次报告的结果有一定概率是 UNKNOWN
,可通过之后的几次回调获得结果。startEchoTest
。