Videostatistiken verwalten
In diesem Schritt implementieren Sie OTSubscriberKitNetworkStatsDelegate um Ruckler zu diagnostizieren und den Zustand des Oberflächennetzwerks in Ihrer App zu überprüfen.
| Was Sie überwachen werden | Wie die Lieferung erfolgt | Anwendungsmöglichkeiten |
|---|---|---|
videoPacketsLost / videoBytesReceived |
Periodisch — videoNetworkStatsUpdated |
Überprüfen Sie, ob der Empfangskanal Probleme aufweist (Ruckeln, Einfrieren) |
transport (lokale Downlink-Bandbreite) |
Periodisch — mediaLinkStatsUpdated |
Vorschlagen „Deine Verbindung scheint schwach zu sein“ |
remotePublisherTransport (Fernübertragung) |
Periodisch — mediaLinkStatsUpdated |
Vorschlagen „Das Netzwerk des anderen Teilnehmers ist möglicherweise instabil.“ |
networkDegradationSource |
Periodisch und bei Änderung | Lokale oder Remote-Nachrichtenübermittlung wählen |
| Wesentliche Änderung im Netzwerk | Veranstaltung - networkConditionChanged |
Banner, Toasts, Support-Protokolle |
iOS-spezifisch: Regelmäßige Statistiken und Netzwerkstatus Veranstaltungen sind Methoden auf der dasselbe OTSubscriberKitNetworkStatsDelegate—kein eigenständiger Listener-Typ.
Den Delegaten in einer Erweiterung übernehmen:
extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
// ...
}
1. Videostatistiken der Abonnenten verwalten
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
)
}
}
Callbacks können außerhalb der Hauptwarteschlange eintreffen. Aktualisierung @Published Overlay-Zustand auf dem Haupt Warteschlange.
2. Regelmäßige Auswertung der Medien-Link-Statistiken
func subscriber(_ subscriber: OTSubscriberKit, mediaLinkStatsUpdated mediaLinkStats: OTSubscriberKitMediaLinkStats) {
applyMediaLinkStats(mediaLinkStats)
}
3. Ereignisse im Zusammenhang mit dem Netzwerkzustand behandeln
Umsetzung subscriber(_:networkConditionChanged:reason:) Für wesentliche Änderungen – siehe Zustand des Netzes:
func subscriber(
_ subscriber: OTSubscriberKit,
networkConditionChanged mediaLinkStats: OTSubscriberKitMediaLinkStats,
reason: OTNetworkReason
) {
print("networkConditionChanged reason=\(reason.rawValue)")
applyMediaLinkStats(mediaLinkStats, networkConditionChangeReason: reason)
handleNetworkDegradation(mediaLinkStats)
}
Gemeinsamer Merge-Helper:
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. Reaktion auf Ereignisse im Zusammenhang mit einer Verschlechterung der Netzwerkbedingungen
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
}
}
Definieren Sie ObservabilityStats, MediaLinkSnapshot, sowie Helper in Ihrem Projekt (orientieren Sie sich am Modell des Android-Beispiels). Wenn remotePublisherTransport bleibt null, bestätige die fern verwendeter Verlag settings.senderStatsTrack = true.
Weiter: Die zusammengeführten Statistiken an SwiftUI übergeben und das Overlay rendern.
Beobachtbarkeit der Kunden
Erfahren Sie, wie Sie mithilfe der Client-Observability Qualitätskennzahlen für einen Videoanruf mit dem Vonage Video SDK in Echtzeit überwachen können.