Observabilidad del cliente: iOS

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.

El SDK también expone métricas del estado de la red que proporcionan una evaluación de alto nivel del estado de la conexión tanto para editores como para abonados. Estas métricas incluyen una puntuación del estado de la red, el motivo de dicha puntuación y, para los abonados, una fuente de degradación que indica qué lado de la conexión es responsable de cualquier problema observado. Véase Estado de la red y fuente de degradación para más detalles.

API de estadísticas de audio, vídeo y enlaces multimedia

El SDK para iOS de Vonage Video envía estadísticas periódicas de audio, video y enlaces multimedia tanto para editores como para 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 métricas de red a nivel de transporte, como estimación de ancho de banda y puntuación del estado de la red.

Las estadísticas se entregan a través de:

  • OTPublisherKitNetworkStatsDelegate - estadísticas del editor (audio, vídeo)

  • OTSubscriberKitNetworkStatsDelegate - estadísticas del lado del abonado (audio, vídeo)

Para recibirlos, active el delegado correspondiente en el editor o el suscriptor.

Estadísticas para editores

Adjunta una clase que adopte OTPublisherKitNetworkStatsDelegate:

@interface MyViewController () <OTPublisherKitDelegate, OTPublisherKitNetworkStatsDelegate>
@end

OTPublisher *publisher = [[OTPublisher alloc] initWithDelegate:self
                                                      settings:settings];
publisher.networkStatsDelegate = self;

Implementar los callbacks:

- (void)publisher:(OTPublisherKit *)publisher
videoNetworkStatsUpdated:(NSArray<OTPublisherKitVideoNetworkStats *> *)statsArray {

    OTPublisherKitVideoNetworkStats *stats = statsArray.firstObject;
    if (!stats) return;

    // For routed sessions, the first element is sufficient.
    // For relayed sessions, iterate all elements if you want per-subscriber stats.
    NSString *connectionId = stats.connectionId ?: @"<none>";
    NSString *subscriberId = stats.subscriberId ?: @"<none>";

    NSLog(@"Publisher Video Stats for connectionId: %@, subscriberId: %@", connectionId, subscriberId);
    NSLog(@"Video bytes sent: %lld", stats.videoBytesSent);
    NSLog(@"Video packets sent: %lld", stats.videoPacketsSent);
    NSLog(@"Video packets lost: %lld", stats.videoPacketsLost);
    NSLog(@"Stats timestamp: %f ms", stats.timestamp);

    for (OTPublisherKitVideoLayerStats *layer in stats.videoLayers) {
        NSLog(@"Layer: %dx%d", layer.width, layer.height);
        NSLog(@"  Encoded FPS: %f", layer.encodedFrameRate);
        NSLog(@"  Bitrate: %lld bps", layer.bitrate);
        NSLog(@"  Total bitrate (incl. RTP overhead): %lld bps", layer.totalBitrate);
        NSLog(@"  Codec: %@", layer.codec ?: @"unknown");
        NSLog(@"  Scalability mode: %@", layer.scalabilityMode ?: @"none");
        NSLog(@"  Quality limitation: %@", @(layer.qualityLimitationReason));
    }
}

- (void)publisher:(OTPublisherKit *)publisher
audioNetworkStatsUpdated:(NSArray<OTPublisherKitAudioNetworkStats *> *)statsArray {

    OTPublisherKitAudioNetworkStats *stats = statsArray.firstObject;
    if (!stats) return;

    // For routed sessions, the first element is sufficient.
    // For relayed sessions, iterate all elements if you want per-subscriber stats.
    NSString *connectionId = stats.connectionId ?: @"<none>";
    NSString *subscriberId = stats.subscriberId ?: @"<none>";

    NSLog(@"Publisher Audio Stats for connectionId: %@, subscriberId: %@", connectionId, subscriberId);
    NSLog(@"Audio bytes sent: %lld", stats.audioBytesSent);
    NSLog(@"Audio packets sent: %lld", stats.audioPacketsSent);
    NSLog(@"Audio packets lost: %lld", stats.audioPacketsLost);
    NSLog(@"Stats timestamp: %f ms", stats.timestamp);
}

