你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

面向用户的诊断

在 Azure 通信服务 中使用呼叫时,可能会遇到影响客户的问题。 为了帮助解决此问题,Azure 通信服务提供了一个名为“面向用户的诊断”(UFD)的功能,可用于检查调用的各种属性,以确定问题是什么。 面向用户的诊断是由于一些基础问题(网络不佳、用户麦克风静音)而触发的事件,表明用户可能体验不佳。 触发面向用户的诊断后,应考虑向最终用户提供反馈,指出他们可能存在一些根本问题。 但是,面向用户的诊断输出只是信息性的,调用堆栈不会根据触发面向用户的诊断进行任何更改。

诊断值

可以使用以下面向用户的诊断:

网络值

名称 描述 可能的值 用例 缓解步骤
noNetwork 没有可用的网络。 - 设置为 True 调用无法启动时,因为没有可用的网络。
- 当存在 ICE 候选人时,设为 False
设备未连接到网络。 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络优化 ”部分。
networkRelaysNotReachable 网络问题。 - 当网络具有一些不允许访问Azure 通信服务中继的约束时,请设置为True该约束。
- 进行新通话时,设为 False
在 WiFi 信号打开和关闭时的通话期间。 确保防火墙规则和网络路由允许客户端访问 Microsoft TURN 服务器。 有关详细信息,请参阅防火墙配置部分。
networkReconnect 连接断开,我们正在重新连接到网络。 - 设置为Bad 断开网络时
- 设置为 Poor媒体传输连接丢失时
- 连接新会话时,设为 Good
低带宽、没有 Internet 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。
networkReceiveQuality 关于传入流质量的指标。 - 设置为Bad 接收流时出现严重问题。
- 设置为 Poor 接收流时出现轻微问题。
- 设置为 Good 接收流时没有问题。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 建议最终用户关闭相机,以节省可用的 Internet 带宽。
networkSendQuality 关于传出流质量的指标。 - 设置为Bad 发送流时出现严重问题。
- 设置为 Poor 发送流时出现轻微问题。
- 设置为 Good 发送流时出现问题。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 此外,建议最终用户关闭其相机,以节省可用的 Internet 带宽。

音频值

名称 描述 可能的值 用例 缓解步骤
noSpeakerDevicesEnumerated 用户的系统上没有音频输出设备(扬声器)。 - 当系统上没有扬声器设备并且支持扬声器选择项时,设为 True
- 设置为 False 系统上至少有一个扬声器设备,并且支持扬声器选择。
拔下所有扬声器 如果设置为值 True,请考虑向最终用户提供视觉通知,即其当前呼叫会话没有任何扬声器可用。
speakingWhileMicrophoneIsMuted 静音时说话。 - 当本地麦克风静音且本地用户正在说话时,设为 True
- 当本地用户停止说话或取消麦克风静音时,设为 False
* 注意:目前 Safari 不支持此选项,因为音频级采样取自 WebRTC 统计信息。
在通话过程中,将麦克风静音并对其讲话。 当值设置为 True 考虑向最终用户提供视觉通知时,他们可能会说话,并且不意识到其音频已静音。
noMicrophoneDevicesEnumerated 用户系统上没有音频捕获设备(麦克风) - 当系统上没有麦克风设备时,设为 True
- 设置为 False 系统上至少有一个麦克风设备时。
在通话期间,拔掉了所有麦克风。 当值设置为 True 考虑向最终用户提供视觉通知时,其当前呼叫会话没有麦克风。 有关详细信息,请参阅 “从设备管理器 启用麦克风”部分。
microphoneNotFunctioning 麦克风无法正常工作。 - 当因系统禁用麦克风设备或因其他进程占用麦克风设备而无法开始发送本地音频流时,设为 True。 引发此 UFD 需要大约 10 秒。
- 当麦克风再次开始成功发送音频流时,设为 False
无可用麦克风,系统中已禁用麦克风访问 当值设置为 True 向最终用户提供视觉通知时,其麦克风出现问题。
microphoneMuteUnexpectedly 麦克风静音 - 当麦克风意外进入静音状态时,设为 True
- 当麦克风开始成功发送音频流时,设为 False
从系统将麦克风静音。 大多数情况下,如果用户在移动设备上进行 Azure 通信服务通话时收到来电,则会发生这种情况。 在大多数情况下,操作系统将Azure 通信服务呼叫静音,以便用户可以接听电话呼叫。 如果设置为值 True,请向最终用户提供视觉通知,告知其呼叫已静音,因为电话呼叫已传入。 有关详细信息,请参阅如何最好地处理AZURE 通信服务调用部分的 OS 静音。
microphonePermissionDenied 设备音量较低,macOS 上几乎无提示。 - 设置为 True 从系统设置(音频)拒绝音频权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS。
“设置”中禁用麦克风权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用对Azure 通信服务呼叫使用麦克风的权限。

相机值

