最佳做法:Azure 通訊服務通話 SDK

此文章提供與 Azure 通訊服務通話 SDK 相關的最佳做法相關資訊。

Azure 通訊服務 Web JavaScript SDK 最佳做法

此節提供與 Azure 通訊服務 JavaScript 語音和視訊通話 SDK 相關聯之最佳做法的相關資訊。

JavaScript 語音和視訊通話 SDK

Azure 通訊服務進行中通話時,插入麥克風或從裝置管理員啟用麥克風

當通話開始時沒有可用的麥克風,然後麥克風變成可用時,會引發 "noMicrophoneDevicesEnumerated" 通話診斷事件。 發生這種情況時,您的應用程式應該叫用 askDevicePermission 以取得使用者同意來列舉裝置。 然後,使用者就可以將麥克風靜音/取消靜音。

處置視訊串流轉譯器檢視

通訊服務應用程式應該要在不再需要 VideoStreamRendererView 時加以處置,或是處置其父 VideoStreamRenderer 執行個體。

在發生 onbeforeunload 事件時掛斷通話

您的應用程式應該在發出 onbeforeunload 事件時叫用 call.hangup

在行動裝置上處理多個索引標籤上的多個通話

您的應用程式不應該同時連線到來自多個瀏覽器索引標籤的通話,因為這可能會導致因裝置上的麥克風和相機資源配置而造成的未定義的行為。 建議開發人員在開始新的通話之前,一律在背景掛斷已完成的通話。

處理 OS 在來電時將通話靜音。

在 (同時針對 iOS 和 Android) 進行 Azure 通訊服務通話時,如果有來電或是啟用語音助理,OS 將會自動把使用者的麥克風和相機靜音。 在 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 來管理您的裝置和媒體作業。

  • 您的應用程式不應該使用 getUserMediagetDisplayMedia 之類的原生瀏覽器 API 來取得 SDK 外部的資料流。 如果您這麼做,您必須先手動處置媒體串流,再透過通訊服務 SDK 使用 DeviceManager 或其他裝置管理 API。

要求裝置權限

您可以使用 SDK 要求裝置權限:

  • 您的應用程式應該使用 DeviceManager.askDevicePermission 來要求存取音訊和/或視訊裝置。
  • 如果使用者拒絕存取,DeviceManager.askDevicePermission 會於後續通話針對指定的裝置類型 (音訊或視訊) 傳回 'false',即使在重新整理頁面之後也一樣。 在此案例中,您的應用程式必須偵測到使用者先前已拒絕存取,並指示使用者手動重設或明確授與指定裝置類型的存取權。

由另一個處理序所使用的相機

  • 在 Windows Chrome 和 Windows Microsoft Edge 上,如果您在開啟視訊的情況下啟動/加入/接受通話,且相機裝置正由 Web SDK 執行所在的瀏覽器以外的另一個處理序使用,則通話只會以音訊啟動,且不會有視訊。 會引發 cameraStartFailed UFD,因為相機正由另一個處理序使用,因而啟動失敗。 同樣的情況也適用於在通話中開啟視訊。 您可以在另一個處理序中關閉相機,讓該處理序釋放相機裝置,然後再次從通話啟動視訊;現在將能針對該通話開啟視訊,且遠端參與者將能開始看到您的視訊。
  • 這並不是 macOS Chrome 或 macOS Safari 上的問題,因為 OS 會讓處理序/執行緒共用相機裝置。
  • 在行動裝置上,如果 ProcessA 要求相機裝置,且其正由 ProcessB 使用,則 ProcessA 會取代相機裝置,而 ProcessB 會停止使用相機裝置
  • 在 iOS Safari 上,您無法在相同索引標籤內或跨索引標籤針對多個通話用戶端開啟相機。 當任何通話用戶端使用相機時,其會取代先前正在使用相機之任何通話用戶端的相機使用權限。 先前的通話用戶端會取得 cameraStoppedUnexpectedly UFD。

螢幕共用

關閉應用程式並不會阻止應用程式共用相機

例如,假設您從 Chromium 共用 Microsoft Teams 應用程式的螢幕。 然後,您選取 Teams 應用程式上的 [X] 按鈕來將其關閉。 Teams 應用程式將不會關閉,而且仍會在背景中執行。 您甚至會在桌面列右下角看到圖示。 由於 Teams 應用程式仍在執行中,這表示其仍在進行螢幕共用,且通話中的遠端參與者仍可以看到您的 Teams 應用程式正在共用螢幕。 若要停止應用程式共用螢幕,您必須以滑鼠右鍵按一下桌面列上的圖示,然後按一下 [結束]。 或者,您必須按一下瀏覽器上的 [停止共用] 按鈕。 或呼叫 SDK 的 Call.stopScreenSharing() API。

