Swift

動画統計情報の取り扱い

このステップでは、以下を実装します。 OTSubscriberKitNetworkStatsDelegate アプリ内のスタッターを診断し、ネットワークの状態を把握するため。

監視対象 配送方法 活用方法
videoPacketsLost / videoBytesReceived 定期的 — videoNetworkStatsUpdated 受信経路に問題があることを確認する(途切れやフリーズなど)
transport (ローカルダウンリンク帯域幅) 定期的 — mediaLinkStatsUpdated 提案する 「接続が弱いようです」
remotePublisherTransport (リモートアップリンク) 定期的 — mediaLinkStatsUpdated 提案する 「他の参加者のネットワークが不安定な可能性があります」
networkDegradationSource 定期的な そして 変更時 ローカルとリモートのメッセージングの選択
ネットワークの大幅な変更 イベント - networkConditionChanged バナー、乾杯、サポートログ

iOS限定: 定期的な統計情報とネットワークの状態 イベント は、のメソッドです 同じ OTSubscriberKitNetworkStatsDelegate—独立したリスナー型ではありません。

拡張機能内でデリゲートを採用する:

extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
    // ...
}

1. チャンネル登録者の動画統計情報の取り扱い

func subscriber(_ subscriber: OTSubscriberKit, videoNetworkStatsUpdated stats: OTSubscriberKitVideoNetworkStats) {
    print("videoBytesReceived=\(stats.videoBytesReceived)")
    print("videoPacketsLost=\(stats.videoPacketsLost)")
    print("videoPacketsReceived=\(stats.videoPacketsReceived)")

    DispatchQueue.main.async {
        self.latestObservabilityStats = ObservabilityStats.fromVideoStats(
            stats,
            mediaLink: self.latestMediaLinkSnapshot
        )
    }
}

コールバックはメインキュー以外から届く場合があります。更新 @Published 上の メイン キュー。

2. メディアリンクの統計情報の定期的な処理

func subscriber(_ subscriber: OTSubscriberKit, mediaLinkStatsUpdated mediaLinkStats: OTSubscriberKitMediaLinkStats) {
    applyMediaLinkStats(mediaLinkStats)
}

3. ネットワーク状態イベントの処理

実施 subscriber(_:networkConditionChanged:reason:) 大幅な変更については、以下を参照してください— ネットワーク状況:

func subscriber(
    _ subscriber: OTSubscriberKit,
    networkConditionChanged mediaLinkStats: OTSubscriberKitMediaLinkStats,
    reason: OTNetworkReason
) {
    print("networkConditionChanged reason=\(reason.rawValue)")
    applyMediaLinkStats(mediaLinkStats, networkConditionChangeReason: reason)
    handleNetworkDegradation(mediaLinkStats)
}

共有マージヘルパー:

private func applyMediaLinkStats(
    _ mediaLinkStats: OTSubscriberKitMediaLinkStats,
    networkConditionChangeReason: OTNetworkReason? = nil
) {
    let localBandwidth = mediaLinkStats.transport?.connectionEstimatedBandwidth
    let remoteBandwidth = mediaLinkStats.remotePublisherTransport?.connectionEstimatedBandwidth
    let localCondition = mediaLinkStats.transport?.networkCondition
    let remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition

    DispatchQueue.main.async {
        self.latestMediaLinkSnapshot = MediaLinkSnapshot(
            localEstimatedBandwidth: localBandwidth,
            remoteEstimatedBandwidth: remoteBandwidth,
            networkDegradationSource: mediaLinkStats.networkDegradationSource,
            localNetworkCondition: localCondition,
            remoteNetworkCondition: remoteCondition,
            lastNetworkConditionChangeReason: networkConditionChangeReason
        )
        if var current = self.latestObservabilityStats {
            current.merge(mediaLink: self.latestMediaLinkSnapshot)
            self.latestObservabilityStats = current
        }
    }
}

4. ネットワーク状態の悪化に関するイベントへの対応

private func handleNetworkDegradation(_ mediaLinkStats: OTSubscriberKitMediaLinkStats) {
    let localCondition = mediaLinkStats.transport?.networkCondition ?? .unknown
    let remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition ?? .unknown

    switch mediaLinkStats.networkDegradationSource {
    case .local:
        print("Local network degraded (condition=\(localCondition.rawValue))")
        // e.g. show: "Your connection looks weak"
    case .remote:
        print("Remote publisher network degraded (condition=\(remoteCondition.rawValue))")
        // e.g. show: "The other participant's network may be unstable"
    case .bothOrUnclear:
        print("Degradation unclear — local=\(localCondition.rawValue) remote=\(remoteCondition.rawValue)")
    default:
        break
    }
}

定義 ObservabilityStats, MediaLinkSnapshot、およびプロジェクト内のヘルパー(Androidのサンプルにあるモデルを参考に)です。もし remotePublisherTransport が 0 のままの場合は、次のことを確認してください。 リモート 使用された出版社 settings.senderStatsTrack = true.

次へ: マージされた統計データをSwiftUIに渡して、オーバーレイを描画します。