名称 描述 可能的值 用例 缓解步骤
cameraFreeze 相机停止生成帧,且时长超过 5 秒。 - 当本地视频流处于冻结状态时,设为 True。 此诊断意味着远程端正在其屏幕上看到视频冻结,或者意味着远程参与者不会在其屏幕上呈现视频。
- 当冻结结束并且用户可以照常观看视频时,设为 False
通话过程中相机断开连接或网络故障导致相机冻结。 如果值设置为 True,请考虑向最终用户通知远程参与者网络可能很糟糕,可能建议他们关闭相机以节省带宽。 有关详细信息,请参阅有关Azure 通信服务调用所需 Internet 功能的网络带宽要求部分。
cameraStartFailed 一般相机故障。 - 当因系统禁用相机设备或因其他进程占用相机设备而无法开始发送本地视频时,设为 True
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机无法启动。
cameraStartTimedOut 相机处于故障状态的常见场景。 - 当相机设备超时并开始发送视频流时,设为 True
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。
cameraPermissionDenied “设置”中拒绝相机权限。 - 设置为 True 从系统设置(视频)拒绝相机权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS Chrome。
“设置”中禁用相机权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用使用相机进行Azure 通信服务呼叫的权限。
cameraStoppedUnexpectedly 相机故障 - 当相机意外进入已停止状态时,设为 True
- 当相机再次开始成功发送视频流时,设为 False
检查相机是否正常工作。 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。

杂项值

名称 描述 可能的值 用例 缓解步骤
screenshareRecordingDisabled 设置中的首选项拒绝了系统屏幕共享。 - 设置为 True 从系统设置(共享)拒绝屏幕共享权限时设置。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS.Chrome。
“设置”中禁用屏幕录制。 如果设置为值True,请向最终用户提供视觉通知,指出他们未启用共享屏幕以进行Azure 通信服务呼叫的权限。
capturerStartFailed 系统屏幕共享失败。 - 当我们无法开始捕获屏幕时,设为 True
- 成功开始捕获屏幕时,设为 False
如果设置为值 True,请向最终用户提供视觉通知,指出共享其屏幕时可能存在问题。 (将值设置回 False时,请删除通知)。
capturerStoppedUnexpectedly 系统屏幕共享故障 - 当屏幕捕获程序意外进入已停止状态时,设为 True
- 当屏幕捕获程序再次开始成功捕获时,设为 False
检查屏幕共享是否正常工作 如果设置为值 True,请向最终用户提供视觉通知,指出可能存在导致共享其屏幕停止的问题。 (将值设置回 False 时删除通知)。

访问诊断

面向用户的诊断是核心 Call API 的扩展功能,可用于诊断活动呼叫。

const userFacingDiagnostics = call.feature(Features.UserFacingDiagnostics);

面向用户的诊断事件

  • 订阅 diagnosticChanged 事件,以监视任何面向用户的诊断何时发生更改。
/**
 *  Each diagnostic has the following data:
 * - diagnostic is the type of diagnostic, e.g. NetworkSendQuality, DeviceSpeakWhileMuted, etc...
 * - value is DiagnosticQuality or DiagnosticFlag:
 *     - DiagnosticQuality = enum { Good = 1, Poor = 2, Bad = 3 }.
 *     - DiagnosticFlag = true | false.
 * - valueType = 'DiagnosticQuality' | 'DiagnosticFlag'
 */
const diagnosticChangedListener = (diagnosticInfo: NetworkDiagnosticChangedEventArgs | MediaDiagnosticChangedEventArgs) => {
    console.log(`Diagnostic changed: ` +
        `Diagnostic: ${diagnosticInfo.diagnostic}` +
        `Value: ${diagnosticInfo.value}` +
        `Value type: ${diagnosticInfo.valueType}`);

    if (diagnosticInfo.valueType === 'DiagnosticQuality') {
        if (diagnosticInfo.value === DiagnosticQuality.Bad) {
            console.error(`${diagnosticInfo.diagnostic} is bad quality`);

        } else if (diagnosticInfo.value === DiagnosticQuality.Poor) {
            console.error(`${diagnosticInfo.diagnostic} is poor quality`);
        }

    } else if (diagnosticInfo.valueType === 'DiagnosticFlag') {
        if (diagnosticInfo.value === true) {
            console.error(`${diagnosticInfo.diagnostic}`);
        }
    }
};

userFacingDiagnostics.network.on('diagnosticChanged', diagnosticChangedListener);
userFacingDiagnostics.media.on('diagnosticChanged', diagnosticChangedListener);

获取最新的面向用户的诊断

  • 获取引发的最新诊断值。 如果诊断未定义,则是因为从未引发该诊断。
const latestNetworkDiagnostics = userFacingDiagnostics.network.getLatest();

console.log(
  `noNetwork: ${latestNetworkDiagnostics.noNetwork.value}, ` +
    `value type = ${latestNetworkDiagnostics.noNetwork.valueType}`
);

console.log(
  `networkReconnect: ${latestNetworkDiagnostics.networkReconnect.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReconnect.valueType}`
);

console.log(
  `networkReceiveQuality: ${latestNetworkDiagnostics.networkReceiveQuality.value}, ` +
    `value type = ${latestNetworkDiagnostics.networkReceiveQuality.valueType}`
);