Safari 只能執行全螢幕共用

Safari 只允許以整個畫面的形式進行螢幕共用。 這不同於 Chromium,其可讓您以全螢幕、特定傳統型應用程式或特定瀏覽器索引標籤的形式進行螢幕共用。

macOS 上的螢幕共用權限

若要在 macOS Safari 或 macOs Chrome 中進行螢幕共用,必須將螢幕錄製權限授與 OS 功能表中的瀏覽器:[系統偏好設定] -> [安全性與隱私權] -> [螢幕錄製]。

Azure 通訊服務原生 SDK 最佳做法

此節提供與 Azure 通訊服務語音和視訊通話原生 SDK 相關聯最佳做法的相關資訊。

支援的平台

以下是最低 OS 平台需求,以確保通話原生 SDK 的最佳功能。

  • 在建置時間支援 iOS 10.0+,以及在執行階段支援 iOS 12.0+。
  • Xcode 12.0+。
  • 支援 iPadOS 13.0+。

應用程式要求裝置權限

若要使用通話原生 SDK 撥打或接聽通話,您必須授權每個平台存取裝置資源。 身為開發人員,您應該提示用戶進行存取,並確定已啟用。 取用者會授權這些存取權限,因此請確認先前已授與權限。

  • NSMicrophoneUsageDescription 以取得麥克風存取權。
  • NSCameraUsageDescription 以取得相機存取權。

設定記錄

根據記錄檔擷取教學課程實作記錄,比以往更為重要。 詳細的記錄有助於診斷符合最低 SDK 準則的裝置型號或 OS 版本特有的問題。 對於沒有記錄即開始設定記錄 API 的開發人員,Microsoft 支援服務小組無法協助偵錯及針對通話進行疑難排解。

追蹤通話識別碼

CallID 是通話的唯一識別碼。 會識別來自單一通話期間連線的所有參與者和端點的相互關聯事件,在大部分情況下,您會使用該識別碼來檢閱記錄,而 Microsoft 支援服務小組會要求該識別碼以協助針對通話進行疑難排解。 您應該追蹤您在應用程式中所設定遙測中的 CallID,您可以遵循疑難排解指南中的指導方針,了解如何針對每個平台擷取。

訂閱 UFD (使用者面向的診斷) 和媒體品質統計資料

  • 使用者面向的診斷 (UFD)可用來檢查通話的各種屬性,以判斷通話期間可能會發生哪些對您的客戶造成影響的問題。
  • 媒體品質統計資料檢查傳入和傳出通話計量的低階音訊、視訊和螢幕共用品質計量。 建議您收集資料,並在通話結束後將其傳送至管線擷取。

錯誤處理

如果在通話或實作期間發生任何錯誤,方法會傳回包含錯誤碼的錯誤物件。 請務必使用這些錯誤物件進行適當的錯誤處理,以及顯示警示。 通話狀態也會傳回錯誤碼,以協助識別通話失敗背後的原因。 您可以參考疑難排解指南,以解決任何問題。

管理視訊資料流

當 UI 上不再顯示視訊時,請務必處置 VideoStreamRendererView。 使用 VideoStreamType 來判斷資料流的類型。

一般記憶體管理

預先配置資源。 在應用程式的啟動階段 (而不是隨選) 初始化通話用戶端和任何必要的資源。 此方法可減少啟動通話時的延遲。

正確處置。 請確定所有通話物件在使用後都已正確處置,以釋放系統資源並避免記憶體流失。 請務必取消訂閱事件,防止記憶體流失。

由另一個處理序所使用的相機或麥克風

請務必注意,如果在行動裝置上有多個處理序同時嘗試存取相機或麥克風,要求存取的第一個處理序將會取得裝置的控制權。 因此,第二個處理序將會立即失去其存取權。

使用UI連結庫優化應用程式大小

優化軟體開發中連結庫的大小十分重要,原因有數個,特別是隨著應用程式變得越來越複雜,而且需要大量資源。

應用程式效能:較小的連結庫可減少應用程式必須載入、剖析和執行的程式代碼數量。 這可大幅提升應用程式的啟動時間和整體效能,特別是在資源有限的裝置上。

記憶體使用量:藉由將連結庫大小降到最低,您可以減少應用程式的運行時間記憶體使用量。 對於經常受限記憶體的行動裝置而言,這很重要。 較低的記憶體使用量可能會導致系統當機次數較少,且效能更佳。

下一步

如需詳細資訊,請參閱下列文章: