你当前正在访问 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 通信服务通话静音部分。
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
- 与接收质量诊断类似,只有当通话中有活动的音频流时,它才可见,这意味着参与者在一段时间内积极发言。 但是,它只适用于一对一通话,因为它依赖于来自另一方的信息来验证质量。 其中,另一方必须用信号通知已接收到的数据。
低带宽 确保为呼叫提供可靠的 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 通信服务通话静音部分。
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
- 与接收质量诊断类似,只有当通话中有活动的音频流时,它才可见,这意味着参与者在一段时间内积极发言。 但是,它只适用于一对一通话,因为它依赖于来自另一方的信息来验证质量。 其中,另一方必须用信号通知已接收到的数据。
低带宽 确保为呼叫提供可靠的 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 通信服务通话静音部分。
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...
  }
}
  • 存放对 medianetwork 诊断的引用,并设置用于侦听事件的委托对象。
self.mediaDiagnostics = userFacingDiagnostics?.media
self.networkDiagnostics = userFacingDiagnostics?.network
self.mediaDiagnostics?.delegate = self.callObserver
self.networkDiagnostics?.delegate = self.callObserver

注意

如果你已通过 SDK 启用了 CallKit 或在应用程序中实现了 CallKit 集成,则向 CallKit 报告静音状态可能会导致操作系统因隐私原因使应用程序放弃对麦克风的控制,这将导致 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
- 与接收质量诊断类似,只有当通话中有活动的音频流时,它才可见,这意味着参与者在一段时间内积极发言。 但是,它只适用于一对一通话,因为它依赖于来自另一方的信息来验证质量。 其中,另一方必须用信号通知已接收到的数据。
低带宽 确保为呼叫提供可靠的 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 通信服务通话静音部分。
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.