const latestMediaDiagnostics = userFacingDiagnostics.media.getLatest();

console.log(
  `speakingWhileMicrophoneIsMuted: ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.value}, ` +
    `value type = ${latestMediaDiagnostics.speakingWhileMicrophoneIsMuted.valueType}`
);

console.log(
  `cameraStartFailed: ${latestMediaDiagnostics.cameraStartFailed.value}, ` +
    `value type = ${latestMediaDiagnostics.cameraStartFailed.valueType}`
);

console.log(
  `microphoneNotFunctioning: ${latestMediaDiagnostics.microphoneNotFunctioning.value}, ` +
    `value type = ${latestMediaDiagnostics.microphoneNotFunctioning.valueType}`
);

诊断值

可以使用以下面向用户的诊断:

网络值

名称 描述 可能的值 用例 缓解步骤
networkUnavailable 没有可用的网络。 - 设置为 True 调用无法启动时,因为没有可用的网络。
- 当存在 ICE 候选人时,设为 False
设备未连接到网络。 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络优化 ”部分。
networkRelaysUnreachable 网络问题。 - 当网络具有一些不允许访问Azure 通信服务中继的约束时,请设置为True该约束。
- 进行新通话时,设为 False
在 WiFi 信号打开和关闭时的通话期间。 确保防火墙规则和网络路由允许客户端访问 Microsoft TURN 服务器。 有关详细信息,请参阅防火墙配置部分。
networkReconnectionQuality 连接已丢失,我们正在重新连接到网络。 - 设置为Bad 断开网络时
- 设置为 Poor媒体传输连接丢失时
- 连接新会话时,设为 Good
低带宽、没有 Internet 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。
networkReceiveQuality 关于传入流质量的指标。 - 设置为Bad 接收流时出现严重问题。
- 设置为 Poor 接收流时出现轻微问题。
- 设置为 Good 接收流时没有问题。
- 仅当通话中有活动音频流时,它才可见,这意味着参与者在一段时间内正在主动说话。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 建议最终用户关闭其相机,以节省可用的 Internet 带宽。
networkSendQuality 关于传出流质量的指标。 - 设置为Bad 发送流时出现严重问题。
- 设置为 Poor 发送流时出现轻微问题。
- 设置为 Good 发送流时出现问题。
- 与接收质量诊断类似,只有在通话中存在活动音频流时,它才可见,这意味着参与者正在主动说话一段时间。 但是,它仅在 1:1 调用中工作,因为它依赖于来自另一方的信息来验证质量。 另一方必须向接收的数据发出信号。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 此外,建议最终用户关闭其相机,以节省可用的 Internet 带宽。

音频值

名称 描述 可能的值 用例 缓解步骤
noSpeakerDevicesAvailable 用户的系统上没有音频输出设备(扬声器)。 - 当系统上没有扬声器设备并且支持扬声器选择项时,设为 True
- 设置为 False 系统上至少有一个扬声器设备,并且支持扬声器选择。
拔下所有扬声器 如果设置为值 True,请考虑向最终用户提供视觉通知,即其当前呼叫会话没有任何扬声器可用。
speakingWhileMicrophoneIsMuted 静音时说话。 - 当本地麦克风静音且本地用户正在说话时,设为 True
- 当本地用户停止说话或取消麦克风静音时,设为 False
- 如果未进行任何用户操作以避免干扰并提供更好的用户体验,则可以自动禁用此诊断事件。 当发生新的静音操作时,将再次启用它。
在通话过程中,将麦克风静音并对其讲话。 当值设置为 True 考虑向最终用户提供视觉通知时,他们可能会说话,并且不意识到其音频已静音。
noMicrophoneDevicesAvailable 用户系统上没有音频捕获设备(麦克风) - 当系统上没有麦克风设备时,设为 True
- 设置为 False 系统上至少有一个麦克风设备时。
在通话期间,拔掉了所有麦克风。 当值设置为 True 考虑向最终用户提供视觉通知时,其当前呼叫会话没有麦克风。 有关详细信息,请参阅 “从设备管理器 启用麦克风”部分。
microphoneNotFunctioning 麦克风无法正常工作。 - 设置为 True 当我们无法开始发送本地音频流时,因为麦克风设备可能在系统中被禁用,或者其他进程正在使用它。 引发此 UFD 需要大约 10 秒。
- 当麦克风再次开始成功发送音频流时,设为 False
无可用麦克风,系统中已禁用麦克风访问 当值设置为 True 向最终用户提供视觉通知时,其麦克风出现问题。
microphoneMuteUnexpectedly 麦克风静音 - 当麦克风意外进入静音状态时,设为 True
- 当麦克风开始成功发送音频流时,设为 False
从系统将麦克风静音。 大多数情况下,如果用户在移动设备上进行 Azure 通信服务通话时收到来电,则会发生这种情况。 在大多数情况下,操作系统将Azure 通信服务呼叫静音,以便用户可以接听电话呼叫。 如果设置为值 True,请向最终用户提供视觉通知,告知其呼叫已静音,因为电话呼叫已传入。 有关详细信息,请参阅如何最好地处理AZURE 通信服务调用部分的 OS 静音。
microphonePermissionDenied 设备音量较低,macOS 上几乎无提示。 - 设置为 True 从系统设置(音频)拒绝音频权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS。
“设置”中禁用麦克风权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用对Azure 通信服务呼叫使用麦克风的权限。

