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

最佳做法:Azure 通信服务呼叫 SDK

本文介绍了与 Azure 通信服务呼叫 SDK 相关的最佳做法。

适用于 Azure 通信服务通话 Web SDK 的最佳做法

本部分介绍了与用于语音和视频通话的 Azure 通信服务通话 Web (JavaScript) SDK 相关的最佳做法。

当通话正在进行时,插入麦克风或从设备管理器启用麦克风

如果在 Azure 通信服务通话开始时麦克风不可用,然后麦克风变得可用,则此更改会引发 noMicrophoneDevicesEnumerated 诊断事件。 当该事件发生时,你的应用程序需要调用 askDevicePermission 来获得用户同意以枚举设备。 然后,用户可以将麦克风静音或取消静音。

VideoStreamRendererView 的释放

当不再需要时,通信服务应用程序应释放 VideoStreamRendererView 或其父级 VideoStreamRenderer 实例。

出现 onbeforeunload 事件时挂断电话

onbeforeunload 事件发出时,应用程序应调用 call.hangup

在多个标签页上处理多个通话

在移动设备上,应用程序不应同时连接到来自多个浏览器标签页的通话。 由于设备上的麦克风和相机的资源分配,这种情况可能会导致未定义的行为。 我们建议开发人员在通话在后台完成后始终挂断通话,然后再启动新的呼叫。

处理有电话呼入时操作系统使通话静音的问题

在 Azure 通信服务通话中(适用于 iOS 和 Android),如果有来电或激活了语音助理,操作系统会自动将用户的麦克风和相机静音。 在 Android 上,通话在电话呼叫结束后自动取消静音,视频会重新开始。 在 iOS 上,取消静音和重启视频需要用户进行操作。

可以使用质量事件 microphoneMuteUnexpectedly 来侦听麦克风意外静音的通知。 请注意,为了能够正确地重新加入通话,需要使用 SDK 1.2.3-beta.1 或更高版本。

const latestMediaDiagnostic = call.api(SDK.Features.Diagnostics).media.getLatest();
const isIosSafari = (getOS() === OSName.ios) && (getPlatformName() === BrowserName.safari);
if (isIosSafari && latestMediaDiagnostic.microphoneMuteUnexpectedly && latestMediaDiagnostic.microphoneMuteUnexpectedly.value) {
  // received a QualityEvent on iOS that the microphone was unexpectedly muted - notify user to unmute their microphone and to start their video stream
}

应用程序应调用 call.startVideo(localVideoStream); 来启动视频流,并且应该使用 this.currentCall.unmute(); 取消音频的静音。

管理设备

可以使用 Azure 通信服务 SDK 来管理设备和媒体操作。

应用程序不应使用本机浏览器 API(如 getUserMediagetDisplayMedia)来获取 SDK 之外的流。 如果这样做,则必须在使用 DeviceManager 或其他设备管理 API 之前,通过通信服务 SDK 手动释放媒体流。

请求设备权限

你可以使用 SDK 请求设备权限。 应用程序应使用 DeviceManager.askDevicePermission 来请求对音频和/或视频设备的访问权限。

如果用户拒绝访问,DeviceManager.askDevicePermission 在后续呼叫时会针对特定的设备类型(音频或视频)返回 false,即使在页面刷新后也是如此。 在此场景中,应用程序必须:

  1. 检测到用户以前拒绝了访问。
  2. 指示用户手动重置或显式授予对特定设备类型的访问权限。

管理另一个进程正在使用的相机的行为

  • 在 Windows Microsoft Chrome 和 Windows Edge 上:如果在视频开启的情况下开始/加入/接受通话,并且除运行 Web SDK 的浏览器外的其他进程正在使用相机设备,则只能开启语音通话,不能进行视频通话。 由于相机无法启动,因此会引发面向用户的诊断标志 cameraStartFailed

    同样的情况也适用于在通话中打开视频。 你可以在另一个进程中关闭相机,令该进程释放相机设备,然后从通话中再次启动视频。 此时则能开启视频通话,远程参与者也能看到你的视频。

    此问题在 macOS Chrome 和 macOS Safari 中都不存在,因为 OS 会让进程和线程共享相机设备。

  • 在移动设备上:如果进程 A 在进程 B 正在使用相机时请求使用相机设备,则进程 A 将占用相机设备,进程 B 将停止使用相机。

  • 在 iOS Safari 上:你不能在同一标签页上或跨标签页为多个通话客户端打开相机。 任何通话客户端在使用相机时,都会从上一次使用它的任何通话客户端中接管相机。 前面的通话客户端得到了面向用户的诊断标志 cameraStoppedUnexpectedly

管理屏幕共享

关闭应用程序不会阻止其共享

