通话前检测
在对音视频质量要求较高的场景下,需要在通话前进行检测,以确保设备的运转状态良好、设备与声网平台之间的网络状态正常。 此操作能够提前识别并排除潜在的故障,从而改善用户体验。
本文介绍如何在 App 中实施网络和设备检测。
技术原理
在通信场景中,可通过检测了解网络状态。 例如,简单发送一条空消息以查看目标地址是否存在。
进行网络检测时需要重点关注以下指标:
- 带宽:通常以 bit/s 为单位,表示信息传输的最大速率
- 吞吐量: 信息传输的实际速率
- 时延: 信息从发送方到接收方所需要的时间,包括接收方的解码时间,以及每一个网络节点进行数据处理的时间
- 抖动: 接收方收到数据包的延迟变化
- 错误率: 以百分比或分数表示损坏的信息占发送信息总数的比例
进行设备检测可以保证设备获取的音频在经过网络传输后可以正常播放。 首先,声网会从设备的麦克风获取音频,然后将其发送到声网平台,并定义一个等待时间(例如:5 秒)。 等待时间过后,声网平台将音频发送回设备,并在设备扬声器中播放。 然后,你可以判断音频的质量是否良好。
声网建议你先进行设备测试,然后进行网络检测。
设备检测
SDK 提供了以下方法进行设备检测。
startEchoTestWithInterval
:测试音频设备(例如麦克风和扬声器)和网络连接是否正常startRecordingDeviceTest
:测试本地音频录制设备(如麦克风)是否正常工作startPlaybackDeviceTest
:测试本地音频播放设备(如外放设备)是否正常工作startAudioDeviceLoopbackTest
:测试本地音频设备回路是否正常
网络检测
SDK 提供了 startLastmileProbeTest
方法,用于在加入频道前检测 last mile 网络并返回有关网络质量的统计信息,包括往返时延、丢包率和网络带宽。
各 API 的调用时序如下:
在进行 last mile 检测时,视频 SDK 根据视频配置文件调整实际比特率。
前提条件
在进行操作之前,请确保你已经在项目中实现了基本的实时音视频功能。有关详细信息,请参考实现音视频互动。
操作步骤
请参考以下步骤在 App 中实施通话前检测。
设备检测
语音通话检测
测试系统的音频设备和网络连接是否正常,请参考以下步骤。
- 在加入频道之前,调用
startEchoTestWithInterval
。 你需要在该方法中设置interval
参数来通知 SDK 何时上报本次测试的结果。 取值范围为 [2~10],默认值为 10(单位:秒)。 - 当回声测试开始后,引导用户说一句话。 如果在设置的时间间隔后回放录音,则表示音频设备和网络连接正常。
- 获得测试结果后,先调用
stopEchoTest
停止测试,再调用joinChannelByToken
加入频道。
请参考以下示例代码来实现该功能。
// 开始回声测试
// 只有主播才能调用 startEchoTestWithInterval
agoraKit.startEchoTestWithInterval(10)
// 等待并检查是否可以听到自己的声音回放
// 停止回声测试
// 必须调用 stopEchoTest 结束回声测试。否则,你将无法进行另一次回声测试,或使用 joinChannelByToken 加入频道
agoraKit.stopEchoTest
音频录制设备检测
测试本地音频录制设备(如麦克风)是否正常工作,请参考以下步骤。
- 调用
startRecordingDeviceTest
,并将indicationInterval
参数设置为触发回调的时间间隔。 - 引导用户说一句话,SDK 会在
reportAudioVolumeIndicationOfSpeakers
回调,报告uid
= 0 及设备的音量信息。 - 完成测试后,调用
stopRecordingDeviceTest
停止录制设备测试。
建议将 indicationInterval
参数设置到大于 200 毫秒,最小不得少于 10 毫秒,否则会收不到 reportAudioVolumeIndicationOfSpeakers
回调。
agoraKit.startRecordingDeviceTest(1000)
agoraKit.stopRecordingDeviceTest()
音频播放设备检测
测试本地音频播放设备(如外放设备)是否正常工作,请参考以下步骤。
- 调用
startPlaybackDeviceTest
,并将audioFileName
参数设置为待播放的音频文件的绝对路径。 - 如果能听到声音,说明播放设备能正常工作。SDK 会触发一次
reportAudioVolumeIndicationOfSpeakers
回调,报告uid
= 1 及播放设备的音量信息。 - 完成测试后,调用
stopPlaybackDeviceTest
停止播放设备测试。
agoraKit.startPlaybackDeviceTest("audio file path")
agoraKit.stopPlaybackDeviceTest()
音频设备回路检测
测试本地音频设备回路是否正常,请参考以下步骤。
- 调用
startAudioDeviceLoopbackTest
,并将indicationInterval
参数设置为触发回调的时间间隔。 - 用户说一句话,麦克风会采集声音然后用扬声器播放,同时 SDK 会返回两个
reportAudioVolumeIndicationOfSpeakers
回调,分别报告音频采集设备(uid
= 0)和音频播放设备(uid
= 1)的音量信息。 - 完成测试后,调用
stopAudioDeviceLoopbackTest
停止录制设备测试。
建议将 indicationInterval
参数设置到大于 200 毫秒,最小不得少于 10 毫秒,否则会收不到 reportAudioVolumeIndicationOfSpeakers
回调。
agoraKit.startAudioDeviceLoopbackTest(1000)
agoraKit.stopAudioDeviceLoopbackTest()
网络检测
请参考以下步骤进行网络检测。
-
在加入频道或切换用户角色之前,调用
startLastmileProbeTest
启动网络检测。 你需要在此方法中设置你预期的上行和下行比特率。Swift// Swift
let config = AgoraLastmileProbeConfig()
// 检测上行网络
config.probeUplink = true;
// 检测下行网络
config.probeDownlink = true;
// 预期的上行比特率(bps)。 取值范围为 [100000,5000000]
config.expectedUplinkBitrate = 100000;
// 预期的下行比特率(bps)。 取值范围为 [100000,5000000]
config.expectedDownlinkBitrate = 100000;
// 调用 startLastmileProbeTest 开始网络检测
// 调用 startLastmileProbeTest 进行通话前网络质量检测会消耗网络流量。 因此,在调用该方法后,声网建议你在收到 lastmileProbeTest 回调之前不要调用其他任何方法
agoraKit.startLastmileProbeTest(config) -
调用该方法后,SDK 将返回以下两个回调:
lastmileQuality
:在调用startLastmileProbeTest
2 秒后返回。 该回调通过打分反馈上下行网络质量,更贴近主观感受。lastmileProbeResult
:在调用startLastmileProbeTest
30 秒后返回。 该回调提了网络质量的实时统计数据,更加客观。
Swift// Swift
// 在调用 startLastmileProbeTest 后,约 2 秒后返回 lastmileQuality 回调。 此回调每 2 秒返回一次
// lastmileQuality 可能会在第一次触发时返回 Unknown。 后续的回调将返回测试结果
func rtcEngine(_ engine: AgoraRtcEngineKit, lastmileQuality quality: AgoraNetworkQuality) {
lastmileResultLabel.stringValue = "Quality: \(quality.description())"
}
// 调用 startLastmileProbeTest 约 30 秒后,返回 lastmileProbeResult 回调。 此回调提供更详细的网络质量统计信息
func rtcEngine(_ engine: AgoraRtcEngineKit, lastmileProbeTest result: AgoraLastmileProbeResult) {
// 往返时延
let rtt = "Rtt: \(result.rtt)ms"
// 下行网络带宽
let downlinkBandWidth = "DownlinkAvailableBandwidth: \(result.downlinkReport.availableBandwidth)Kbps"
// 下行抖动缓冲区
let downlinkJitter = "DownlinkJitter: \(result.downlinkReport.jitter)ms"
// 下行丢包率
let downlinkLoss = "DownlinkLoss: \(result.downlinkReport.packetLossRate)%"
// 上行网络带宽
let uplinkBandwidth = "UplinkAvailableBandwidth: \(result.uplinkReport.availableBandwidth)Kbps"
// 上行抖动缓冲区
let uplinkJitter = "UplinkJitter: \(result.uplinkReport.jitter)ms"
// 上行丢包率
let uplinkLoss = "UplinkLoss: \(result.uplinkReport.packetLossRate)%"
lastmileProbResultLabel.stringValue = [rtt, downlinkBandwidth, downlinkJitter, downlinkLoss,uplinkBandwidth,uplinkJitter,uplinkLoss].joined(separator: "\n")
} -
获取网络质量统计信息后,调用
stopLastmileProbeTest
停止网络检测。Swift// Swift
// 停止 last mile 网络检测
// 你可以选择在 lastmileProbeResult 方法中调用 stopLastmileProbeTest 停止测试,或者在加入频道之前的其他时间调用
agoraKit.stopLastmileProbeTest()
参考信息
介绍本文中使用方法的更多信息以及相关页面的链接。
示例项目
声网在 GitHub 上提供了一个开源的 macOS 示例项目,在 PrecallTest.swift 中实现了通话前检测。 你可以下载体验或查看其中的源代码。