相机值

名称 描述 可能的值 用例 缓解步骤
cameraFrozen 相机停止生成帧,且时长超过 5 秒。 - 当本地视频流处于冻结状态时,设为 True。 此诊断意味着远程端正在其屏幕上看到视频冻结,或者意味着远程参与者不会在其屏幕上呈现视频。
- 当冻结结束并且用户可以照常观看视频时,设为 False
通话过程中相机断开连接或网络故障导致相机冻结。 如果值设置为 True,请考虑向最终用户通知远程参与者网络可能很糟糕,可能建议他们关闭相机以节省带宽。 有关详细信息,请参阅有关Azure 通信服务调用所需 Internet 功能的网络带宽要求部分。
cameraStartFailed 一般相机故障。 - 设置为 True 当我们无法开始发送本地视频时,因为相机设备可能已在系统中被禁用,或者它正被另一个进程使用~。
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机无法启动。
cameraStartTimedOut 相机处于故障状态的常见场景。 - 当相机设备超时并开始发送视频流时,设为 True
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。
cameraPermissionDenied “设置”中拒绝相机权限。 - 设置为 True 从系统设置(视频)拒绝相机权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS Chrome。
“设置”中禁用相机权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用使用相机进行Azure 通信服务呼叫的权限。
cameraStoppedUnexpectedly 相机故障 - 当相机意外进入已停止状态时,设为 True
- 当相机再次开始成功发送视频流时,设为 False
检查相机是否正常工作。 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。

仅限本机

名称 描述 可能的值 用例 缓解步骤
speakerVolumeIsZero 设备上的零音量(扬声器)。 - 设置为 True 当扬声器音量为零时。
- 设置为 False 当扬声器音量不为零时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将卷设置为最低(零)。
speakerMuted 扬声器设备已静音。 - 设置为 True 静音扬声器设备时。
- 设置为 False 当扬声器设备未静音时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将扬声器静音。
speakerBusy 扬声器已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 扬声器设备流获取超时(音频) 的时间。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用扬声器并尝试关闭它。
speakerNotFunctioning 扬声器无法正常工作(无法初始化音频设备客户端或设备 5 秒以上的非活动状态) - 设置为 True 当扬声器不可用时,或设备流获取超时(音频)。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 请尝试检查扬声器设备的状态。
microphoneBusy 麦克风已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 麦克风设备流获取超时(音频)的时间。
- 设置为 False 麦克风获取成功时。
音频未到达呼叫中的其他参与者。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用麦克风并尝试关闭它。

访问诊断

面向用户的诊断是核心 Call API 的扩展功能,可用于诊断活动呼叫。

DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

面向用户的诊断事件

  • 获取功能对象并将侦听器添加到诊断事件。
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);

/* NetworkDiagnostic */
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for no network diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkUnreachableChangedListener(listener);

// To remove listener for network quality event
networkDiagnostics.removeOnNetworkUnreachableChangedListener(listener);

// Quality Diagnostics
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
QualityDiagnosticChangedListener listener = (QualityDiagnosticChangedEvent args) -> {
  DiagnosticQuality diagnosticQuality = args.getValue();
  // Handle new value for network reconnect diagnostic.
};

NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetworkDiagnostics();
networkDiagnostics.addOnNetworkReconnectionQualityChangedListener(listener);

// To remove listener for media flag event
networkDiagnostics.removeOnNetworkReconnectionQualityChangedListener(listener);

/* MediaDiagnostic */
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
FlagDiagnosticChangedListener listener = (FlagDiagnosticChangedEvent args) -> {
  Boolean mediaValue = args.getValue();
  // Handle new value for speaker not functioning diagnostic.
};

MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();
mediaDiagnostics.addOnIsSpeakerNotFunctioningChangedListener(listener);

// To remove listener for media flag event
mediaDiagnostics.removeOnIsSpeakerNotFunctioningChangedListener(listener);

获取最新的面向用户的诊断

  • 获取当前调用中引发的最新诊断值。 如果我们仍然未收到诊断值,则会引发异常。
DiagnosticsCallFeature diagnosticsCallFeature = call.feature(Features.LOCAL_USER_DIAGNOSTICS);
NetworkDiagnostics networkDiagnostics = diagnosticsCallFeature.getNetwork();
MediaDiagnostics mediaDiagnostics = diagnosticsCallFeature.getMedia();

NetworkDiagnosticValues latestNetwork = networkDiagnostics.getLatestDiagnostics();
Boolean lastNetworkValue = latestNetwork.isNetworkUnavailable(); // null if there isn't a value for this diagnostic.
DiagnosticQuality lastReceiveQualityValue = latestNetwork.getNetworkReceiveQuality(); //  UNKNOWN if there isn't a value for this diagnostic.

