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.
Observabilidad del cliente
Descubre cómo utilizar la observabilidad del cliente para supervisar métricas de calidad en tiempo real durante una videollamada con el SDK de Vonage Video.