Observabilidad del cliente: Android
El SDK de video de Vonage expone métricas detalladas de la calidad de la transmisión a través de una API de estadísticas de alto nivel, recomendada para la mayoría de los casos de uso, que proporciona estadísticas de audio, video, red y del lado del emisor en una forma unificada y consciente de la sesión que permanece estable a través de las transiciones de conexión entre pares. Para la depuración avanzada, el SDK también ofrece acceso al informe de estadísticas WebRTC sin procesar, que refleja los datos de la conexión entre pares sin procesar.
API de estadísticas de audio y Video
El SDK para Android de Vonage Video envía estadísticas periódicas de la red de audio y video para editores y suscriptores. Estas incluyen recuentos de paquetes, tasas de bits, datos de velocidad de fotogramas, métricas de pausa/congelación, información de códec y estimación de red opcional del lado del remitente.
Las estadísticas se entregan a través de:
PublisherKit.NetworkStatsListener- estadísticas del editorSubscriberKit.NetworkStatsListener- estadísticas de abonados
Para recibirlos, active la escucha correspondiente en el editor o en el abonado.
Estadísticas para editores
Adjuntar un oyente para las estadísticas del editor:
publisher.setNetworkStatsListener(new PublisherKit.NetworkStatsListener() {
@Override
public void onVideoStats(PublisherKit publisher, PublisherKit.PublisherVideoStats[] statsArray) {
if (statsArray != null && statsArray.length > 0) {
// For routed sessions, first element is sufficient.
// For relayed sessions, iterate all statsArray elements to get per-subscriber info.
PublisherKit.PublisherVideoStats stats = statsArray[0];
String connectionId = (stats.connectionId != null && !stats.connectionId.isEmpty())
? stats.connectionId
: "<none>";
String subscriberId = (stats.subscriberId != null && !stats.subscriberId.isEmpty())
? stats.subscriberId
: "<none>";
Log.d("VideoStats", "Publisher Video Stats for connectionId: " + connectionId
+ ", subscriberId: " + subscriberId);
Log.d("VideoStats", "Video bytes sent: " + stats.videoBytesSent);
Log.d("VideoStats", "Video packets sent: " + stats.videoPacketsSent);
Log.d("VideoStats", "Video packets lost: " + stats.videoPacketsLost);
Log.d("VideoStats", "Stats timestamp: " + stats.timeStamp + " ms");
if (stats.videoLayers != null) {
for (PublisherKit.VideoLayerStats layer : stats.videoLayers) {
Log.d("VideoStats", "Layer: " + layer.width + "x" + layer.height);
Log.d("VideoStats", " Encoded FPS: " + layer.encodedFrameRate);
Log.d("VideoStats", " Bitrate: " + layer.bitrate + " bps");
Log.d("VideoStats", " Total bitrate (incl. RTP overhead): " + layer.totalBitrate + " bps");
Log.d("VideoStats", " Codec: " + (layer.codec != null ? layer.codec : "unknown"));
Log.d("VideoStats", " Scalability mode: " + (layer.scalabilityMode != null ? layer.scalabilityMode : "none"));
Log.d("VideoStats", " Quality limitation: " + layer.qualityLimitationReason);
}
}
if (stats.transport != null) {
Log.d("VideoStats", "Estimated uplink bandwidth: " + stats.transport.getConnectionEstimatedBandwidth() + " bps");
}
}
}
@Override
public void onAudioStats(PublisherKit publisher, PublisherKit.PublisherAudioStats[] statsArray) {
if (statsArray != null && statsArray.length > 0) {
// For routed sessions, first element is sufficient.
// For relayed sessions, iterate all statsArray elements to get per-subscriber info.
PublisherKit.PublisherAudioStats stats = statsArray[0];
String connectionId = (stats.connectionId != null && !stats.connectionId.isEmpty())
? stats.connectionId
: "<none>";
String subscriberId = (stats.subscriberId != null && !stats.subscriberId.isEmpty())
? stats.subscriberId
: "<none>";
Log.d("AudioStats", "Publisher Audio Stats for connectionId: " + connectionId
+ ", subscriberId: " + subscriberId);
Log.d("AudioStats", "Audio bytes sent: " + stats.audioBytesSent);
Log.d("AudioStats", "Audio packets sent: " + stats.audioPacketsSent);
Log.d("AudioStats", "Audio packets lost: " + stats.audioPacketsLost);
Log.d("AudioStats", "Stats timestamp: " + stats.timeStamp + " ms");
if (stats.transport != null) {
Log.d("AudioStats", "Estimated uplink bandwidth: " + stats.transport.getConnectionEstimatedBandwidth() + " bps");
}
}
}
});
Para un editor en una sesión enrutada (que utiliza la función Router multimedia de vídeo de Vonage), la matriz de estadísticas incluye un objeto, que define las estadísticas para el flujo de medios de audio o video único que se envía al enrutador de medios de video de Vonage. En una sesión retransmitida, la matriz de estadísticas incluye un objeto para cada suscriptor del flujo publicado. la transmisión publicada.
Recepción de eventos de calidad de vídeo en los editores
Para eventos con calidad de vídeo, impleméntalo:
@Override
public void onPublisherVideoQualityChanged(PublisherKit.PublisherVideoStats stats, String reason) {
Log.d("Stats", "Publisher video quality event: " + reason);
}
Activar las estadísticas para abonados
Adjuntar un receptor que implemente SubscriberKit.SubscriberKitNetworkStatsListener:
Subscriber subscriber = new Subscriber(stream);
subscriber.setNetworkStatsListener(new SubscriberKit.SubscriberKitNetworkStatsListener() {
@Override
public void onSubscriberVideoStatsUpdated(SubscriberKit.SubscriberVideoStats stats) {
Log.d("Stats", "Video bytes received: " + stats.videoBytesReceived);
}
@Override
public void onSubscriberAudioStatsUpdated(SubscriberKit.SubscriberAudioStats stats) {
Log.d("Stats", "Audio packets received: " + stats.audioPacketsReceived);
}
});
Recepción de eventos de calidad de vídeo en los abonados
Para eventos con calidad de vídeo, impleméntalo:
@Override
public void onSubscriberVideoQualityChanged(SubscriberKit.SubscriberVideoStats stats, String reason) {
Log.d("Stats", "Subscriber video quality event: " + reason);
}
Estructuras de datos estadísticos
Esta sección describe las estructuras y propiedades proporcionadas por la API de estadísticas de audio y vídeo de Android. Aunque todas las plataformas Video SDK exponen el mismo conjunto de estadísticas, puede haber pequeñas diferencias en la forma en que cada plataforma estructura o nombra los campos individuales. Estas variaciones reflejan convenciones de diseño del SDK específicas de cada plataforma más que diferencias en las métricas subyacentes.
Para una explicación independiente de la plataforma de las estadísticas disponibles y lo que representan, consulte visión general de la observabilidad del cliente.
TransportStats
Representa la estimación compartida a nivel de transporte.
connectionEstimatedBandwidth- Ancho de banda estimado de la conexión de enlace ascendente disponible (bps).
PublisherKit.PublisherVideoStats
Proporciona estadísticas sobre la pista de vídeo de un editor. Incluye:
connectionId- En una sesión retransmitida, el identificador de conexión del cliente que se suscribe al flujo. No definido en una sesión enrutada.subscriberId- En una sesión retransmitida, el ID suscrito del cliente que se suscribe al flujo. No definido en una sesión enrutada.videoPacketsLost- Estimación de paquetes de vídeo perdidos.videoPacketsSent- Paquetes de vídeo enviados.videoBytesSent- Bytes de vídeo enviados.timeStamp- Marca de tiempo Unix en milisegundos cuando se recopilaron las estadísticas.startTime- La marca de tiempo, en milisegundos desde la época Unix, a partir de la cual comenzaron a acumularse los totales acumulados.videoLayers- La matriz de estadísticas de la capa de vídeo (véaseOTPublisherKitVideoLayerStats).transport- Estadísticas de transporte.
PublisherKit.PublisherAudioStats
Proporciona estadísticas sobre la pista de audio de un editor. Incluye:
connectionId- En una sesión retransmitida, el identificador de conexión del cliente que se suscribe al flujo. No definido en una sesión enrutada.subscriberId- En una sesión retransmitida, el ID suscrito del cliente que se suscribe al flujo. No definido en una sesión enrutada.audioPacketsLost- Estimación de paquetes perdidos.audioPacketsSent- Paquetes de audio enviados.audioBytesSent- Bytes de audio enviados.timeStamp- Marca de tiempo Unix en milisegundos.startTime- La marca de tiempo, en milisegundos desde la época Unix, a partir de la cual comenzaron a acumularse los totales acumulados.transport- Estadísticas de transporte.
PublisherKit.VideoLayerStats
Representa una capa de emisión simultánea o capa SVC.
width- Anchura de trama codificada.height- Altura del fotograma codificado.encodedFrameRate- Fotogramas codificados por segundo.bitrate- Velocidad de bits de capa (bps).totalBitrate- Tasa de bits de capa, incluida la sobrecarga RTP (bps).scalabilityMode- Descriptor SVC/escalabilidad (por ejemplo, "L3T3").qualityLimitationReason- Motivo de la limitación de calidad (ancho de banda, CPU, códec, resolución o cambio de capa).codec- El códec utilizado por esta capa de vídeo.
SubscriberKit.SenderStats
Métricas de estimación del lado del emisor (reflejadas tanto en audio como en vídeo).
connectionMaxAllocatedBitrate- Tasa de bits máxima estimada para la conexión del remitente.connectionEstimatedBandwidth- Estimación del ancho de banda actual (bps).
SubscriberKit.SubscriberVideoStats
Proporciona estadísticas sobre la pista de vídeo de un abonado. Incluye:
videoPacketsLost- Estimación de paquetes de vídeo perdidos.videoPacketsReceived- Paquetes de vídeo recibidos.videoBytesReceived- Bytes de vídeo recibidos.timeStamp- Marca de tiempo Unix en milisegundos cuando se recopilaron las estadísticas.senderStats- Métricas del lado del remitente (opcional).width- Anchura del fotograma descodificado en píxeles.height- Altura del fotograma descodificado en píxeles.decodedFrameRate- Fotogramas decodificados por segundo.bitrate- Velocidad de bits de vídeo (bps).totalBitrate- Bitrate incluyendo la sobrecarga RTP (bps).pauseCount- Numbers de pausas (>5s desde el último fotograma). Incluye desactivaciones intencionadas y casos de audio-fallback.totalPausesDuration- Duración total de la pausa (ms).freezeCount- Recuento de congelaciones (evento de congelación definido por WebRTC).totalFreezesDuration- Duración total de la congelación (ms).codec- Códec decodificador actual.
SubscriberKit.SubscriberAudioStats
Proporciona estadísticas sobre la pista de audio de un abonado. Incluye:
audioPacketsLost- Estimación de paquetes perdidos.audioPacketsReceived- Paquetes recibidos.audioBytesReceived- Bytes recibidos.timeStamp- Marca de tiempo Unix en milisegundos.senderStats- Métricas del lado del remitente (opcional).
Estadísticas del remitente
Véase el estadísticas del lado del remitente.
Activación de las estadísticas del lado del remitente
Las estadísticas del lado del emisor se reciben en los abonados. Para recibir las estadísticas del lado del emisor, habilítelas para el editor del flujo estableciendo el parámetro senderStatisticsTrack propiedad a true al construir el editor:
Publisher publisher = new Publisher.Builder(context)
.senderStatsTrack(true) // Enable sender-side stats
.build();
Si senderStatsTrack no está activado, no se publicará ningún canal de estadísticas del remitente para este editor. El valor por defecto es false.
Suscripción a las estadísticas del lado del remitente
Los suscriptores reciben automáticamente las estadísticas del emisor sólo si el editor las ha habilitado y si el suscriptor registra un oyente para los eventos de estadísticas de red.
Recepción de eventos estadísticos
Las estadísticas del lado del remitente se envían a través de SubscriberKit.VideoStatsListener y SubscriberKit.AudioStatsListener para vídeo y audio. El sitio SubscriberKit.SubscriberVideoStats y SubscriberKit.SubscriberAudioStats incluyen estas propiedades:
connectionMaxAllocatedBitrate- El bitrate máximo que puede estimarse para la conexiónconnectionEstimatedBandwidth- La tasa de bits actual estimada para la conexión
Estas dos métricas se calculan por paquete de audio y vídeo, por lo que los mismos valores aparecen en las estadísticas de vídeo y audio. Como reflejan el transporte y no las pistas individuales, las métricas se comparten tanto en audio como en vídeo.
En stats incluye un objeto opcional senderStats que proporciona las estadísticas del lado del remitente. Por ejemplo, cuando se utiliza SubscriberKit.setVideoStatsListener()El stats es un parámetro SubscriberKit.SubscriberVideoStats objeto:
subscriber.setVideoStatsListener((subscriber, stats) -> {
if (stats.senderStats != null) {
Log.d(TAG, "Connection max allocated bitrate: " + stats.senderStats.connectionMaxAllocatedBitrate);
Log.d(TAG, "Connection current estimated bandwidth: " + stats.senderStats.connectionEstimatedBandwidth);
} else {
Log.d(TAG, "Sender stats not available yet.");
}
});
Lo mismo se aplica a las estadísticas de audio utilizando SubscriberKit.AudioStatsListener.
Informe de estadísticas de RTC
Para obtener estadísticas de conexión entre pares de bajo nivel para un editor, utilice la función PublisherKit.getRtcStatsReport() método. Proporciona informes de estadísticas RTC para el flujo de medios. Se trata de una operación asíncrona. Llame al método PublisherKit.setRtcStatsReportListener(PublisherKit.PublisherRtcStatsReportListener listener) y, a continuación, aplicar el método PublisherKit.PublisherRtcStatsReportListener.onRtcStatsReport(PublisherKit publisher, PublisherKit.PublisherRtcStats[] stats) antes de llamar a PublisherKit.getRtcStatsReport().
Cuando se dispone de las estadísticas, la aplicación de la función PublisherKit.PublisherRtcStatsReportListener.onRtcStatsReport(PublisherKit publisher, PublisherKit.PublisherRtcStats[] stats) se llama al método.
Una matriz de PublisherRtcStats se pasa a ese método. La dirección PublisherRtcStats incluye un objeto jsonArrayOfReports propiedad. Se trata de una matriz JSON de informes de estadísticas RTC, que son similares al formato del objeto RtcStatsReport implementado en los navegadores web (véase estos documentos de Mozilla).
Para obtener estadísticas de conexión entre pares de bajo nivel para un abonado, utilice la función SubscriberKit.getRtcStatsReport() método. Esto proporciona un informe de estadísticas RTC para el flujo de medios.
Se trata de una operación asíncrona. Llame al SubscriberKit.setRtcStatsReportListener(SubscriberKit.SubscriberRtcStatsReportListener listener) y, a continuación, aplicar el método SubscriberKit.SubscriberRtcStatsReportListener.onRtcStatsReport(SubscriberKit subscriber, java.lang.String jsonArrayOfReports) antes de llamar a SubscriberKit.getRtcStatsReport().
Cuando se dispone de las estadísticas, la aplicación de la función SubscriberKit.SubscriberRtcStatsReportListener.onRtcStatsReport(SubscriberKit subscriber, java.lang.String jsonArrayOfReports) . La dirección jsonArrayOfReports es una matriz JSON de informes de estadísticas RTC, que son similares al formato del objeto RtcStatsReport implementado en los navegadores web (véase estos documentos de Mozilla).
Véase también esta documentación del W3C.