MediaDiagnosticValues latestMedia = networkDiagnostics.getLatestDiagnostics();
Boolean lastSpeakerNotFunctionValue = latestMedia.isSpeakerNotFunctioning(); // null if there isn't a value for this diagnostic.

// Use the last values ...

诊断值

可以使用以下面向用户的诊断:

网络值

名称 描述 可能的值 用例 缓解步骤
networkUnavailable 没有可用的网络。 - 设置为 True 调用无法启动时,因为没有可用的网络。
- 当存在 ICE 候选人时,设为 False
设备未连接到网络。 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络优化 ”部分。
networkRelaysUnreachable 网络问题。 - 当网络具有一些不允许访问Azure 通信服务中继的约束时,请设置为True该约束。
- 进行新通话时,设为 False
在 WiFi 信号打开和关闭时的通话期间。 确保防火墙规则和网络路由允许客户端访问 Microsoft TURN 服务器。 有关详细信息,请参阅防火墙配置部分。
networkReconnectionQuality 连接已丢失,我们正在重新连接到网络。 - 设置为Bad 断开网络时
- 设置为 Poor媒体传输连接丢失时
- 连接新会话时,设为 Good
低带宽、没有 Internet 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。
networkReceiveQuality 关于传入流质量的指标。 - 设置为Bad 接收流时出现严重问题。
- 设置为 Poor 接收流时出现轻微问题。
- 设置为 Good 接收流时没有问题。
- 仅当通话中有活动音频流时,它才可见,这意味着参与者在一段时间内正在主动说话。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 建议最终用户关闭其相机,以节省可用的 Internet 带宽。
networkSendQuality 关于传出流质量的指标。 - 设置为Bad 发送流时出现严重问题。
- 设置为 Poor 发送流时出现轻微问题。
- 设置为 Good 发送流时出现问题。
- 与接收质量诊断类似,只有在通话中存在活动音频流时,它才可见,这意味着参与者正在主动说话一段时间。 但是,它仅在 1:1 调用中工作,因为它依赖于来自另一方的信息来验证质量。 另一方必须向接收的数据发出信号。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 此外,建议最终用户关闭其相机,以节省可用的 Internet 带宽。

音频值

名称 描述 可能的值 用例 缓解步骤
noSpeakerDevicesAvailable 用户的系统上没有音频输出设备(扬声器)。 - 当系统上没有扬声器设备并且支持扬声器选择项时,设为 True
- 设置为 False 系统上至少有一个扬声器设备,并且支持扬声器选择。
拔下所有扬声器 如果设置为值 True,请考虑向最终用户提供视觉通知,即其当前呼叫会话没有任何扬声器可用。
speakingWhileMicrophoneIsMuted 静音时说话。 - 当本地麦克风静音且本地用户正在说话时,设为 True
- 当本地用户停止说话或取消麦克风静音时,设为 False
- 如果未进行任何用户操作以避免干扰并提供更好的用户体验,则可以自动禁用此诊断事件。 当发生新的静音操作时,将再次启用它。
在通话过程中,将麦克风静音并对其讲话。 当值设置为 True 考虑向最终用户提供视觉通知时,他们可能会说话,并且不意识到其音频已静音。
noMicrophoneDevicesAvailable 用户系统上没有音频捕获设备(麦克风) - 当系统上没有麦克风设备时,设为 True
- 设置为 False 系统上至少有一个麦克风设备时。
在通话期间,拔掉了所有麦克风。 当值设置为 True 考虑向最终用户提供视觉通知时,其当前呼叫会话没有麦克风。 有关详细信息,请参阅 “从设备管理器 启用麦克风”部分。
microphoneNotFunctioning 麦克风无法正常工作。 - 设置为 True 当我们无法开始发送本地音频流时,因为麦克风设备可能在系统中被禁用,或者其他进程正在使用它。 引发此 UFD 需要大约 10 秒。
- 当麦克风再次开始成功发送音频流时,设为 False
无可用麦克风,系统中已禁用麦克风访问 当值设置为 True 向最终用户提供视觉通知时,其麦克风出现问题。
microphoneMuteUnexpectedly 麦克风静音 - 当麦克风意外进入静音状态时,设为 True
- 当麦克风开始成功发送音频流时,设为 False
从系统将麦克风静音。 大多数情况下,如果用户在移动设备上进行 Azure 通信服务通话时收到来电,则会发生这种情况。 在大多数情况下,操作系统将Azure 通信服务呼叫静音,以便用户可以接听电话呼叫。 如果设置为值 True,请向最终用户提供视觉通知,告知其呼叫已静音,因为电话呼叫已传入。 有关详细信息,请参阅如何最好地处理AZURE 通信服务调用部分的 OS 静音。
microphonePermissionDenied 设备音量较低,macOS 上几乎无提示。 - 设置为 True 从系统设置(音频)拒绝音频权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS。
“设置”中禁用麦克风权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用对Azure 通信服务呼叫使用麦克风的权限。

相机值

