Observabilidade do cliente: Windows
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 Windows 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, opcionalmente, estimativas de rede do lado do remetente.
As estatísticas são divulgadas por meio dos seguintes eventos:
Publisher.AudioStatsUpdated— estatísticas de áudio do lado do editorPublisher.VideoStatsUpdated— estatísticas de vídeo do lado do editorPublisher.MediaLinkStatsUpdated— estatísticas de links de mídia do lado do editor (métricas de transporte)Publisher.VideoQualityChanged— notificação sobre alteração na qualidade do vídeo do editorPublisher.NetworkConditionChanged— notificação de alteração nas condições da rede de editoresSubscriber.AudioStatsUpdated— estatísticas de áudio do lado do assinanteSubscriber.VideoStatsUpdated— estatísticas de vídeo do lado do assinanteSubscriber.MediaLinkStatsUpdated— estatísticas de conexão de mídia do lado do assinante (métricas de transporte)Subscriber.VideoQualityChanged— notificação sobre alteração na qualidade do vídeo para assinantesSubscriber.NetworkConditionChanged— notificação de alteração nas condições da rede do assinante
Para recebê-los, defina o manipulador de eventos apropriado no emissor ou no assinante.
Ativação das estatísticas para editores
Defina os manipuladores de eventos correspondentes para Publisher.AudioStatsUpdated e Publisher.VideoStatsUpdated:
publisher.AudioStatsUpdated += (sender, args) =>
{
foreach (var stat in args.Stats)
{
Console.WriteLine($"Audio bytes sent: {stat.BytesSent}");
}
};
publisher.VideoStatsUpdated += (sender, args) =>
{
foreach (var stat in args.Stats)
{
Console.WriteLine($"Video packets sent: {stat.PacketsSent}");
}
};
publisher.MediaLinkStatsUpdated += (sender, args) =>
{
foreach (var stat in args.MediaLinkStats)
{
Console.WriteLine($"Publisher uplink bandwidth: {stat.Transport.ConnectionEstimatedBandwidth} bps");
Console.WriteLine($"Network condition: {stat.Transport.Condition}");
Console.WriteLine($"Condition reason: {stat.Transport.NetworkConditionReason}");
}
};
Esses eventos são enviados periodicamente para relatar estatísticas de áudio e vídeo para o editor.
Os manipuladores de eventos para esses eventos são passados em uma matriz de Estatísticas da Rede de Áudio
e Estatísticas da Rede de Vídeos
Cada método recebe dois objetos: o publisher e uma matriz de objetos de estatísticas.
Para um publisher em uma sessão roteada (aquela que usa 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
Se você também estiver interessado em eventos relacionados à qualidade de vídeo, implemente este manipulador:
publisher.VideoQualityChanged += (sender, args) =>
{
Console.WriteLine($"Publisher video quality changed: {args.Reason}");
};
Recebimento de eventos de condição de rede nos editores
Para receber eventos de alteração nas condições da rede para o editor, inscreva-se no Publisher.NetworkConditionChanged evento:
publisher.NetworkConditionChanged += (sender, args) =>
{
Console.WriteLine($"Publisher network condition: {args.VideoStats.Transport.Condition}");
Console.WriteLine($"Reason: {args.VideoStats.Transport.NetworkConditionReason}");
};
Este evento é acionado quando é detectada uma mudança significativa nas condições da rede para o emissor. Ele fornece estatísticas tanto de vídeo quanto de áudio, uma vez que ambos compartilham o mesmo protocolo de transporte subjacente.
Ativação de estatísticas para assinantes
Defina os manipuladores de eventos correspondentes para Subscriber.AudioStatsUpdated e Subscriber.VideoStatsUpdated:
subscriber.VideoStatsUpdated += (sender, stats) =>
{
Console.WriteLine($"Video bytes received: {stats.BytesReceived}");
};
subscriber.AudioStatsUpdated += (sender, stats) =>
{
Console.WriteLine($"Audio packets received: {stats.PacketsReceived}");
};
subscriber.MediaLinkStatsUpdated += (sender, args) =>
{
Console.WriteLine($"Local downlink bandwidth: {args.MediaLinkStats.Transport.ConnectionEstimatedBandwidth} bps");
if (args.MediaLinkStats.RemotePublisherTransport != null)
{
Console.WriteLine($"Remote publisher uplink bandwidth: {args.MediaLinkStats.RemotePublisherTransport.ConnectionEstimatedBandwidth} bps");
}
Console.WriteLine($"Degradation source: {args.MediaLinkStats.NetworkDegradationSource}");
};
Recebimento de eventos de qualidade de vídeo nos assinantes
Se você também estiver interessado em eventos relacionados à qualidade de vídeo, implemente este manipulador:
subscriber.VideoQualityChanged += (sender, args) =>
{
Console.WriteLine($"Subscriber video quality event: {args.Reason}");
};
Recebimento de eventos de condição da rede nos assinantes
Para receber eventos de alteração nas condições da rede para o assinante, inscreva-se no Subscriber.NetworkConditionChanged evento:
subscriber.NetworkConditionChanged += (sender, args) =>
{
Console.WriteLine($"Local network condition: {args.VideoStats.Transport.Condition}");
Console.WriteLine($"Remote publisher network condition: {args.VideoStats.RemotePublisherTransport.Condition}");
Console.WriteLine($"Degradation source: {args.VideoStats.NetworkDegradationSource}");
};
Este evento é acionado quando é detectada uma alteração significativa nas condições da rede para o assinante ou para o editor remoto. Ele fornece estatísticas de vídeo e áudio, além de métricas de transporte locais e remotas.
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 Windows Video SDK. Embora todas as plataformas do Video SDK ofereçam 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.
TransportStats
Representa métricas no nível do transporte.
ConnectionEstimatedBandwidth— Largura de banda estimada disponível da conexão (bps)Condition— Pontuação atual do estado da rede (NetworkCondition.Unknown,NetworkCondition.Critical,NetworkCondition.Warning,NetworkCondition.Fair,NetworkCondition.Good, ouNetworkCondition.Excellent)NetworkConditionReason— Principal motivo que afeta o estado da rede (NetworkReason.None,NetworkReason.Unknown,NetworkReason.Bandwidth, ouNetworkReason.PacketLoss)
Publisher.AudioNetworkStats
Fornece estatísticas sobre a faixa de áudio de um editor.
ConnectionId— ID de conexão do assinante (apenas retransmitida)SubscriberId— ID do assinante (apenas retransmitido)PacketsLost— Total de pacotes de áudio perdidosPacketsSent— Total de pacotes de áudio enviadosBytesSent— Total de bytes de áudio enviadosTimestamp— Carimbo de data e hora em que as estatísticas foram coletadas (ms)StartTime— Carimbo de data/hora em que os totais acumulados começaram (ms)
Publisher.VideoNetworkStats
Fornece estatísticas sobre a trilha de vídeos de um editor.
ConnectionId— ID de conexão do assinante (apenas retransmitida)SubscriberId— ID do assinante (apenas retransmitido)PacketsLost— Pacotes de vídeo perdidosPacketsSent— Pacotes de vídeo enviadosBytesSent— Bytes de vídeo enviadosTimestamp— Data e hora em que as estatísticas foram coletadasStartTime— Data e hora em que os totais acumulados começaramVideoLayers— Lista de camadas de transmissão simultânea/SVC (VideoLayerStats)
Publisher.VideoLayerStats
Representa uma única transmissão simultânea ou camada de vídeo SVC.
Width— Largura do quadro codificadoHeight— Altura do quadro codificadoEncodedFrameRate— Quadros codificados por segundoBitrate— Taxa de bits da camada (bps)TotalBitrate— Taxa de bits, incluindo a sobrecarga do RTP (bps)ScalabilityMode— Descrição de SVC/escalabilidade (por exemplo, “L3T3”)QualityLimitationReason— Motivo da redução da qualidadeCodec— Codec utilizado nesta camada
Subscriber.AudioNetworkStatsEventArgs
Fornece estatísticas sobre a trilha de áudio de um assinante.
PacketsLost— Estimativa de pacotes de áudio perdidosPacketsReceived— Pacotes de áudio recebidosBytesReceived— Trechos de áudio recebidosTimestamp— Data e hora em que as estatísticas foram coletadasSenderStats— Estimativa da rede do lado do remetente (opcional)
Subscriber.VideoNetworkStatsEventArgs
Fornece estatísticas sobre a trilha de vídeo de um assinante.
PacketsLost— Pacotes de vídeo perdidosPacketsReceived— Pacotes de vídeo recebidosBytesReceived— Bytes de vídeo recebidosTimestamp— Data e hora em que as estatísticas foram coletadasSenderStats— Estimativa da rede do lado do remetente (opcional)Width— Largura do quadro decodificadoHeight— Altura do quadro decodificadoDecodedFrameRate— Quadros por segundo decodificadosBitrate— Taxa de bits do vídeo (bps)TotalBitrate— Taxa de bits total, incluindo a sobrecarga do RTPPauseCount— Número de pausas no vídeo (>5 s sem nenhum quadro)TotalPausesDuration— Duração total da pausa (ms)FreezeCount— Número de travamentos definidos pelo WebRTCTotalFreezesDuration— Duração total do congelamento (ms)Codec— Codec do decodificador
Publisher.PublisherMediaLinkStats
Fornece estatísticas no nível do transporte para a conexão de um editor.
Transport— Estatísticas de tráfego para esta editora (vejaTransportStats)
Subscriber.SubscriberMediaLinkStats
Fornece estatísticas no nível de transporte para as conexões de um assinante, incluindo visibilidade do desempenho da rede do editor remoto. Isso permite que as Applications diagnostiquem se os problemas de conexão se originam do downlink do assinante ou do uplink do editor.
Transport— Estatísticas de transporte para a conexão de downlink deste assinante (consulteTransportStats)RemotePublisherTransport— Estatísticas de transporte para a conexão de uplink do editor remoto (consulteTransportStats). Pode ser limitado se as estatísticas do remetente não estiverem ativadas.NetworkDegradationSource— Indica a origem da degradação da rede, se houver (NetworkDegradationSource.None,NetworkDegradationSource.Local,NetworkDegradationSource.Remote, ouNetworkDegradationSource.BothOrUnclear)
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 definindo o HasSenderStatsTrack propriedade para true ao criar o editor:
var publisherBuilder = new Publisher.Builder()
{
HasSenderStatsTrack = true
};
Publisher publisher = publisherBuilder.Build();
Se HasSenderStatsTrack Se não estiver habilitado, nenhum canal de estatísticas do remetente será publicado para esse editor. O valor padrão é 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 do VideoStatsUpdated e AudioStatsUpdated eventos descrito acima. O SenderStats propriedade em ambos VideoNetworkStatsEventArgs e AudioNetworkStatsEventArgs apresenta duas métricas:
ConnectionMaxAllocatedBitrate— A taxa de bits máxima que pode ser estimada para a conexãoConnectionEstimatedBandwidth— 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.
subscriber.VideoStatsUpdated += (sender, stats) =>
{
if (stats.SenderStats != null)
{
Console.WriteLine($"Connection max allocated bitrate: {stats.SenderStats.ConnectionMaxAllocatedBitrate}");
Console.WriteLine($"Connection current estimated bandwidth: {stats.SenderStats.ConnectionEstimatedBandwidth}");
}
};
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
TransportAs propriedades dos objetos de estatísticas do editor e do assinante incluemConditioneNetworkConditionReason. As estatísticas dos assinantes também revelamRemotePublisherTransporteNetworkDegradationSource. Veja Estruturas estatísticas para mais detalhes. - Eventos relacionados a alterações nas condições da rede: Eventos específicos 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:
subscriber.NetworkConditionChanged += (sender, args) =>
{
var localCondition = args.VideoStats.Transport.Condition;
var remoteCondition = args.VideoStats.RemotePublisherTransport.Condition;
var source = args.VideoStats.NetworkDegradationSource;
if (source == NetworkDegradationSource.Local)
{
Console.WriteLine($"Local network is degraded (condition: {localCondition})");
}
else if (source == NetworkDegradationSource.Remote)
{
Console.WriteLine($"Remote publisher network is degraded (condition: {remoteCondition})");
}
else if (source == NetworkDegradationSource.BothOrUnclear)
{
Console.WriteLine($"Degradation source unclear — local: {localCondition}, remote: {remoteCondition}");
}
};
Relatório de Estatísticas da RTC
Para obter as estatísticas de conexão entre pares de baixo nível de um editor, use o Publisher.GetRtcStatsReport() método. Ele fornece relatórios de estatísticas RTC para o fluxo de mídia. Trata-se de uma operação assíncrona. Quando as estatísticas estiverem disponíveis, o evento RtcStatsReport é enviado. O RtcStatsReportArgs O objeto inclui uma matriz de PublisherRtcStats objetos, o que inclui um JsonArrayOfReports 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 de um assinante, use o Subscriber.GetRtcStatsReport() método. Isso fornece um relatório de estatísticas RTC para o fluxo de mídia.
Esta é uma operação assíncrona. Quando as estatísticas estiverem disponíveis, o evento RtcStatsReport é enviado. O RtcStatsReportArgs O objeto inclui um JsonArrayOfReports 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).
Veja também esta documentação do W3C.
Solicitação de um relatório de estatísticas do RTC para um editor:
publisher.RtcStatsReport += (sender, args) =>
{
foreach (var stat in args.stats)
{
Console.WriteLine(stat.JsonArrayOfReports); // Raw RTC JSON
}
};
publisher.GetRtcStatsReport();