- (void)publisher:(OTPublisherKit *)publisher
mediaLinkStatsUpdated:(NSArray<OTPublisherKitMediaLinkStats*>*)mediaLinkStats {
    
    if (mediaLinkStats.count == 0) return;
    OTPublisherKitMediaLinkStats *stats = mediaLinkStats.firstObject;
    
    NSLog(@"Publisher uplink bandwidth: %lld bps", stats.transport.connectionEstimatedBandwidth);
    NSLog(@"Network condition: %ld", (long)stats.transport.networkCondition);
    NSLog(@"Condition reason: %ld", (long)stats.transport.networkConditionReason);
}

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

Si también te interesan los eventos de calidad de vídeo, implementa esta devolución de llamada:

- (void)publisher:(OTPublisherKit *)publisher
videoQualityChanged:(OTPublisherKitVideoNetworkStats *)stats
           reason:(OTPublisherVideoEventReason)reason {

    NSLog(@"Publisher video quality event: %ld", (long)reason);
}

Recepción de eventos de estado de la red en los editores

Para recibir eventos de cambio de estado de la red para el editor, implemente la función publisher:networkConditionChanged:mediaLinkStats:reason: devolución de llamada:

- (void)publisher:(OTPublisherKit *)publisher
networkConditionChanged:(OTPublisherKitMediaLinkStats *)mediaLinkStats
             reason:(OTNetworkReason)reason {

    NSLog(@"Publisher network condition changed: %ld", (long)mediaLinkStats.transport.networkCondition);
    NSLog(@"Reason: %ld", (long)mediaLinkStats.transport.networkConditionReason);
}

Esta llamada de retorno se activa cuando se detecta un cambio significativo en las condiciones de la red para el editor. Incluye las estadísticas actuales del enlace multimedia con métricas de transporte. Véase Estado de la red y fuente de degradación para más detalles sobre la interpretación de las puntuaciones y razones del estado de la red.

Activar las estadísticas para abonados

Adjuntar una clase que adopte OTSubscriberKitNetworkStatsDelegate:

@interface MyViewController () <OTSubscriberKitDelegate, OTSubscriberKitNetworkStatsDelegate>
@end

OTSubscriber *subscriber = [[OTSubscriber alloc] initWithStream:stream
                                                       delegate:self];
subscriber.networkStatsDelegate = self;
[session subscribe:subscriber error:nil];

Implementar los callbacks:

- (void)subscriber:(OTSubscriberKit *)subscriber
videoNetworkStatsUpdated:(OTSubscriberKitVideoNetworkStats *)stats {
    NSLog(@"Video bytes received: %llu", stats.videoBytesReceived);
}

- (void)subscriber:(OTSubscriberKit *)subscriber
audioNetworkStatsUpdated:(OTSubscriberKitAudioNetworkStats *)stats {
    NSLog(@"Audio packets received: %llu", stats.audioPacketsReceived);
}

- (void)subscriber:(OTSubscriberKit *)subscriber
mediaLinkStatsUpdated:(OTSubscriberKitMediaLinkStats *)mediaLinkStats {
    
    NSLog(@"Local downlink bandwidth: %lld bps", mediaLinkStats.transport.connectionEstimatedBandwidth);
    NSLog(@"Remote publisher uplink bandwidth: %lld bps", mediaLinkStats.remotePublisherTransport.connectionEstimatedBandwidth);
    NSLog(@"Degradation source: %ld", (long)mediaLinkStats.networkDegradationSource);
}

Recepción de eventos de calidad de vídeo en los abonados

Además, gestiona los eventos de cambio de calidad de vídeo de los abonados:

- (void)subscriber:(OTSubscriberKit *)subscriber
videoQualityChanged:(OTSubscriberKitVideoNetworkStats *)stats
            reason:(OTSubscriberVideoEventReason)reason {

    NSLog(@"Subscriber video quality event: %ld", (long)reason);
}

Recepción de eventos de estado de la red en los abonados

Para recibir eventos de cambio de estado de la red para el abonado, implemente la función subscriber:networkConditionChanged:mediaLinkStats:reason: devolución de llamada:

- (void)subscriber:(OTSubscriberKit *)subscriber
networkConditionChanged:(OTSubscriberKitMediaLinkStats *)mediaLinkStats
             reason:(OTNetworkReason)reason {

    NSLog(@"Local network condition: %ld", (long)mediaLinkStats.transport.networkCondition);
    NSLog(@"Remote publisher network condition: %ld", (long)mediaLinkStats.remotePublisherTransport.networkCondition);
    NSLog(@"Degradation source: %ld", (long)mediaLinkStats.networkDegradationSource);
}

