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 Statistiken

  • otc_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 abonniert
  • subscriber_id - In einer weitergeleiteten Sitzung wird die Abonnenten-ID des Clients, der den Stream abonniert, angezeigt.
  • packets_lost - Geschätzte verlorene Videopakete
  • packets_sent - Gesendete Videopakete
  • bytes_sent - Gesendete Video-Bytes
  • timestamp - Unix-Zeitstempel in Millisekunden
  • start_time - Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannen
  • video_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 abonniert
  • subscriber_id - Bei einer weitergeleiteten Sitzung wird die Teilnehmer-ID
  • packets_lost - Geschätzte verlorene Audiopakete
  • packets_sent - Gesendete Audiopakete
  • bytes_sent - Gesendete Audio-Bytes
  • timestamp - Unix-Zeitstempel in Millisekunden
  • start_time - Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannen
  • transport - Transportstatistiken für diesen Verlag

otc_publisher_video_layer_stats

Steht für eine Simulcast- oder SVC-Ebene:

  • width - Kodierte Bildbreite
  • height - Kodierte Rahmenhöhe
  • encoded_frame_rate - Kodierte fps
  • bitrate - 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 Videopakete
  • packets_received - Empfangene Videopakete
  • bytes_received - Empfangene Video-Bytes
  • timestamp - Unix-Zeitstempel in Millisekunden
  • sender_connection_max_allocated_bitrate - Optionale maximale Bitrate auf der Senderseite
  • sender_connection_estimated_bandwidth - Optionale geschätzte Bandbreite auf der Absenderseite
  • width - Dekodierte Bildbreite in Pixel
  • height - Dekodierte Bildhöhe in Pixel
  • decoded_frame_rate - Dekodierte Bilder pro Sekunde
  • bitrate - 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 Einfrierungen
  • total_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 Pakete
  • packets_received - Empfangene Pakete
  • bytes_received - Empfangene Bytes
  • audio_level - Audiopegel (0-1,0)
  • timestamp - Unix-Zeitstempel in Millisekunden
  • sender_connection_max_allocated_bitrate - Optionale maximale Bitrate auf der Senderseite
  • sender_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 kann
  • sender_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.