名称 描述 可能的值 用例 缓解步骤
cameraFrozen 相机停止生成帧,且时长超过 5 秒。 - 当本地视频流处于冻结状态时,设为 True。 此诊断意味着远程端正在其屏幕上看到视频冻结,或者意味着远程参与者不会在其屏幕上呈现视频。
- 当冻结结束并且用户可以照常观看视频时,设为 False
通话过程中相机断开连接或网络故障导致相机冻结。 如果值设置为 True,请考虑向最终用户通知远程参与者网络可能很糟糕,可能建议他们关闭相机以节省带宽。 有关详细信息,请参阅有关Azure 通信服务调用所需 Internet 功能的网络带宽要求部分。
cameraStartFailed 一般相机故障。 - 设置为 True 当我们无法开始发送本地视频时,因为相机设备可能已在系统中被禁用,或者它正被另一个进程使用~。
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机无法启动。
cameraStartTimedOut 相机处于故障状态的常见场景。 - 当相机设备超时并开始发送视频流时,设为 True
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。
cameraPermissionDenied “设置”中拒绝相机权限。 - 设置为 True 从系统设置(视频)拒绝相机权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS Chrome。
“设置”中禁用相机权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用使用相机进行Azure 通信服务呼叫的权限。
cameraStoppedUnexpectedly 相机故障 - 当相机意外进入已停止状态时,设为 True
- 当相机再次开始成功发送视频流时,设为 False
检查相机是否正常工作。 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。

仅限本机

名称 描述 可能的值 用例 缓解步骤
speakerVolumeIsZero 设备上的零音量(扬声器)。 - 设置为 True 当扬声器音量为零时。
- 设置为 False 当扬声器音量不为零时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将卷设置为最低(零)。
speakerMuted 扬声器设备已静音。 - 设置为 True 静音扬声器设备时。
- 设置为 False 当扬声器设备未静音时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将扬声器静音。
speakerBusy 扬声器已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 扬声器设备流获取超时(音频) 的时间。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用扬声器并尝试关闭它。
speakerNotFunctioning 扬声器无法正常工作(无法初始化音频设备客户端或设备 5 秒以上的非活动状态) - 设置为 True 当扬声器不可用时,或设备流获取超时(音频)。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 请尝试检查扬声器设备的状态。
microphoneBusy 麦克风已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 麦克风设备流获取超时(音频)的时间。
- 设置为 False 麦克风获取成功时。
音频未到达呼叫中的其他参与者。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用麦克风并尝试关闭它。

访问诊断

面向用户的诊断是核心 Call API 的扩展功能,可用于诊断活动呼叫。

let userFacingDiagnostics = self.call?.feature(Features.localUserDiagnostics)

面向用户的诊断事件

  • 实现委托 medianetwork 诊断源。 MediaDiagnosticsDelegateNetworkDiagnosticsDelegate
extension CallObserver: MediaDiagnosticsDelegate {
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraFrozen args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartFailed args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerVolumeZero args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraPermissionDenied args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneNotFunctioning args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsCameraStartTimedOut args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneMutedUnexpectedly args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroSpeakerDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...                            
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsZeroMicrophoneDevicesAvailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakingWhileMicrophoneIsMuted args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsSpeakerBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func mediaDiagnostics(_ mediaDiagnostics: MediaDiagnostics,
                        didChangeIsMicrophoneBusy args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}

extension CallObserver: NetworkDiagnosticsDelegate {
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkRelaysUnreachable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReconnectionQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkSendQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeIsNetworkUnavailable args: DiagnosticFlagChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
    
  func networkDiagnostics(_ networkDiagnostics: NetworkDiagnostics,
                          didChangeNetworkReceiveQuality args: DiagnosticQualityChangedEventArgs) {
    let newValue = args.value
    // Handle the diagnostic event value changed...
  }
}
  • 保存对media事件进行引用和network诊断并设置用于侦听事件的委托对象。
self.mediaDiagnostics = userFacingDiagnostics?.media
self.networkDiagnostics = userFacingDiagnostics?.network
self.mediaDiagnostics?.delegate = self.callObserver
self.networkDiagnostics?.delegate = self.callObserver

注意

如果已在 CallKit 应用程序中通过 SDK 启用或实现 CallKit 集成,则向 CallKit 报告静音状态可能会导致 OS 由于隐私原因导致应用程序松开对麦克风的保留,这将导致 didIsSpeakingWhileMicrophoneIsMuted 事件无法按预期工作,因为我们无法从麦克风设备捕获输入来检测用户正在说话。

获取最新的面向用户的诊断

