Das Vonage Video SDK stellt detaillierte Metriken zur Stream-Qualität über eine High-Level-Statistik-API zur Verfügung, die für die meisten Anwendungsfälle empfohlen wird und die Audio-, Video-, Netzwerk- und Absenderstatistiken in einer einheitlichen, sitzungsspezifischen Form bereitstellt, die über Peer-Verbindungsübergänge hinweg stabil bleibt. Für fortgeschrittenes Debugging bietet das SDK auch Zugriff auf den rohen WebRTC-Statistikbericht, der unverarbeitete Peer-Verbindungsdaten wiedergibt.
Audio- und Videostatistik-API
Das Vonage Video Linux SDK sendet regelmäßig Audio- und Videonetzwerkstatistiken sowohl für Anbieter als auch für Teilnehmer. Dazu gehören die Anzahl der Pakete, Bitraten, Daten zur Bildrate, Pausen-/Freeze-Metriken, Codec-Informationen und optionale senderseitige Netzwerkschätzungen.
Die Statistiken werden durch geliefert:
otc_publisher_callbacks- verlagsseitige Statistikenotc_subscriber_callbacks- Statistiken auf der Abonnentenseite
Um sie zu empfangen, aktivieren Sie den entsprechenden Rückruf auf dem Verleger oder Abonnenten.
Freigabe von Statistiken für Verleger
Verwenden Sie die on_audio_stats() und on_video_stats() Callback-Funktionen der otc_publisher_callbacks um Statistiken für den Stream eines Herausgebers zu überwachen.
Um Callback-Methoden für periodische Berichte von Audio- und Videostatistiken zu registrieren
für einen Publisher zu registrieren, setzen Sie die on_audio_stats() und on_video_stats() Callback-Funktionen
wenn Sie die Initialisierung der otc_publisher_callbacks Struktur, die
vom Herausgeber zu verwenden.
Einschreiben otc_publisher_callbacks Struktur bei der Erstellung des Verlags:
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;
Und implementieren Sie die Rückrufe:
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);
}
Diese Callback-Funktionen werden in regelmäßigen Abständen aufgerufen, um Audio- und Videostatistiken
für den Herausgeber zu melden. Jede Funktion wird wie folgt übergeben: Ein Zeiger auf den Herausgeber Struktur,
Ein Zeiger auf den user_data die Sie für den Verlag festgelegt haben,
ein Array von Statistiken und die Anzahl der Statistiken im Array. Der Parameter stats
ist definiert durch den otc_verlag_audio_statistiken
und otc_verlag_video_statistiken strukturen. Für einen Verleger in
einer gerouteten Sitzung (eine, die die OpenTok
Medien-Router), enthält das Array ein Objekt, das die Statistiken für
den einzelnen Audio- oder Video-Medienstrom, der an den Vonage Video Media Router gesendet wird.
Bei einer weitergeleiteten Sitzung enthält das Array ein Objekt für jeden Teilnehmer des
des veröffentlichten Streams.
Empfang von Ereignissen in Videoqualität bei den Herausgebern
Für Ereignisse in Publisher-Videoqualität:
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);
}
Aktivieren von Statistiken für Abonnenten
Verwenden Sie die on_audio_stats() und on_video_stats() Callback-Funktionen der otc_subscriber_callbacks um die Statistiken für den Stream eines Abonnenten zu überwachen.
Einschreiben otc_subscriber_callbacks Struktur bei der Erstellung des Abonnenten:
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;
otc_subscriber* subscriber = otc_subscriber_new(stream, sub_callbacks, user_data);
Implementieren Sie die Rückrufe:
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);
}
Empfang von Videoqualitätsereignissen bei den Abonnenten
Für Ereignisse in Publisher-Videoqualität:
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);
}
Statistik-Datenstrukturen
In diesem Abschnitt werden die Strukturen und Felder beschrieben, die von der C-SDK-Audio- und Videostatistik-API bereitgestellt werden. Während alle Video SDK-Plattformen die gleichen Statistiken bereitstellen, kann es geringfügige Unterschiede in der Strukturierung oder Benennung einzelner Felder geben. Diese Unterschiede spiegeln eher plattformspezifische SDK-Designkonventionen als Unterschiede in den zugrunde liegenden Metriken wider.
otc_transport_stats
Stellt eine gemeinsame Schätzung auf Transportebene dar.
connection_estimated_bandwidth- Geschätzte verfügbare Verbindungsbandbreite (bps)
otc_publisher_video_stats
Liefert Statistiken über die Videospur eines Herausgebers:
connection_id- Bei einer weitergeleiteten Sitzung die Verbindungs-ID des Clients, der den Stream abonniertsubscriber_id- In einer weitergeleiteten Sitzung wird die Abonnenten-ID des Clients, der den Stream abonniert, angezeigt.packets_lost- Geschätzte verlorene Videopaketepackets_sent- Gesendete Videopaketebytes_sent- Gesendete Video-Bytestimestamp- Unix-Zeitstempel in Millisekundenstart_time- Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannenvideo_layers- Array mit Statistiken zur Videoebene (siehe otc_publisher_video_layer_stats)transport- Transportstatistiken für diesen Verlag
otc_publisher_audio_stats
Liefert Statistiken über die Audiospur eines Verlags:
connection_id- Bei einer weitergeleiteten Sitzung die Verbindungs-ID des Clients, der den Stream abonniertsubscriber_id- Bei einer weitergeleiteten Sitzung wird die Teilnehmer-IDpackets_lost- Geschätzte verlorene Audiopaketepackets_sent- Gesendete Audiopaketebytes_sent- Gesendete Audio-Bytestimestamp- Unix-Zeitstempel in Millisekundenstart_time- Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannentransport- Transportstatistiken für diesen Verlag
otc_publisher_video_layer_stats
Steht für eine Simulcast- oder SVC-Ebene:
width- Kodierte Bildbreiteheight- Kodierte Rahmenhöheencoded_frame_rate- Kodierte fpsbitrate- Bitrate der Schicht (bps)total_bitrate- Layer-Bitrate einschließlich RTP-Overhead (bps)scalability_mode- SVC/Skalierbarkeitsdeskriptor (z. B. "L3T3")quality_limitation_reason- Grund für die Qualitätseinschränkung (Bandbreite, CPU, Codec, Auflösung oder Ebenenwechsel)codec- Für diese Videoebene verwendeter Codec
otc_subscriber_video_stats
Liefert Statistiken über die Videospur eines Abonnenten:
packets_lost- Geschätzte verlorene Videopaketepackets_received- Empfangene Videopaketebytes_received- Empfangene Video-Bytestimestamp- Unix-Zeitstempel in Millisekundensender_connection_max_allocated_bitrate- Optionale maximale Bitrate auf der Senderseitesender_connection_estimated_bandwidth- Optionale geschätzte Bandbreite auf der Absenderseitewidth- Dekodierte Bildbreite in Pixelheight- Dekodierte Bildhöhe in Pixeldecoded_frame_rate- Dekodierte Bilder pro Sekundebitrate- Video-Bitrate (bps)total_bitrate- Bitrate einschließlich RTP-Overhead (bps)pause_count- Numbers of pauses (>5s since last frame)total_pauses_duration- Gesamtpausendauer (ms)freeze_count- Numbers von Einfrierungentotal_freezes_duration- Gesamtdauer des Einfrierens (ms)codec- Aktueller Decoder Codec
otc_subscriber_audio_stats
Liefert Statistiken über die Audiospur eines Abonnenten:
packets_lost- Geschätzte verlorene Paketepackets_received- Empfangene Paketebytes_received- Empfangene Bytesaudio_level- Audiopegel (0-1,0)timestamp- Unix-Zeitstempel in Millisekundensender_connection_max_allocated_bitrate- Optionale maximale Bitrate auf der Senderseitesender_connection_estimated_bandwidth- Optionale geschätzte Bandbreite auf der Absenderseite
Absender-Seite
Siehe die Übersicht der Absenderstatistiken.
Aktivieren von Statistiken auf der Absenderseite
Absenderstatistiken werden von den Abonnenten empfangen. Um absenderseitige Statistiken zu erhalten, aktivieren Sie sie für den Herausgeber des Streams durch den Aufruf otc_publisher_settings_set_sender_stats_track() Funktion, bevor Sie den Verlag erstellen:
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);
Wenn der Absenderstatistik-Track nicht aktiviert ist, wird für diesen Verlag kein Absenderstatistik-Kanal veröffentlicht. Der Standardwert ist OTC_FALSE.
Abonnieren von Statistiken auf der Absenderseite
Abonnenten erhalten automatisch Absenderstatistiken, wenn Sie sich für die Video- oder Audiostatistik-Rückrufe des Abonnenten registrieren und der Herausgeber diese sendet.
Empfang von Statistikereignissen
Absenderstatistiken werden als Teil der bestehenden Subscriber Stats Callbacks geliefert. Spezifische Felder sind in der otc_subscriber_video_stats und otc_subscriber_audio_stats Strukturen:
sender_connection_max_allocated_bitrate- Die maximale Bitrate, die für die Verbindung geschätzt werden kannsender_connection_estimated_bandwidth- Die aktuell geschätzte Bandbreite für die Verbindung
Diese beiden Metriken werden pro Audio-Video-Bündel berechnet, so dass sowohl in der Video- als auch in der Audiostatistik die gleichen Werte erscheinen. Da sie den Transport und nicht einzelne Tracks widerspiegeln, werden die Metriken sowohl für Audio als auch für Video verwendet.
void handle_subscriber_video_stats(otc_subscriber* subscriber,
void* user_data,
struct otc_subscriber_video_stats stats) {
printf("Timestamp: %llu ms\n", (unsigned long long)stats.timestamp);
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);
}
RTC-Statistikbericht
Um Low-Level-Peer-Verbindungsstatistiken für einen Publisher zu erhalten, verwenden Sie die otc_publisher_get_rtc_stats_report() Funktion. Sie liefert RTC-Statistikberichte für den Medienstrom. Dies ist ein asynchroner Vorgang. Erstellen einer otc_publisher_rtc_stats_report_cb struct und leiten es in die otc_publisher_set_rtc_stats_report_cb Funktion vor dem Aufruf von otc_publisher_get_rtc_stats_report(). Wenn die Statistiken verfügbar sind, wird die otc_publisher_rtc_stats_report_cb.on_rtc_stats_report() Callback-Funktion aufgerufen wird. Diese Funktion enthält eine stats Parameter, der ein Zeiger auf ein Array von otc_publisher_rtc_stats Strukturen. Diese Struktur enthält eine json_array_of_reports Eigenschaft. Dies ist ein JSON-Array mit RTC-Statistikberichten, die dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts ähnlich sind (siehe diese Mozilla-Dokumente).
Um Low-Level-Peer-Verbindungsstatistiken für einen Teilnehmer zu erhalten, verwenden Sie den Befehl otc_subscriber_get_rtc_stats_report() Funktion. Diese Funktion liefert einen RTC-Statistikbericht für den Medienstrom.
Dies ist ein asynchroner Vorgang. Erstellen einer otc_subscriber_rtc_stats_report_cb Struktur und übergeben Sie sie an die otc_subscriber_set_rtc_stats_report_cb Funktion vor dem Aufruf von otc_subscriber_get_rtc_stats_report(). Wenn die Statistiken verfügbar sind, wird die otc_subscriber_rtc_stats_report_cb.on_rtc_stats_report Callback-Funktion aufgerufen wird.
Diese Rückruffunktion enthält eine json_array_of_reports Parameter. Dies ist ein JSON-Array mit RTC-Statistikberichten, die dem Format des in Webbrowsern implementierten RtcStatsReport-Objekts ähnlich sind (siehe diese Mozilla-Dokumente).
Siehe auch diese W3C-Dokumentation.