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.
Observabilité du client
Découvrez comment utiliser l'observabilité côté client pour surveiller en temps réel les indicateurs de qualité d'un appel vidéo avec le SDK Vonage Video.