  • 获取引发的最新诊断值。 如果我们仍然未收到诊断值, nil.unknown 返回。
let lastSpeakerNotFunctionValue = self.mediaDiagnostics.latest.isSpeakerNotFunctioning // Boolean?
let lastNetworkRelayNotReachableValue = self.networkDiagnostics.latest.networkRelaysUnreachable // Boolean?
let lastReceiveQualityValue = self.networkDiagnostics.latest.networkReceiveQuality // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.

诊断值

可以使用以下面向用户的诊断:

网络值

名称 描述 可能的值 用例 缓解步骤
networkUnavailable 没有可用的网络。 - 设置为 True 调用无法启动时,因为没有可用的网络。
- 当存在 ICE 候选人时,设为 False
设备未连接到网络。 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络优化 ”部分。
networkRelaysUnreachable 网络问题。 - 当网络具有一些不允许访问Azure 通信服务中继的约束时,请设置为True该约束。
- 进行新通话时,设为 False
在 WiFi 信号打开和关闭时的通话期间。 确保防火墙规则和网络路由允许客户端访问 Microsoft TURN 服务器。 有关详细信息,请参阅防火墙配置部分。
networkReconnectionQuality 连接已丢失,我们正在重新连接到网络。 - 设置为Bad 断开网络时
- 设置为 Poor媒体传输连接丢失时
- 连接新会话时,设为 Good
低带宽、没有 Internet 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。
networkReceiveQuality 关于传入流质量的指标。 - 设置为Bad 接收流时出现严重问题。
- 设置为 Poor 接收流时出现轻微问题。
- 设置为 Good 接收流时没有问题。
- 仅当通话中有活动音频流时,它才可见,这意味着参与者在一段时间内正在主动说话。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 建议最终用户关闭其相机,以节省可用的 Internet 带宽。
networkSendQuality 关于传出流质量的指标。 - 设置为Bad 发送流时出现严重问题。
- 设置为 Poor 发送流时出现轻微问题。
- 设置为 Good 发送流时出现问题。
- 与接收质量诊断类似,只有在通话中存在活动音频流时,它才可见,这意味着参与者正在主动说话一段时间。 但是,它仅在 1:1 调用中工作,因为它依赖于来自另一方的信息来验证质量。 另一方必须向接收的数据发出信号。
低带宽 确保为呼叫提供可靠的 Internet 连接,以便保持语音呼叫。 有关详细信息,请参阅 “网络带宽要求 ”部分。 此外,建议最终用户关闭其相机,以节省可用的 Internet 带宽。

音频值

名称 描述 可能的值 用例 缓解步骤
noSpeakerDevicesAvailable 用户的系统上没有音频输出设备(扬声器)。 - 当系统上没有扬声器设备并且支持扬声器选择项时,设为 True
- 设置为 False 系统上至少有一个扬声器设备,并且支持扬声器选择。
拔下所有扬声器 如果设置为值 True,请考虑向最终用户提供视觉通知,即其当前呼叫会话没有任何扬声器可用。
speakingWhileMicrophoneIsMuted 静音时说话。 - 当本地麦克风静音且本地用户正在说话时,设为 True
- 当本地用户停止说话或取消麦克风静音时,设为 False
- 如果未进行任何用户操作以避免干扰并提供更好的用户体验,则可以自动禁用此诊断事件。 当发生新的静音操作时,将再次启用它。
在通话过程中,将麦克风静音并对其讲话。 当值设置为 True 考虑向最终用户提供视觉通知时,他们可能会说话,并且不意识到其音频已静音。
noMicrophoneDevicesAvailable 用户系统上没有音频捕获设备(麦克风) - 当系统上没有麦克风设备时,设为 True
- 设置为 False 系统上至少有一个麦克风设备时。
在通话期间,拔掉了所有麦克风。 当值设置为 True 考虑向最终用户提供视觉通知时,其当前呼叫会话没有麦克风。 有关详细信息,请参阅 “从设备管理器 启用麦克风”部分。
microphoneNotFunctioning 麦克风无法正常工作。 - 设置为 True 当我们无法开始发送本地音频流时,因为麦克风设备可能在系统中被禁用,或者其他进程正在使用它。 引发此 UFD 需要大约 10 秒。
- 当麦克风再次开始成功发送音频流时,设为 False
无可用麦克风,系统中已禁用麦克风访问 当值设置为 True 向最终用户提供视觉通知时,其麦克风出现问题。
microphoneMuteUnexpectedly 麦克风静音 - 当麦克风意外进入静音状态时,设为 True
- 当麦克风开始成功发送音频流时,设为 False
从系统将麦克风静音。 大多数情况下,如果用户在移动设备上进行 Azure 通信服务通话时收到来电,则会发生这种情况。 在大多数情况下,操作系统将Azure 通信服务呼叫静音,以便用户可以接听电话呼叫。 如果设置为值 True,请向最终用户提供视觉通知,告知其呼叫已静音,因为电话呼叫已传入。 有关详细信息,请参阅如何最好地处理AZURE 通信服务调用部分的 OS 静音。
microphonePermissionDenied 设备音量较低,macOS 上几乎无提示。 - 设置为 True 从系统设置(音频)拒绝音频权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS。
“设置”中禁用麦克风权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用对Azure 通信服务呼叫使用麦克风的权限。

相机值

名称 描述 可能的值 用例 缓解步骤
cameraFrozen 相机停止生成帧,且时长超过 5 秒。 - 当本地视频流处于冻结状态时,设为 True。 此诊断意味着远程端正在其屏幕上看到视频冻结,或者意味着远程参与者不会在其屏幕上呈现视频。
- 当冻结结束并且用户可以照常观看视频时,设为 False
通话过程中相机断开连接或网络故障导致相机冻结。 如果值设置为 True,请考虑向最终用户通知远程参与者网络可能很糟糕,可能建议他们关闭相机以节省带宽。 有关详细信息,请参阅有关Azure 通信服务调用所需 Internet 功能的网络带宽要求部分。
cameraStartFailed 一般相机故障。 - 设置为 True 当我们无法开始发送本地视频时,因为相机设备可能已在系统中被禁用,或者它正被另一个进程使用~。
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机无法启动。
cameraStartTimedOut 相机处于故障状态的常见场景。 - 当相机设备超时并开始发送视频流时,设为 True
- 当选定的相机设备再次成功发送本地视频时,设为 False
相机故障 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。
cameraPermissionDenied “设置”中拒绝相机权限。 - 设置为 True 从系统设置(视频)拒绝相机权限时。
- 成功获取流时,设为 False
请注意:此诊断仅适用于 macOS Chrome。
“设置”中禁用相机权限。 如果设置为值True,请向最终用户提供视觉通知,即他们未启用使用相机进行Azure 通信服务呼叫的权限。
cameraStoppedUnexpectedly 相机故障 - 当相机意外进入已停止状态时,设为 True
- 当相机再次开始成功发送视频流时,设为 False
检查相机是否正常工作。 如果设置为值 True,请向最终用户提供视觉通知,告知其相机可能存在问题。 (将值设置回 False 时删除通知)。

仅限本机

名称 描述 可能的值 用例 缓解步骤
speakerVolumeIsZero 设备上的零音量(扬声器)。 - 设置为 True 当扬声器音量为零时。
- 设置为 False 当扬声器音量不为零时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将卷设置为最低(零)。
speakerMuted 扬声器设备已静音。 - 设置为 True 静音扬声器设备时。
- 设置为 False 当扬声器设备未静音时。
呼叫时不听到参与者的音频。 如果值设置为 True,则可能意外地将扬声器静音。
speakerBusy 扬声器已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 扬声器设备流获取超时(音频) 的时间。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用扬声器并尝试关闭它。
speakerNotFunctioning 扬声器无法正常工作(无法初始化音频设备客户端或设备 5 秒以上的非活动状态) - 设置为 True 当扬声器不可用时,或设备流获取超时(音频)。
- 设置为 False 当扬声器获取成功时。
通过扬声器呼叫时不听到参与者的音频。 请尝试检查扬声器设备的状态。
microphoneBusy 麦克风已在使用中。 设备正以独占模式使用,或者设备正在共享模式下使用,而调用方要求在独占模式下使用设备。 - 设置为 True 麦克风设备流获取超时(音频)的时间。
- 设置为 False 麦克风获取成功时。
音频未到达呼叫中的其他参与者。 如果设置为值True,请向最终用户提供视觉通知,以便他们可以检查另一个应用程序正在使用麦克风并尝试关闭它。

访问诊断

面向用户的诊断是核心 Call API 的扩展功能,可用于诊断活动呼叫。

this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;

面向用户的诊断事件

