Swift

Gestionar estadísticas de vídeo

En este paso, se implementa OTSubscriberKitNetworkStatsDelegate para detectar los fallos y evaluar el estado de la red de superficie en tu aplicación.

Lo que vas a supervisar Cómo se entrega Cómo se puede utilizar
videoPacketsLost / videoBytesReceived Periódico — videoNetworkStatsUpdated Comprueba si la conexión de recepción presenta problemas (intermitencias, bloqueos)
transport (ancho de banda de enlace descendente local) Periódico — mediaLinkStatsUpdated Sugerir «Parece que tu conexión es débil»
remotePublisherTransport (enlace ascendente remoto) Periódico — mediaLinkStatsUpdated Sugerir «Es posible que la conexión del otro participante sea inestable»
networkDegradationSource Periódico y al producirse un cambio Mensajería local o remota
Cambio significativo en la red Evento - networkConditionChanged Banners, brindis, registros de asistencia

Específico para iOS: Estadísticas periódicas y estado de la red eventos son métodos de la lo mismo OTSubscriberKitNetworkStatsDelegate—no es un tipo de oyente independiente.

Incorpora el delegado en una extensión:

extension VonageVideoManager: OTSubscriberKitNetworkStatsDelegate {
    // ...
}

1. Gestionar las estadísticas de vídeo de los suscriptores

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

Las llamadas de retorno pueden llegar fuera de la cola principal. Actualización @Published estado de superposición en el principal cola.

2. Gestionar las estadísticas periódicas de los enlaces a los medios de comunicación

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

3. Gestionar los eventos relacionados con el estado de la red

Implementar subscriber(_:networkConditionChanged:reason:) Para conocer los cambios más importantes, consulta Estado de la red:

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

Ayudante de fusión compartido:

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. Responder a los eventos de deterioro del estado de la red

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

Defina ObservabilityStats, MediaLinkSnapshot, y los «helpers» de tu proyecto (sigue el modelo del ejemplo de Android). Si remotePublisherTransport sigue siendo nulo, confirma el a distancia editor utilizado settings.senderStatsTrack = true.

Siguiente: Pasar las estadísticas combinadas a SwiftUI y renderizar la superposición.