Observabilidade do cliente: Linux
O SDK de vídeo da Vonage disponibiliza métricas detalhadas sobre a qualidade do fluxo por meio de uma API de estatísticas de alto nível — recomendada para a maioria dos casos de uso —, que fornece estatísticas de áudio, vídeo, rede e do lado do remetente de forma unificada e sensível à sessão, mantendo-se estável durante as transições entre conexões entre pares. Para depuração avançada, o SDK também oferece acesso ao relatório bruto de estatísticas do WebRTC, que reflete dados não processados das conexões entre pares.
O SDK também disponibiliza métricas de condição de rede que oferecem uma avaliação geral do estado da conexão, tanto para emissores quanto para assinantes. Essas métricas incluem uma pontuação de condição de rede, o motivo por trás dessa pontuação e — para os assinantes — uma fonte de degradação que indica qual lado da conexão é responsável por quaisquer problemas observados. Consulte Condição da rede e fonte de degradação para mais detalhes.
API de estatísticas de links de áudio, vídeo e mídia
O SDK do Vonage Video para Linux envia estatísticas periódicas de rede relacionadas a áudio, vídeo e links de mídia, tanto para emissores quanto para assinantes. Essas estatísticas incluem contagem de pacotes, taxas de bits, dados de taxa de quadros, métricas de pausa/congelamento, informações sobre codecs e métricas de rede no nível de transporte, como estimativa de largura de banda e pontuação das condições da rede.
As estatísticas são disponibilizadas por meio de:
-
otc_publisher_callbacks— estatísticas do lado do editor -
otc_subscriber_callbacks— estatísticas do lado do assinante
Para recebê-las, habilite o callback apropriado no editor ou no assinante.
Ativação das estatísticas para editores
Utilize as funções de retorno de chamada on_audio_stats() e on_video_stats() do otc_publisher_callbacks para monitorar as estatísticas do stream de um editor.
Para registrar métodos de retorno de chamada para relatórios periódicos de estatísticas de áudio e vídeo
de um editor, defina o on_audio_stats() e on_video_stats() funções de retorno de chamada
ao inicializar o otc_publisher_callbacks estrutura a ser
utilizada pela editora.
Registrar um otc_publisher_callbacks estrutura ao criar o 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 implementar os callbacks:
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);
}
Essas funções de retorno de chamada são chamadas periodicamente para relatar estatísticas de áudio e vídeo
para o editor. Cada função recebe os seguintes parâmetros: um ponteiro para o editora struct,
um ponteiro para o dados_do_usuário que você define para o editor,
um array de estatísticas e o número de estatísticas no array. O parâmetro “stats”
é definido pelo otc_publisher_audio_stats
e otc_publisher_video_stats estruturas. Para um editor em
uma sessão roteada (aquela que utiliza o OpenTok
Roteador de mídia), o array inclui um objeto, definindo as estatísticas para
o único fluxo de mídia de áudio ou vídeo enviado ao Vonage Video Media Router.
Em uma sessão retransmitida, o array inclui um objeto para cada assinante
do fluxo publicado.
Recebimento de eventos de qualidade de vídeo nos editores
Para eventos relacionados à qualidade de vídeo dos 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);
}
Recebimento de eventos de condição da rede no editor
Para receber eventos de alteração nas condições da rede para o editor, defina o on_network_condition_changed função de retorno na otc_publisher_callbacks struct:
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);
}
Registre-o junto com os outros callbacks:
pub_callbacks.on_network_condition_changed = handle_publisher_network_condition;
Essa função de retorno é acionada quando é detectada uma mudança significativa nas condições de rede do editor. Ela inclui as estatísticas atuais do link de mídia, juntamente com as métricas de transporte.
Ativação de estatísticas para assinantes
Utilize as funções de retorno de chamada on_audio_stats() e on_video_stats() do otc_subscriber_callbacks para monitorar as estatísticas do stream de um assinante.
Registrar um otc_subscriber_callbacks estrutura ao criar o assinante:
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);
Implemente os callbacks:
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);
}
Recebimento de eventos de qualidade de vídeo nos assinantes
Para eventos relacionados à qualidade de vídeo dos 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);
}
Recebimento de eventos de condição da rede no assinante
Para receber eventos de alteração nas condições da rede para o assinante, defina o on_network_condition_changed função de retorno na otc_subscriber_callbacks struct:
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);
}
Registre-o junto com os outros callbacks:
sub_callbacks.on_network_condition_changed = handle_subscriber_network_condition;
Essa função de retorno de chamada é acionada quando é detectada uma alteração significativa nas condições da rede para o assinante ou para o editor remoto. Ela inclui as estatísticas atuais do link de mídia, com métricas de transporte locais e remotas e a origem da degradação.
Estatística e Estruturas de Dados
Esta seção descreve as estruturas e os campos fornecidos pela API de estatísticas de áudio e vídeo do SDK C. Embora todas as plataformas do SDK de Vídeo apresentem o mesmo conjunto de estatísticas, pode haver pequenas diferenças na forma como cada plataforma estrutura ou nomeia os campos individuais. Essas variações refletem convenções de design do SDK específicas de cada plataforma, e não diferenças nas métricas subjacentes.
Para obter uma explicação independente de plataforma sobre as estatísticas disponíveis e o que elas representam, consulte Visão geral da observabilidade do cliente.
otc_transport_stats
Representa métricas compartilhadas no nível do transporte.
connection_estimated_bandwidth— Largura de banda estimada disponível da conexão (bps)network_condition— Pontuação atual do estado da rede (OTC_NETWORK_CONDITION_UNKNOWN,OTC_NETWORK_CONDITION_CRITICAL,OTC_NETWORK_CONDITION_WARNING,OTC_NETWORK_CONDITION_FAIR,OTC_NETWORK_CONDITION_GOOD, ouOTC_NETWORK_CONDITION_EXCELLENT)network_condition_reason— Principal motivo que afeta o estado da rede (OTC_NETWORK_REASON_NONE,OTC_NETWORK_REASON_UNKNOWN,OTC_NETWORK_REASON_BANDWIDTH, ouOTC_NETWORK_REASON_PACKET_LOSS)
otc_publisher_video_stats
Fornece estatísticas sobre a trilha de vídeos de um editor:
connection_id— Em uma sessão retransmitida, o ID de conexão do cliente que está assinando o fluxosubscriber_id— Em uma sessão retransmitida, o ID do assinante do cliente que está assinando o fluxopackets_lost— Estimativa de pacotes de vídeo perdidospackets_sent— Pacotes de vídeo enviadosbytes_sent— Bytes de vídeo enviadostimestamp— Carimbo de data/hora do Unix em milissegundosstart_time— O carimbo de data e hora, em milissegundos desde a época Unix, a partir do qual os totais acumulados começaram a ser calculadosvideo_layers— Matriz de estatísticas da camada de vídeo (consulte otc_publisher_video_layer_stats)
otc_publisher_audio_stats
Fornece estatísticas sobre a faixa de áudio de um editor:
connection_id— Em uma sessão retransmitida, o ID de conexão do cliente que está assinando o fluxosubscriber_id— Em uma sessão retransmitida, o ID do assinantepackets_lost— Estimativa de pacotes de áudio perdidospackets_sent— Pacotes de áudio enviadosbytes_sent— Trechos de áudio enviadostimestamp— Carimbo de data/hora do Unix em milissegundosstart_time— O carimbo de data e hora, em milissegundos desde a época Unix, a partir do qual os totais acumulados começaram a ser calculados
otc_publisher_video_layer_stats
Representa uma transmissão simultânea ou uma camada SVC:
width— Largura do quadro codificadoheight— Altura do quadro codificadoencoded_frame_rate— fps codificadosbitrate— Taxa de bits da camada (bps)total_bitrate— Taxa de bits da camada, incluindo a sobrecarga do RTP (bps)scalability_mode— Descritor SVC/escalabilidade (por exemplo, “L3T3”)quality_limitation_reason— Motivo da limitação de qualidade (largura de banda, CPU, codec, resolução ou mudança de camada)codec— Codec utilizado nesta camada de vídeo
otc_subscriber_video_stats
Fornece estatísticas sobre a trilha de vídeo de um assinante:
packets_lost— Estimativa de pacotes de vídeo perdidospackets_received— Pacotes de vídeo recebidosbytes_received— Bytes de vídeo recebidostimestamp— Carimbo de data/hora do Unix em milissegundossender_connection_max_allocated_bitrate— Taxa de bits máxima opcional do lado do remetentesender_connection_estimated_bandwidth— Largura de banda estimada opcional do lado do remetentewidth— Largura do quadro decodificado em pixelsheight— Altura do quadro decodificado em pixelsdecoded_frame_rate— Quadros por segundo decodificadosbitrate— Taxa de bits do vídeo (bps)total_bitrate— Taxa de bits, incluindo a sobrecarga do RTP (bps)pause_count— Número de pausas (mais de 5 s desde o último quadro)total_pauses_duration— Duração total da pausa (ms)freeze_count— Número de travamentostotal_freezes_duration— Duração total do congelamento (ms)codec— Codec atual do decodificador
otc_subscriber_audio_stats
Fornece estatísticas sobre a trilha de áudio de um assinante:
packets_lost— Estimativa de pacotes perdidospackets_received— Pacotes recebidosbytes_received— Bytes recebidosaudio_level— Nível de áudio (0–1,0)timestamp— Carimbo de data/hora do Unix em milissegundossender_connection_max_allocated_bitrate— Taxa de bits máxima opcional do lado do remetentesender_connection_estimated_bandwidth— Largura de banda estimada opcional do lado do remetentetransport— Estatísticas de transporte local e de rede para este assinante (consulteotc_transport_stats). Pode ser limitado se as estatísticas do remetente e/ou o recurso alternativo de áudio estiverem desativados.remote_publisher_transport— Estatísticas de transporte e de rede do editor remoto (consulteotc_transport_stats). Pode ser limitado se as estatísticas do remetente e/ou o recurso alternativo de áudio estiverem desativados.
otc_publisher_media_link_stats
Fornece estatísticas no nível do transporte para a conexão de um editor.
transport— Estatísticas de tráfego para esta editora (vejaotc_transport_stats)
otc_subscriber_media_link_stats
Fornece estatísticas no nível de transporte para as conexões de um assinante.
transport— Estatísticas de transporte para a conexão de downlink deste assinante (consulteotc_transport_stats)remote_publisher_transport— Estatísticas de transporte para a conexão de uplink do editor remoto (consulteotc_transport_stats). Pode ser limitado se as estatísticas do remetente não estiverem ativadas.network_degradation_source— Indica a origem da degradação da rede, se houver (OTC_NETWORK_DEGRADATION_SOURCE_NONE,OTC_NETWORK_DEGRADATION_SOURCE_LOCAL,OTC_NETWORK_DEGRADATION_SOURCE_REMOTE, ouOTC_NETWORK_DEGRADATION_SOURCE_BOTH_OR_UNCLEAR)
Estatísticas do lado do remetente
Veja o Visão geral das estatísticas do lado do remetente.
Ativação das estatísticas do remetente
As estatísticas do remetente são recebidas pelos assinantes. Para receber essas estatísticas, habilite-as para o editor do fluxo chamando otc_publisher_settings_set_sender_stats_track() função antes de criar o publisher:
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);
Se o acompanhamento de estatísticas do remetente não estiver ativado, nenhum canal de estatísticas do remetente será publicado para esse editor. O valor padrão é OTC_FALSE.
Recebimento de estatísticas do lado do remetente
Se o editor tiver ativado as estatísticas do remetente, os assinantes as recebem automaticamente por meio dos callbacks de estatísticas descrito acima. O otc_subscriber_video_stats e otc_subscriber_audio_stats As estruturas incluem dois campos do lado do remetente:
sender_connection_max_allocated_bitrate— A taxa de bits máxima que pode ser estimada para a conexãosender_connection_estimated_bandwidth— A largura de banda estimada atual para a conexão
Essas métricas são calculadas por pacote de áudio e vídeo; portanto, os mesmos valores aparecem tanto nas estatísticas de vídeo quanto nas de áudio.
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);
}
Condição da rede e fonte da degradação
O SDK fornece métricas em tempo real sobre as condições da rede tanto para editores quanto para assinantes, incluindo uma pontuação de condição, o motivo por trás dessa pontuação e a origem da degradação para os assinantes. Para obter uma explicação completa sobre o modelo de condições da rede, as pontuações, os motivos e como ativá-lo, consulte o Visão geral da observabilidade do cliente.
Os dados sobre o estado da rede estão disponíveis por meio de dois canais:
- Estatísticas periódicas: O
transportO campo nas estruturas de estatísticas do editor e do assinante incluinetwork_conditionenetwork_condition_reason. As estatísticas dos assinantes também revelamremote_publisher_transportenetwork_degradation_source. Veja Estruturas estatísticas para mais detalhes. - Eventos relacionados a alterações nas condições da rede: Callbacks dedicados em ambos editora e assinante são acionados quando é detectada uma mudança significativa nas condições da rede.
O exemplo a seguir mostra como usar os dados de condição da rede do assinante para identificar a origem da degradação:
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);
}
}
Relatório de Estatísticas da RTC
Para obter estatísticas de conexão entre pares de baixo nível para um editor, use o otc_publisher_get_rtc_stats_report() função. Ela fornece relatórios de estatísticas de RTC para o fluxo de mídia. Trata-se de uma operação assíncrona. Crie um otc_publisher_rtc_stats_report_cb struct e passá-lo para o otc_publisher_set_rtc_stats_report_cb função antes de chamar otc_publisher_get_rtc_stats_report(). Quando as estatísticas estiverem disponíveis, o otc_publisher_rtc_stats_report_cb.on_rtc_stats_report() a função de retorno de chamada é chamada. Essa função inclui um stats parâmetro, que é um ponteiro para uma matriz de otc_publisher_rtc_stats estruturas. Essa estrutura inclui um json_array_of_reports propriedade. Trata-se de um array JSON de relatórios de estatísticas do RTC, cujo formato é semelhante ao do objeto RtcStatsReport implementado nos navegadores da web (consulte esses documentos da Mozilla).
Para obter estatísticas de conexão entre pares de baixo nível para um assinante, ou para obter estatísticas mais detalhadas sobre o fluxo, use o otc_subscriber_get_rtc_stats_report() função. Ela fornece um relatório de estatísticas do RTC para o fluxo de mídia.
Esta é uma operação assíncrona. Crie um otc_subscriber_rtc_stats_report_cb struct e passá-la para o otc_subscriber_set_rtc_stats_report_cb função antes de chamar otc_subscriber_get_rtc_stats_report(). Quando as estatísticas estiverem disponíveis, o otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report a função de retorno de chamada é chamada.
Essa função de retorno de chamada inclui um json_array_of_reports parâmetro. Trata-se de um array JSON de relatórios de estatísticas do RTC, cujo formato é semelhante ao do objeto RtcStatsReport implementado nos navegadores da web (consulte esses documentos da Mozilla).
Veja também esta documentação do W3C.