Swift

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 EventonetworkConditionChanged 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.

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.