  • 实现诊断事件的侦听器。
private async void Call__OnNetworkUnavailableChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other network diagnostics

private async void Call__OnMediaSpeakerNotFunctioningChanged(object sender, FlagDiagnosticChangedEventArgs args)
{
  var value = args.Value;
  // Handle the diagnostic event value changed...
}

// Listen to other media diagnostics
  • 设置用于侦听事件的事件方法。
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

this.networkDiagnostics.NetworkUnavailableChanged += Call__OnNetworkUnavailableChanged;
// Listen to other network events as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged += Call__OnMediaSpeakerNotFunctioningChanged;
// Listen to other media events as well ... 

// Removing listeners

this.networkDiagnostics.NetworkUnavailable -= Call__NetworkUnavailableChanged;
// Remove the other listeners as well ... 

this.mediaDiagnostics.SpeakerNotFunctioningChanged -= Call__OnMediaSpeakerNotFunctioningChanged;
// Remove the other listeners as well ... 

获取最新的面向用户的诊断

  • 获取当前调用中引发的最新诊断值。 如果仍未收到诊断值, null.unknown 返回该值。
this.diagnosticsCallFeature = call.Features.LocalUserDiagnostics;
this.networkDiagnostics = diagnosticsCallFeature.Network;
this.mediaDiagnostics = diagnosticsCallFeature.Media;

bool? lastSpeakerNotFunctionValue = this.mediaDiagnostics.GetLatestDiagnostics().IsSpeakerNotFunctioning; // Boolean?
bool? lastNetworkRelayNotReachableValue = this.networkDiagnostics.GetLatestDiagnostics().IsNetworkRelaysUnreachable; // Boolean?
DiagnosticQuality lastReceiveQualityValue = this.networkDiagnostics.GetLatestDiagnostics().NetworkReceiveQuality; // DiagnosticQuality (.good, .poor, .bad)
// or .unknown if there isn't a diagnostic for this.