Swift

Gérer les statistiques vidéo

Au cours de cette étape, vous implémentez OTSubscriberKitNetworkStatsDelegate pour détecter les saccades et évaluer l'état du réseau de surface dans votre application.

Ce que vous allez surveiller Mode de livraison Comment l'utiliser
videoPacketsLost / videoBytesReceived Périodique — videoNetworkStatsUpdated Vérifiez si la liaison de réception présente des problèmes (saccades, blocages)
transport (bande passante locale de liaison descendante) Périodique — mediaLinkStatsUpdated Suggérer « Votre connexion semble faible »
remotePublisherTransport (liaison montante à distance) Périodique — mediaLinkStatsUpdated Suggérer « Le réseau de l'autre participant est peut-être instable »
networkDegradationSource Périodique et en cas de modification Messagerie locale ou à distance ?
Modification importante du réseau Événement - networkConditionChanged Bannières, messages de félicitations, journaux de support

Spécifique à iOS : Statistiques périodiques et état du réseau événements sont des méthodes de la idem OTSubscriberKitNetworkStatsDelegate— et non un type d'écouteur distinct.

Intégrer le délégué dans une extension :

extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
    // ...
}

1. Gérer les statistiques vidéo des abonnés

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
        )
    }
}

Les rappels peuvent arriver en dehors de la file d'attente principale. Mise à jour @Published état de superposition sur le principal file d'attente.

2. Gérer les statistiques périodiques relatives aux liens vers les médias

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

3. Gérer les événements liés à l'état du réseau

Mettre en œuvre subscriber(_:networkConditionChanged:reason:) pour les modifications importantes — voir État du réseau:

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

Aide à la fusion partagée :

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. Réagir aux événements liés à la dégradation de l'état du réseau

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
    }
}

Définir ObservabilityStats, MediaLinkSnapshot, ainsi que les helpers de votre projet (en vous inspirant du modèle de l'exemple Android). Si remotePublisherTransport reste nul, confirmer le à distance éditeur utilisé settings.senderStatsTrack = true.

Suivant : Transmettre les statistiques fusionnées à SwiftUI et afficher la superposition.