Gerenciar estatísticas de vídeo
Nesta etapa, você implementa OTSubscriberKitNetworkStatsDelegate para diagnosticar falhas e avaliar o desempenho da rede de superfície em seu aplicativo.
| O que você vai monitorar | Como é entregue | Como pode ser usado |
|---|---|---|
videoPacketsLost / videoBytesReceived |
Periódico — videoNetworkStatsUpdated |
Confirme se o canal de recepção está apresentando problemas (interrupções, travamentos) |
transport (largura de banda do downlink local) |
Periódico — mediaLinkStatsUpdated |
Sugerir “Sua conexão parece fraca” |
remotePublisherTransport (transmissão remota) |
Periódico — mediaLinkStatsUpdated |
Sugerir “A rede do outro participante pode estar instável” |
networkDegradationSource |
Periódico e ao ocorrer uma alteração | Escolha entre mensagens locais e remotas |
| Mudança significativa na rede | Evento — networkConditionChanged |
Banners, mensagens de comemoração, registros de suporte |
Específico para iOS: Estatísticas periódicas e condição da rede eventos são métodos da o mesmo OTSubscriberKitNetworkStatsDelegate—não é um tipo de ouvinte distinto.
Adote o delegado em uma extensão:
extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
// ...
}
1. Gerenciar as estatísticas de vídeo dos inscritos
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
)
}
}
As chamadas de retorno podem chegar fora da fila principal. Atualização @Published estado de sobreposição no principal fila.
2. Analisar as estatísticas periódicas dos links de mídia
func subscriber(_ subscriber: OTSubscriberKit, mediaLinkStatsUpdated mediaLinkStats: OTSubscriberKitMediaLinkStats) {
applyMediaLinkStats(mediaLinkStats)
}
3. Gerenciar eventos relacionados às condições da rede
Implementar subscriber(_:networkConditionChanged:reason:) para alterações significativas — consulte Condição da rede:
func subscriber(
_ subscriber: OTSubscriberKit,
networkConditionChanged mediaLinkStats: OTSubscriberKitMediaLinkStats,
reason: OTNetworkReason
) {
print("networkConditionChanged reason=\(reason.rawValue)")
applyMediaLinkStats(mediaLinkStats, networkConditionChangeReason: reason)
handleNetworkDegradation(mediaLinkStats)
}
Auxiliar de mesclagem compartilhado:
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. React a eventos de deterioração das condições da rede
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
}
}
Definir ObservabilityStats, MediaLinkSnapshot, e os helpers do seu projeto (siga o modelo do exemplo do Android). Se remotePublisherTransport permanece nulo, confirme o remoto editora utilizada settings.senderStatsTrack = true.
Próximo: Passe as estatísticas combinadas para o SwiftUI e renderize a sobreposição.
Observabilidade do cliente
Saiba como usar a observabilidade do cliente para monitorar métricas de qualidade em tempo real de uma videochamada com o Vonage Video SDK.