Gérer les statistiques vidéo
Au cours de cette étape, vous allez gérer les callbacks liés aux vidéos et aux liens multimédias des abonnés afin de diagnostiquer les saccades et d'évaluer l'état du réseau dans votre application.
| Ce que vous allez surveiller | Comment l'utiliser |
|---|---|
videoPacketsLost / videoBytesReceived |
Vérifiez si la voie de réception présente des dysfonctionnements (symptômes : saccades, blocages) |
transport (bande passante locale de liaison descendante) |
Suggérer « Votre connexion semble faible » lorsque votre débit descendant semble limité |
remotePublisherTransport (liaison montante à distance) |
Suggérer « Le réseau de l'autre participant est peut-être instable » lorsque leur chemin d'envoi semble limité |
networkDegradationSource |
Choisissez entre la messagerie locale et la messagerie à distance, ou enregistrez les deux valeurs de bande passante à des fins d'assistance |
1. Gérer les statistiques vidéo des abonnés
Mettre en œuvre SubscriberKit.VideoStatsListener pour recevoir régulièrement des indicateurs de réception vidéo :
private val videoStatsListener = SubscriberKit.VideoStatsListener { _, stats ->
Log.d(TAG, "videoBytesReceived=${stats.videoBytesReceived}")
Log.d(TAG, "videoPacketsLost=${stats.videoPacketsLost}")
Log.d(TAG, "videoPacketsReceived=${stats.videoPacketsReceived}")
Log.d(TAG, "timeStamp=${stats.timeStamp}")
mainHandler.post {
latestObservabilityStats = ObservabilityStats.fromVideoStats(
stats,
latestMediaLinkSnapshot,
)
}
}
Les callbacks peuvent être traités sur un thread d'arrière-plan. Envoyez les mises à jour de l'interface utilisateur vers le thread principal (comme indiqué ci-dessus) si vous utilisez Compose ou Views à partir de ces écouteurs.
2. Gérer les statistiques des liens multimédias
Mettre en œuvre SubscriberKit.MediaLinkStatsListener.onMediaLinkStats & SubscriberKit.MediaLinkStatsListener.onNetworkConditionChanged pour la bande passante de transport et la source de dégradation. Les notes d'état du réseau sont également disponibles sur transport et remotePublisherTransport dans chaque échantillon périodique — voir État du réseau.
private val mediaLinkStatsListener = object : SubscriberKit.MediaLinkStatsListener {
//
// Triggers on regular intervals while subscribed
// Good place for: Overlay numbers, charts, steady telemetry
//
override fun onMediaLinkStats(
subscriber: SubscriberKit,
mediaLinkStats: SubscriberKit.SubscriberMediaLinkStats,
) {
applyMediaLinkStats(mediaLinkStats)
}
//
// Triggers when the SDK detects a **significant** network condition change
// Good place for: Toasts, banners, support logs, adaptive UI
//
override fun onNetworkConditionChanged(
subscriber: SubscriberKit,
mediaLinkStats: SubscriberKit.SubscriberMediaLinkStats,
reason: String,
) {
Log.d(TAG, "onNetworkConditionChanged reason=$reason")
applyMediaLinkStats(mediaLinkStats, networkConditionChangeReason = reason)
handleNetworkDegradation(mediaLinkStats)
}
}
Les statistiques relatives aux vidéos et aux liens multimédias sont transmises via des callbacks distincts. L'exemple conserve un MediaLinkSnapshot et l'intègre lors de la compilation ou de la mise à jour ObservabilityStats:
private fun applyMediaLinkStats(
mediaLinkStats: SubscriberKit.SubscriberMediaLinkStats,
networkConditionChangeReason: String? = null,
) {
val localBandwidth = mediaLinkStats.transport?.connectionEstimatedBandwidth
val remoteBandwidth =
mediaLinkStats.remotePublisherTransport?.connectionEstimatedBandwidth
val localCondition = mediaLinkStats.transport?.networkCondition
val remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition
val conditionReason = mediaLinkStats.transport?.networkConditionReason
mainHandler.post {
latestMediaLinkSnapshot = MediaLinkSnapshot(
localEstimatedBandwidth = localBandwidth,
remoteEstimatedBandwidth = remoteBandwidth,
networkDegradationSource = mediaLinkStats.networkDegradationSource,
localNetworkCondition = localCondition,
remoteNetworkCondition = remoteCondition,
lastNetworkConditionChangeReason = networkConditionChangeReason,
)
latestObservabilityStats?.let { current ->
latestObservabilityStats = current.copy(
localEstimatedBandwidth = localBandwidth,
remoteEstimatedBandwidth = remoteBandwidth,
networkDegradationSource = mediaLinkStats.networkDegradationSource,
localNetworkCondition = localCondition,
remoteNetworkCondition = remoteCondition,
lastNetworkConditionChangeReason = networkConditionChangeReason,
)
}
networkConditionChangeReason?.let { changeReason ->
Log.d(
TAG,
"network condition event: $changeReason local=$localCondition remote=$remoteCondition",
)
}
}
}
Étendre MediaLinkSnapshot et ObservabilityStats avec les nouveaux champs (ou en associant les entiers des conditions de la carte aux libellés de la superposition à l'étape suivante).
3. Réagir aux événements liés à la dégradation de l'état du réseau
Lorsque la vidéo est saccadée, onNetworkConditionChanged tir sur un important modifier. À utiliser avec networkDegradationSource pour choisir le texte destiné aux utilisateurs :
private fun handleNetworkDegradation(
mediaLinkStats: SubscriberKit.SubscriberMediaLinkStats,
) {
val localCondition = mediaLinkStats.transport?.networkCondition
?: TransportStats.NETWORK_CONDITION_UNKNOWN
val remoteCondition = mediaLinkStats.remotePublisherTransport?.networkCondition
?: TransportStats.NETWORK_CONDITION_UNKNOWN
when (mediaLinkStats.networkDegradationSource) {
NetworkDegradationSource.LOCAL -> {
Log.w(TAG, "Local network degraded (condition=$localCondition)")
// e.g. show: "Your connection looks weak"
}
NetworkDegradationSource.REMOTE -> {
Log.w(TAG, "Remote publisher network degraded (condition=$remoteCondition)")
// e.g. show: "The other participant's network may be unstable"
}
NetworkDegradationSource.BOTH_OR_UNCLEAR -> {
Log.w(TAG, "Degradation unclear — local=$localCondition remote=$remoteCondition")
}
else -> { /* NetworkDegradationSource.NONE — no action */ }
}
}
reason en onNetworkConditionChanged explique pourquoi l'événement s'est déclenché (par exemple, une variation de la bande passante ou une perte de paquets). À associer avec networkCondition et networkConditionReason sur transport à des fins d'analyse.
Définir ObservabilityStats, MediaLinkSnapshotet fromVideoStats() dans votre projet. L'exemple ObservabilityStats.kt C'est un point de départ.
Observabilité du client
Découvrez comment utiliser l'observabilité côté client pour surveiller en temps réel les indicateurs de qualité d'un appel vidéo avec le SDK Vonage Video.