Esta llamada de retorno se activa cuando se detecta un cambio significativo en las condiciones de la red para el abonado o el editor remoto. Incluye las estadísticas actuales del enlace multimedia con las métricas de transporte local y remoto y la fuente de degradación. Véase Estado de la red y fuente de degradación para más detalles sobre la interpretación de las puntuaciones y razones del estado de la red.

Estructuras de datos estadísticos

En esta sección se describen las estructuras y propiedades que proporciona la API de estadísticas de audio y vídeo de iOS. 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.

OTTransportStats

Representa métricas compartidas a nivel de transporte.

  • connectionEstimatedBandwidth - Ancho de banda de conexión disponible estimado (bps).
  • networkCondition - Puntuación del estado actual de la red (OTNetworkConditionUnknown, OTNetworkConditionCritical, OTNetworkConditionWarning, OTNetworkConditionFair, OTNetworkConditionGoodo OTNetworkConditionExcellent).
  • networkConditionReason - Razón principal que afecta al estado de la red (OTNetworkReasonNone, OTNetworkReasonUnknown, OTNetworkReasonBandwidtho OTNetworkReasonPacketLoss).

OTPublisherKitVideoNetworkStats

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éase OTPublisherKitVideoLayerStats).

OTPublisherKitAudioNetworkStats

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 red a nivel de transporte.

OTPublisherKitVideoLayerStats

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.

OTSenderStats

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

OTSubscriberKitVideoNetworkStats

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.

OTSubscriberKitAudioNetworkStats

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

OTPublisherKitMediaLinkStats

Proporciona estadísticas a nivel de transporte para la conexión de un editor.

  • transport - Estadísticas de transporte de este editor (véase OTTransportStats)

OTSubscriberKitMediaLinkStats

Proporciona estadísticas a nivel de transporte para las conexiones de un abonado, incluida la visibilidad del rendimiento de la red del editor remoto. Esto permite a las aplicaciones diagnosticar si los problemas de conexión se originan en el enlace descendente del abonado o en el enlace ascendente del editor.

  • transport - Estadísticas de transporte para la conexión de enlace descendente de este abonado (véase OTTransportStats)
  • remotePublisherTransport - Estadísticas de transporte de la conexión de enlace ascendente del editor remoto (obtenidas mediante estadísticas del lado del remitenteVer OTTransportStats). Estas estadísticas pueden estar limitadas si las estadísticas del lado del remitente no están activadas.
  • networkDegradationSource - Indica la fuente de degradación de la red (OTNetworkDegradationSourceLocal, OTNetworkDegradationSourceRemote, OTNetworkDegradationSourceBothOrUnclearo OTNetworkDegradationSourceUnknown)

Estadísticas del lado 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 senderStatsTrack propiedad a true para la OTPublisherKitSettings utilizado para crear el editor.

OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.senderStatsTrack = YES;

OTPublisher *publisher = [[OTPublisher alloc] initWithDelegate:self
                                                      settings:settings];

Si senderStatsTrack no está activado, no se publicará ningún canal de estadísticas del remitente para este editor. El valor por defecto es NO.

Suscripción a las estadísticas del lado del remitente

Si el editor del flujo ha activado las estadísticas del lado del remitente, los abonados empezarán a recibirlas automáticamente en cuanto un oyente se registre para recibir estadísticas de vídeo o audio, como se ha descrito anteriormente.

Implementa el método delegado para las estadísticas de vídeo:

- (void)subscriber:(OTSubscriberKit *)subscriber
videoNetworkStatsUpdated:(OTSubscriberKitVideoNetworkStats *)stats
{
    // The property may be nil if no sender statistics have been received yet.
    if (stats.senderStats) {
        OTSenderStats *sender = stats.senderStats;
        NSLog(@"Connection max allocated bitrate: %lld bps", (long long)sender.connectionMaxAllocatedBitrate);
        NSLog(@"Connection current estimated bandwidth: %lld bps", (long long)sender.connectionEstimatedBandwidth);
    } else {
        NSLog(@"Sender-side stats not available yet.");
    }
}

Del mismo modo -subscriber:audioNetworkStatsUpdated: para estadísticas de audio, que también incluye un senderStats propiedad.

Recepción de eventos estadísticos