假设你从 Chromium 对 Microsoft Teams 应用程序进行屏幕共享。 然后,选择 Teams 应用程序上的 X 按钮将其关闭。 尽管窗口已关闭,但 Teams 应用程序仍继续在后台运行。 图标仍显示在桌面任务栏上。 由于 Teams 应用程序仍在运行,因此它仍在与远程参与者共享屏幕。

若要停止应用程序的屏幕共享,必须执行以下操作之一:

  • 右键单击桌面任务栏上的应用程序图标,然后选择“退出”
  • 选择浏览器上的“停止共享”按钮。
  • 调用 SDK 的 Call.stopScreenSharing() API 操作。

Safari 只能进行全屏共享

Safari 仅允许整个屏幕的屏幕共享。 该行为与 Chromium 不同,后者允许对全屏、特定桌面应用或特定浏览器标签页进行屏幕共享。

你可以在 macOS 上授予屏幕共享权限

若要在 macOS Safari 或 macOS Chrome 中共享屏幕,请在以下操作系统菜单中为浏览器授予必要的权限:“系统首选项”>“安全与隐私”>“屏幕录制”。

适用于 Azure 通信服务通话原生 SDK 的最佳做法

本部分介绍了与用于语音和视频通话的 Azure 通信服务通话原生 SDK 相关的最佳做法。

支持的平台

下面是确保通话原生 SDK 的最佳功能的最低 OS 平台要求。

  • 在编译时支持 iOS 10.0+,运行时支持 iOS 12.0+
  • Xcode 12.0+
  • 支持 iPadOS 13.0+

验证应用请求的设备权限

若要使用通话原生 SDK 进行呼叫或接收呼叫,使用者需要授权每个平台访问设备资源。 作为开发人员,你必须提示用户提供访问权限并确保权限已启用。 使用者将授予这些访问权限,因此请验证他们当前是否具有必需的权限。

  • NSMicrophoneUsageDescription 用于麦克风访问
  • NSCameraUsageDescription 用于相机访问

配置日志

按照有关检索日志文件的教程中的说明实施日志记录比以往任何时候都更加重要。 详细的日志有助于诊断特定于满足最低 SDK 条件的设备模型或 OS 版本的问题。 我们建议开发人员使用日志 API 来配置日志。 如果没有日志,Microsoft 支持团队将无法帮助调试和排查通话问题。

跟踪通话 ID

CallID 是通话的唯一 ID。 它可从单个呼叫期间连接的所有参与者和终结点中标识相关事件。 在大多数情况下,你可以使用它来查看日志。 Microsoft 支持团队需要使用它来帮助解决通话问题。

你应当在你在应用中配置的遥测数据中跟踪 CallID 值。 若要了解如何针对每个平台检索该值,请遵循故障排除指南中的指导原则。

订阅面向用户的诊断和媒体质量统计信息

你可以使用这些 Azure 通信服务功能来帮助改善用户体验:

  • 面向用户的诊断:检查通话的属性以确定影响客户的问题的原因。
  • 媒体质量统计信息:检查传入和传出呼叫指标的低级别音频、视频和屏幕共享质量指标。 我们建议在通话结束后收集数据并将其发送到管道引入。

管理错误处理

如果在通话或实现期间出现任何错误,则方法将返回包含错误代码的错误对象。 使用这些错误对象进行适当的错误处理并显示警报至关重要。 通话状态还会返回错误代码,以帮助确定通话失败的原因。 可参考故障排除指南来解决任何问题。

管理视频流

请确保当 UI 上不再显示视频时释放 VideoStreamRendererView。 使用 VideoStreamType 确定流的类型。

进行常规内存管理

预分配资源。 在应用的启动阶段(而不是按需)初始化通话客户端和任何必要的资源。 此方法可减少启动通话时的延迟。

正确释放。 在使用后释放所有通话对象,以释放系统资源并避免内存泄漏。 确保取消订阅可能会导致内存泄漏的事件。

考虑进程如何访问相机或麦克风

在移动设备上,如果多个进程同时尝试访问相机或麦克风,则请求访问的第一个进程将控制设备。 因此,第二个进程会立即失去对该设备的访问权限。

优化库大小

由于以下原因,在软件开发中优化库的大小至关重要,尤其是在应用程序变得越来越复杂和资源密集型的情况下:

  • 应用程序性能:较小的库可减少应用程序必须加载、分析和执行的代码量。 此缩减可以显著提高应用程序的启动时间和整体性能,尤其是在资源有限的设备上。

  • 内存使用率:通过最小化库大小,可以减少应用程序的运行时内存占用。 对于移动设备而言,此缩减非常重要,因为移动设备的内存往往有限。 内存使用率较低可以减少系统崩溃,提高多任务性能。

有关详细信息,请参阅: