Observabilidad del cliente: Linux

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 proporciona métricas sobre el estado de la red que ofrecen una evaluación general del estado de la conexión, tanto para los emisores como para los suscriptores. Estas métricas incluyen una puntuación del estado de la red, el motivo que explica dicha puntuación y, en el caso de los suscriptores, una fuente de degradación que indica qué lado de la conexión es responsable de los problemas observados. Véase Estado de la red y origen de la degradación Para más información.

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

El SDK de Vonage Video Linux envía estadísticas periódicas de audio, video y enlaces de medios de red para editores y suscriptores. Estas incluyen recuentos de paquetes, velocidades 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 de estado de la red.

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

  • otc_publisher_callbacks - estadísticas del editor

  • otc_subscriber_callbacks - estadísticas de abonados

Para recibirlos, active la devolución de llamada correspondiente en el editor o el suscriptor.

Estadísticas para editores

Utilice las funciones de devolución de llamada on_audio_stats() y on_video_stats() de la aplicación otc_publisher_callbacks para supervisar las estadísticas del flujo de un editor. Para registrar métodos de devolución de llamada para informes periódicos de estadísticas de audio y vídeo de un editor, defina el parámetro on_audio_stats() y on_video_stats() funciones de devolución de llamada al inicializar el otc_publisher_callbacks estructura que debe utilizar la editorial.

Registre un otc_publisher_callbacks estructura al crear el editor:

struct otc_publisher_callbacks pub_callbacks;
pub_callbacks.on_audio_stats = handle_publisher_audio_stats;
pub_callbacks.on_video_stats = handle_publisher_video_stats;
pub_callbacks.on_video_quality_changed = handle_publisher_quality_change;
pub_callbacks.on_media_link_stats = handle_publisher_media_link_stats;

E implementa las funciones de devolución de llamada:

void handle_publisher_audio_stats(otc_publisher* publisher,
                                  void* user_data,
                                  struct otc_publisher_audio_stats audio_stats[],
                                  size_t number_of_stats) {
    printf("Audio bytes sent: %lld\n", (long long)audio_stats[0].bytes_sent);
}

void handle_publisher_video_stats(otc_publisher* publisher,
                                  void* user_data,
                                  struct otc_publisher_video_stats video_stats[],
                                  size_t number_of_stats) {
    printf("Video packets sent: %lld\n", (long long)video_stats[0].packets_sent);
}

void handle_publisher_media_link_stats(otc_publisher* publisher,
                                        void* user_data,
                                        struct otc_publisher_media_link_stats media_link_stats[],
                                        size_t number_of_stats) {
    printf("Publisher uplink bandwidth: %lld bps\n", (long long)media_link_stats[0].transport.connection_estimated_bandwidth);
    printf("Network condition: %d\n", (int)media_link_stats[0].transport.network_condition);
    printf("Condition reason: %d\n", (int)media_link_stats[0].transport.network_condition_reason);
}

Estas funciones de devolución de llamada se activan periódicamente para proporcionar estadísticas de audio y vídeo al editor. A cada función se le pasa lo siguiente: un puntero al editor struct, un puntero a la datos_usuario que estableciste para el editor, una matriz de estadísticas y el número de estadísticas de la matriz. El parámetro stats está definido por el parámetro otc_publisher_audio_stats y otc_publisher_video_stats structs. Para un editor en una sesión enrutada (que utiliza el OpenTok Router multimedia), el array incluye un objeto que define las estadísticas de la única secuencia multimedia de audio o vídeo que se envía al Vonage Video Media Router. En una sesión retransmitida, el array incluye un objeto por cada suscriptor de la secuencia publicada.

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

Para eventos relacionados con la calidad de vídeo de los editores:

void handle_publisher_quality_change(otc_publisher* publisher,
                                     void* user_data,
                                     const struct otc_publisher_video_stats* stats,
                                     enum otc_video_reason reason) {
    printf("Publisher video quality event: %d\n", reason);
}

Recepción de eventos sobre el estado de la red en el editor

Para recibir eventos de cambio de estado de la red para el editor, establezca el parámetro on_network_condition_changed función de devolución de llamada en el otc_publisher_callbacks estructura:

void handle_publisher_network_condition(otc_publisher* publisher,
                                        void* user_data,
                                        const struct otc_publisher_media_link_stats* media_link_stats,
                                        enum otc_network_reason reason) {
    printf("Publisher network condition: %d\n", (int)media_link_stats->transport.network_condition);
    printf("Reason: %d\n", (int)media_link_stats->transport.network_condition_reason);
}

Regístrela junto con las demás devoluciones de llamada:

pub_callbacks.on_network_condition_changed = handle_publisher_network_condition;

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.

Activar las estadísticas para abonados

Utilice las funciones de devolución de llamada on_audio_stats() y on_video_stats() de la aplicación otc_subscriber_callbacks para supervisar las estadísticas de la transmisión de un suscriptor.

Registre un otc_subscriber_callbacks estructura al crear el suscriptor:

struct otc_subscriber_callbacks sub_callbacks;
sub_callbacks.on_audio_stats = handle_subscriber_audio_stats;
sub_callbacks.on_video_stats = handle_subscriber_video_stats;
sub_callbacks.on_video_quality_changed = handle_subscriber_quality_change;
sub_callbacks.on_media_link_stats = handle_subscriber_media_link_stats;

otc_subscriber* subscriber = otc_subscriber_new(stream, sub_callbacks, user_data);

Implementa las funciones de devolución de llamada:

void handle_subscriber_audio_stats(otc_subscriber* subscriber,
                                   void* user_data,
                                   struct otc_subscriber_audio_stats audio_stats) {
    printf("Audio packets received: %llu\n", audio_stats.packets_received);
}

void handle_subscriber_video_stats(otc_subscriber* subscriber,
                                   void* user_data,
                                   struct otc_subscriber_video_stats video_stats) {
    printf("Video bytes received: %llu\n", video_stats.bytes_received);
}

void handle_subscriber_media_link_stats(otc_subscriber* subscriber,
                                          void* user_data,
                                          const struct otc_subscriber_media_link_stats* media_link_stats,
                                          size_t number_of_stats) {
    printf("Local downlink bandwidth: %lld bps\n", (long long)media_link_stats->transport.connection_estimated_bandwidth);
    printf("Remote publisher uplink bandwidth: %lld bps\n", (long long)media_link_stats->remote_publisher_transport.connection_estimated_bandwidth);
    printf("Degradation source: %d\n", (int)media_link_stats->network_degradation_source);
}

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

Para eventos relacionados con la calidad de vídeo de los editores:

void handle_subscriber_quality_change(otc_subscriber* subscriber,
                                      void* user_data,
                                      const struct otc_subscriber_video_stats* stats,
                                      enum otc_video_reason reason) {
    printf("Subscriber video quality event: %d\n", reason);
}

Recepción de eventos sobre el estado de la red en el abonado

Para recibir eventos de cambio de estado de la red para el abonado, configure la opción on_network_condition_changed función de devolución de llamada en el otc_subscriber_callbacks estructura:

void handle_subscriber_network_condition(otc_subscriber* subscriber,
                                          void* user_data,
                                          const struct otc_subscriber_media_link_stats* media_link_stats,
                                          enum otc_network_reason reason) {
    printf("Local network condition: %d\n", (int)media_link_stats->transport.network_condition);
    printf("Remote publisher network condition: %d\n", (int)media_link_stats->remote_publisher_transport.network_condition);
    printf("Degradation source: %d\n", (int)media_link_stats->network_degradation_source);
}

Regístrela junto con las demás devoluciones de llamada:

sub_callbacks.on_network_condition_changed = handle_subscriber_network_condition;

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 métricas de transporte local y remoto y fuente de degradación.

Estadística y estructuras de datos

Esta sección describe los structs y campos proporcionados por la API de estadísticas de audio y vídeo del SDK de C. 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.

otc_transport_stats

Representa métricas compartidas a nivel de transporte.

  • connection_estimated_bandwidth — Ancho de banda estimado de la conexión (bps)
  • network_condition — Puntuación del estado actual de la red (OTC_NETWORK_CONDITION_UNKNOWN, OTC_NETWORK_CONDITION_CRITICAL, OTC_NETWORK_CONDITION_WARNING, OTC_NETWORK_CONDITION_FAIR, OTC_NETWORK_CONDITION_GOOD, o OTC_NETWORK_CONDITION_EXCELLENT)
  • network_condition_reason — Motivo principal que afecta al estado de la red (OTC_NETWORK_REASON_NONE, OTC_NETWORK_REASON_UNKNOWN, OTC_NETWORK_REASON_BANDWIDTH, o OTC_NETWORK_REASON_PACKET_LOSS)

otc_publisher_video_stats

Ofrece estadísticas sobre la trayectoria de los vídeos de un editor:

  • connection_id — En una sesión retransmitida, el identificador de conexión del cliente suscrito a la transmisión
  • subscriber_id — En una sesión retransmitida, el identificador de suscriptor del cliente que se suscribe a la transmisión
  • packets_lost — Estimación de paquetes de vídeo perdidos
  • packets_sent - Paquetes de vídeo enviados
  • bytes_sent — Bytes de vídeo enviados
  • timestamp - Unix timestamp en milisegundos
  • start_time — La marca de tiempo, en milisegundos desde la época Unix, a partir de la cual comenzaron a acumularse los totales acumulados
  • video_layers - Matriz de estadísticas de la capa de vídeo (véase otc_publisher_video_layer_stats)

otc_publisher_audio_stats

Ofrece estadísticas sobre la pista de audio de un editor:

  • connection_id — En una sesión retransmitida, el identificador de conexión del cliente suscrito a la transmisión
  • subscriber_id - En una sesión retransmitida, el identificador de abonado
  • packets_lost — Estimación de paquetes de audio perdidos
  • packets_sent - Paquetes de audio enviados
  • bytes_sent - Bytes de audio enviados
  • timestamp - Unix timestamp en milisegundos
  • start_time — La marca de tiempo, en milisegundos desde la época Unix, a partir de la cual comenzaron a acumularse los totales acumulados

otc_publisher_video_layer_stats

Representa una capa de emisión simultánea o SVC:

  • width — Ancho de fotograma codificado
  • height - Altura del fotograma codificado
  • encoded_frame_rate - fps codificados
  • bitrate - Velocidad de bits de capa (bps)
  • total_bitrate - Tasa de bits de capa, incluida la sobrecarga RTP (bps)
  • scalability_mode - Descriptor SVC/escalabilidad (por ejemplo, "L3T3")
  • quality_limitation_reason — Motivo de la limitación de calidad (ancho de banda, CPU, códec, resolución o cambio de capa)
  • codec - Codec utilizado para esta capa de vídeo

otc_subscriber_video_stats

Proporciona estadísticas sobre la pista de vídeo de un suscriptor:

  • packets_lost — Estimación de paquetes de vídeo perdidos
  • packets_received - Paquetes de vídeo recibidos
  • bytes_received — Bytes de vídeo recibidos
  • timestamp - Unix timestamp en milisegundos
  • sender_connection_max_allocated_bitrate - Velocidad de bits máxima opcional del lado del remitente
  • sender_connection_estimated_bandwidth - Ancho de banda estimado por el remitente opcional
  • width — Ancho del fotograma descodificado en píxeles
  • height - Altura del fotograma descodificado en píxeles
  • decoded_frame_rate - Fotogramas descodificados por segundo
  • bitrate — Velocidad de transmisión de vídeo (bps)
  • total_bitrate — Velocidad de bits, incluida la sobrecarga de RTP (bps)
  • pause_count — Número de pausas (más de 5 s desde el último fotograma)
  • total_pauses_duration - Duración total de la pausa (ms)
  • freeze_count - Numbers of freezes
  • total_freezes_duration — Duración total de la congelación (ms)
  • codec - Códec decodificador actual

otc_subscriber_audio_stats

Proporciona estadísticas sobre la pista de audio de un abonado:

  • packets_lost — Paquetes perdidos estimados
  • packets_received - Paquetes recibidos
  • bytes_received - Bytes recibidos
  • audio_level — Nivel de audio (0–1,0)
  • timestamp - Unix timestamp en milisegundos
  • sender_connection_max_allocated_bitrate - Velocidad de bits máxima opcional del lado del remitente
  • sender_connection_estimated_bandwidth - Ancho de banda estimado por el remitente opcional
  • transport — Estadísticas de tráfico local y de red de este abonado (véase otc_transport_stats). Puede verse limitado si las estadísticas del remitente y/o la opción de audio alternativo están desactivadas.
  • remote_publisher_transport - Estadísticas de transporte y red del editor remoto (véase otc_transport_stats). Puede verse limitado si las estadísticas del remitente y/o la opción de audio alternativo están desactivadas.

otc_publisher_media_link_stats

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

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

otc_subscriber_media_link_stats

Proporciona estadísticas a nivel de transporte sobre las conexiones de un abonado.

  • transport — Estadísticas de tráfico de la conexión de bajada de este abonado (véase otc_transport_stats)
  • remote_publisher_transport - Estadísticas de transporte de la conexión de enlace ascendente del editor remoto (véase otc_transport_stats). Puede estar limitado si las estadísticas del lado del remitente no están activadas.
  • network_degradation_source - Indica la fuente de degradación de la red, si la hay (OTC_NETWORK_DEGRADATION_SOURCE_NONE, OTC_NETWORK_DEGRADATION_SOURCE_LOCAL, OTC_NETWORK_DEGRADATION_SOURCE_REMOTE, o OTC_NETWORK_DEGRADATION_SOURCE_BOTH_OR_UNCLEAR)

Estadísticas del remitente

Véase el Resumen de las estadísticas del lado del remitente.

Activación de las estadísticas 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 llamando a otc_publisher_settings_set_sender_stats_track() antes de construir el editor:

otc_publisher_settings* settings = otc_publisher_settings_new();
otc_publisher_settings_set_sender_stats_track(settings, OTC_TRUE);

otc_publisher* publisher = otc_publisher_new_with_settings( &publisher_callbacks, settings);

Si la pista de estadísticas del remitente no está activada, no se publicará ningún canal de estadísticas del remitente para este editor. El valor por defecto es OTC_FALSE.

Recepción de estadísticas del remitente

Si el editor ha activado las estadísticas del remitente, los suscriptores las reciben automáticamente a través de las respuestas de las estadísticas. descrito anteriormente. En otc_subscriber_video_stats y otc_subscriber_audio_stats incluyen dos campos del lado del remitente:

  • sender_connection_max_allocated_bitrate - El bitrate máximo que puede estimarse para la conexión
  • sender_connection_estimated_bandwidth - El ancho de banda estimado actual para la conexión

Estas métricas se calculan por paquete de audio y vídeo, por lo que los mismos valores aparecen tanto en las estadísticas de vídeo como en las de audio.

void handle_subscriber_video_stats(otc_subscriber* subscriber,
                                   void* user_data,
                                   struct otc_subscriber_video_stats stats) {
    printf("Connection max allocated bitrate: %lld bps\n", (long long)stats.sender_connection_max_allocated_bitrate);
    printf("Connection estimated bandwidth: %lld bps\n", (long long)stats.sender_connection_estimated_bandwidth);
}

Estado y degradación de la red Fuente

El SDK proporciona métricas en tiempo real sobre el estado de la red tanto para los editores como para los suscriptores, incluyendo una puntuación de estado, el motivo que la determina y, en el caso de los suscriptores, la fuente de la degradación. Para obtener una explicación detallada del modelo de estado de la red, las puntuaciones, los motivos y cómo activarlo, consulta el 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: En transport en las estadísticas del editor y del abonado incluye network_condition y network_condition_reason. Las estadísticas de los abonados también exponen remote_publisher_transport y network_degradation_source. Véase Estructuras estadísticas Para más información.
  • Eventos relacionados con cambios en el estado de la red: Devoluciones de llamada dedicadas en ambos editor y suscriptor se activan cuando se detecta un cambio significativo en el estado de la red.

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

void handle_subscriber_network_condition(otc_subscriber* subscriber,
                                          void* user_data,
                                          const struct otc_subscriber_video_stats* video_stats,
                                          const struct otc_subscriber_audio_stats* audio_stats,
                                          enum otc_network_reason reason) {
    enum otc_network_condition local_condition = video_stats->transport.network_condition;
    enum otc_network_condition remote_condition = video_stats->remote_publisher_transport.network_condition;
    enum otc_network_degradation_source source = video_stats->network_degradation_source;

    if (source == OTC_NETWORK_DEGRADATION_SOURCE_LOCAL) {
        printf("Local network is degraded (condition: %d)\n", (int)local_condition);
    } else if (source == OTC_NETWORK_DEGRADATION_SOURCE_REMOTE) {
        printf("Remote publisher network is degraded (condition: %d)\n", (int)remote_condition);
    } else if (source == OTC_NETWORK_DEGRADATION_SOURCE_BOTH_OR_UNCLEAR) {
        printf("Degradation source unclear — local: %d, remote: %d\n", (int)local_condition, (int)remote_condition);
    }
}

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 otc_publisher_get_rtc_stats_report() función. Proporciona informes de estadísticas de RTC para la transmisión multimedia. Se trata de una operación asíncrona. Crea un otc_publisher_rtc_stats_report_cb struct y pasarla a la otc_publisher_set_rtc_stats_report_cb antes de llamar a otc_publisher_get_rtc_stats_report(). Cuando las estadísticas estén disponibles, el otc_publisher_rtc_stats_report_cb.on_rtc_stats_report() se llama a la función callback. Esta función incluye un stats parámetro, que es un puntero a una matriz de otc_publisher_rtc_stats structs. Esta estructura incluye un json_array_of_reports propiedad. Se trata de una matriz JSON de informes de estadísticas de RTC, cuyo formato es similar al 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 otc_subscriber_get_rtc_stats_report() función. Esto proporciona un informe de estadísticas RTC para la transmisión multimedia.

Esta es una operación asíncrona. Crea un otc_subscriber_rtc_stats_report_cb struct y pasarla a la otc_subscriber_set_rtc_stats_report_cb antes de llamar a otc_subscriber_get_rtc_stats_report(). Cuando las estadísticas estén disponibles, el otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report Se invoca la función de devolución de llamada.

Esta función de devolución de llamada incluye un json_array_of_reports parámetro. Se trata de una matriz JSON de informes de estadísticas de RTC, cuyo formato es similar al del objeto `RtcStatsReport` implementado en los navegadores web (véase estos documentos de Mozilla).

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