Las estadísticas del lado del remitente se envían a través de OTSubscriberKitNetworkStatsDelegate para vídeo y audio, como se muestra arriba. El sitio OTSenderStatsincluido como senderStats miembro en ambos OTSubscriberKitVideoNetworkStats y OTSubscriberKitAudioNetworkStatsproporciona dos propiedades:

  • connectionMaxAllocatedBitrate - El bitrate máximo que puede estimarse para la conexión
  • connectionEstimatedBandwidth - El ancho de banda estimado actual 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.

Estado de la red y fuente de degradación

El SDK proporciona métricas del estado de la red en tiempo real tanto para editores como para suscriptores, incluyendo una puntuación del estado, la razón que impulsa esa puntuación y una fuente de degradación para los suscriptores. Para obtener una explicación completa del modelo de estado de la red, las puntuaciones, los motivos y cómo activarlo, consulte la página visión general de la observabilidad del cliente.

Los datos sobre el estado de la red están disponibles a través de dos canales:

  • Estadísticas periódicas: Los eventos de estadísticas de enlaces multimedia incluyen métricas de transporte con networkCondition y networkConditionReason. Para los abonados, las estadísticas de los enlaces multimedia también incluyen remotePublisherTransport y networkDegradationSource.
  • Eventos de cambio de estado de la red: Cuando se detecta un cambio significativo en las condiciones de la red, se activan retrollamadas específicas tanto en el editor como en el suscriptor.

El siguiente ejemplo muestra cómo utilizar los datos de estado de la red del abonado para identificar la fuente de degradación:

- (void)subscriber:(OTSubscriberKit *)subscriber
networkConditionChanged:(OTSubscriberKitMediaLinkStats *)mediaLinkStats
             reason:(OTNetworkReason)reason {

    OTNetworkCondition localCondition = mediaLinkStats.transport.networkCondition;
    OTNetworkCondition remoteCondition = mediaLinkStats.remotePublisherTransport.networkCondition;
    OTNetworkDegradationSource source = mediaLinkStats.networkDegradationSource;

    if (source == OTNetworkDegradationSourceLocal) {
        NSLog(@"Local network is degraded (condition: %ld)", (long)localCondition);
    } else if (source == OTNetworkDegradationSourceRemote) {
        NSLog(@"Remote publisher network is degraded (condition: %ld)", (long)remoteCondition);
    } else if (source == OTNetworkDegradationSourceBothOrUnclear) {
        NSLog(@"Degradation source unclear — local: %ld, remote: %ld", (long)localCondition, (long)remoteCondition);
    }
}

Informe de estadísticas de RTC

Para obtener las estadísticas de conexión entre pares de bajo nivel del editor, utilice la función [OTPublisherKit getRtcStatsReport:] método. Esto proporciona informes de estadísticas RTC para el flujo de medios.

Se trata de una operación asíncrona. Establezca el >[OTPublisherKit rtcStatsReportDelegate]> e implementar la propiedad >[OTPublisherKitRtcStatsReportDelegate publisher:rtcStatsReport:]> antes de llamar a [OTPublisherKit getRtcStatsReport:].

Cuando se dispone de las estadísticas, la aplicación de la función >[OTPublisherKitRtcStatsReportDelegate publisher:rtcStatsReport:]> se envía el mensaje. El mensaje incluye una matriz de OTPublisherRtcStats que incluye un 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 bajo nivel de las conexiones entre pares de abonados, utilice la función [OTSubscriberKit getRtcStatsReport:] método. Esto proporciona un informe de estadísticas RTC para el flujo de medios.

Se trata de una operación asíncrona. Establezca el [OTSubscriberKit rtcStatsReportDelegate]> e implementar la propiedad >[OTSubscriberKitRtcStatsReportDelegate subscriber:rtcStatsReport:]> antes de llamar a [OTSubscriberKit getRtcStatsReport:].

Cuando se dispone de las estadísticas, la aplicación de la función >[OTSubscriberKitRtcStatsReportDelegate subscriber:rtcStatsReport:]> se envía el mensaje. El mensaje incluye un jsonArrayOfReports parámetro.

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

Véase también esta documentación del W3C.

Muestra

En Aplicación de muestra de observabilidad del Client SDK de Vonage Video para iOS demuestra las funciones de observabilidad del cliente en una aplicación móvil creada con el Client SDK de iOS.