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 iOS SDK sendet regelmäßig Audio- und Videonetzwerkstatistiken sowohl für Publisher als auch für Abonnenten. 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:
OTPublisherKitNetworkStatsDelegate- verlagsseitige StatistikenOTSubscriberKitNetworkStatsDelegate- Statistiken auf der Abonnentenseite
Um sie zu empfangen, aktivieren Sie den entsprechenden Delegaten auf dem Verleger oder Abonnenten.
Freigabe von Statistiken für Verleger
Fügen Sie eine Klasse hinzu, die das OTPublisherKitNetworkStatsDelegate übernimmt:
@interface MyViewController () <OTPublisherKitDelegate, OTPublisherKitNetworkStatsDelegate>
@end
OTPublisher *publisher = [[OTPublisher alloc] initWithDelegate:self
settings:settings];
publisher.networkStatsDelegate = self;
Implementieren Sie die Rückrufe:
- (void)publisher:(OTPublisherKit *)publisher
videoNetworkStatsUpdated:(NSArray<OTPublisherKitVideoNetworkStats *> *)statsArray {
OTPublisherKitVideoNetworkStats *stats = statsArray.firstObject;
if (!stats) return;
// For routed sessions, the first element is sufficient.
// For relayed sessions, iterate all elements if you want per-subscriber stats.
NSString *connectionId = stats.connectionId ?: @"<none>";
NSString *subscriberId = stats.subscriberId ?: @"<none>";
NSLog(@"Publisher Video Stats for connectionId: %@, subscriberId: %@", connectionId, subscriberId);
NSLog(@"Video bytes sent: %lld", stats.videoBytesSent);
NSLog(@"Video packets sent: %lld", stats.videoPacketsSent);
NSLog(@"Video packets lost: %lld", stats.videoPacketsLost);
NSLog(@"Stats timestamp: %f ms", stats.timestamp);
for (OTPublisherKitVideoLayerStats *layer in stats.videoLayers) {
NSLog(@"Layer: %dx%d", layer.width, layer.height);
NSLog(@" Encoded FPS: %f", layer.encodedFrameRate);
NSLog(@" Bitrate: %lld bps", layer.bitrate);
NSLog(@" Total bitrate (incl. RTP overhead): %lld bps", layer.totalBitrate);
NSLog(@" Codec: %@", layer.codec ?: @"unknown");
NSLog(@" Scalability mode: %@", layer.scalabilityMode ?: @"none");
NSLog(@" Quality limitation: %@", @(layer.qualityLimitationReason));
}
if (stats.transport) {
NSLog(@"Estimated uplink bandwidth: %lld bps", stats.transport.connectionEstimatedBandwidth);
}
}
- (void)publisher:(OTPublisherKit *)publisher
audioNetworkStatsUpdated:(NSArray<OTPublisherKitAudioNetworkStats *> *)statsArray {
OTPublisherKitAudioNetworkStats *stats = statsArray.firstObject;
if (!stats) return;
// For routed sessions, the first element is sufficient.
// For relayed sessions, iterate all elements if you want per-subscriber stats.
NSString *connectionId = stats.connectionId ?: @"<none>";
NSString *subscriberId = stats.subscriberId ?: @"<none>";
NSLog(@"Publisher Audio Stats for connectionId: %@, subscriberId: %@", connectionId, subscriberId);
NSLog(@"Audio bytes sent: %lld", stats.audioBytesSent);
NSLog(@"Audio packets sent: %lld", stats.audioPacketsSent);
NSLog(@"Audio packets lost: %lld", stats.audioPacketsLost);
NSLog(@"Stats timestamp: %f ms", stats.timestamp);
if (stats.transport) {
NSLog(@"Estimated uplink bandwidth: %lld bps", stats.transport.connectionEstimatedBandwidth);
}
}
Für einen Verleger in einer gerouteten Sitzung (eine, die die Vonage Video-Media-Router), enthält das Array stats ein Objekt, das die Statistiken für den einzelnen Audio- oder Video-Medienstrom, der an den Vonage Video Media Router gesendet wird. In einer weitergeleiteten Sitzung enthält das stats-Array ein Objekt für jeden Teilnehmer des des veröffentlichten Streams.
Empfang von Ereignissen in Videoqualität bei den Herausgebern
Wenn Sie auch an Videoqualitätsereignissen interessiert sind, implementieren Sie diesen Callback:
- (void)publisher:(OTPublisherKit *)publisher
videoQualityChanged:(OTPublisherKitVideoNetworkStats *)stats
reason:(OTPublisherVideoEventReason)reason {
NSLog(@"Publisher video quality event: %ld", (long)reason);
}
Aktivieren von Statistiken für Abonnenten
Anhängen einer Klasse, die die OTSubscriberKitNetworkStatsDelegate:
@interface MyViewController () <OTSubscriberKitDelegate, OTSubscriberKitNetworkStatsDelegate>
@end
OTSubscriber *subscriber = [[OTSubscriber alloc] initWithStream:stream
delegate:self];
subscriber.networkStatsDelegate = self;
[session subscribe:subscriber error:nil];
Implementieren Sie die Rückrufe:
- (void)subscriber:(OTSubscriberKit *)subscriber
videoNetworkStatsUpdated:(OTSubscriberKitVideoNetworkStats *)stats {
NSLog(@"Video bytes received: %llu", stats.videoBytesReceived);
}
- (void)subscriber:(OTSubscriberKit *)subscriber
audioNetworkStatsUpdated:(OTSubscriberKitAudioNetworkStats *)stats {
NSLog(@"Audio packets received: %llu", stats.audioPacketsReceived);
}
Empfang von Videoqualitätsereignissen bei den Abonnenten
Zusätzlich können Sie Ereignisse mit geänderter Videoqualität für Abonnenten behandeln:
- (void)subscriber:(OTSubscriberKit *)subscriber
videoQualityChanged:(OTSubscriberKitVideoNetworkStats *)stats
reason:(OTSubscriberVideoEventReason)reason {
NSLog(@"Subscriber video quality event: %ld", (long)reason);
}
Statistik-Datenstrukturen
In diesem Abschnitt werden die Strukturen und Eigenschaften beschrieben, die von der iOS-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.
OTTransportStats
Stellt eine gemeinsame Schätzung auf Transportebene dar.
connectionEstimatedBandwidth- Geschätzte verfügbare Uplink-Verbindungsbandbreite (bps).
OTPublisherKitVideoNetworkStats
Liefert Statistiken über die Videospur eines Herausgebers. Sie umfasst:
connectionId- In einer weitergeleiteten Sitzung die Verbindungs-ID des Clients, der den Stream abonniert. Undefiniert in einer gerouteten Sitzung.subscriberId- In einer weitergeleiteten Sitzung die abonnierte ID des Clients, der den Stream abonniert. Undefiniert in einer gerouteten Sitzung.videoPacketsLost- Geschätzte verlorene Videopakete.videoPacketsSent- Gesendete Videopakete.videoBytesSent- Video-Bytes gesendet.timestamp- Unix-Zeitstempel in Millisekunden, als die Statistiken erfasst wurden.startTime- Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannen.videoLayers- Das Array der Video-Layer-Statistiken (sieheOTPublisherKitVideoLayerStats).transport- Netzwerkstatistiken auf Transportebene.
OTPublisherKitAudioNetworkStats
Liefert Statistiken über den Audiotrack eines Verlags. Sie umfasst:
connectionId- In einer weitergeleiteten Sitzung die Verbindungs-ID des Clients, der den Stream abonniert. Undefiniert in einer gerouteten Sitzung.subscriberId- In einer weitergeleiteten Sitzung die abonnierte ID des Clients, der den Stream abonniert. Undefiniert in einer gerouteten Sitzung.audioPacketsLost- Geschätzte verlorene Pakete.audioPacketsSent- Audio-Pakete gesendet.audioBytesSent- Gesendete Audio-Bytes.timestamp- Unix-Zeitstempel in Millisekunden.startTime- Der Zeitstempel in Millisekunden seit der Unix-Epoche, ab dem die kumulativen Summen zu kumulieren begannen.transport- Netzwerkstatistiken auf Transportebene.
OTPublisherKitVideoLayerStats
Steht für eine Simulcast- oder SVC-Schicht.
width- Kodierte Bildbreite.height- Kodierte Rahmenhöhe.encodedFrameRate- Kodierte Bilder pro Sekunde.bitrate- Bitrate der Schicht (bps).totalBitrate- Bitrate der Schicht einschließlich RTP-Overhead (bps).scalabilityMode- SVC/Skalierbarkeitsdeskriptor (z. B. "L3T3").qualityLimitationReason- Grund für die Qualitätseinschränkung (Bandbreite, CPU, Codec, Auflösung oder Ebenenwechsel).codec- Der von dieser Videoebene verwendete Codec.
OTSenderStats
Abschätzungsmetriken auf der Senderseite (gespiegelt auf Audio und Video).
connectionMaxAllocatedBitrate- Geschätzte maximale Bitrate für die Senderverbindung.connectionEstimatedBandwidth- Aktuelle Bandbreitenabschätzung (bps).
OTSubscriberKitVideoNetworkStats
Liefert Statistiken über die Videospur eines Abonnenten. Sie umfasst:
videoPacketsLost- Geschätzte verlorene Videopakete.videoPacketsReceived- Empfangene Videopakete.videoBytesReceived- Empfangene Videobytes.timestamp- Unix-Zeitstempel in Millisekunden, als die Statistiken erfasst wurden.senderStats- Metriken auf der Absenderseite (optional).width- Dekodierte Bildbreite in Pixel.height- Dekodierte Bildhöhe in Pixel.decodedFrameRate- Dekodierte Bilder pro Sekunde.bitrate- Video-Bitrate (bps).totalBitrate- Bitrate einschließlich RTP-Overhead (bps).pauseCount- Numbers of pauses (>5s seit dem letzten Frame). Einschließlich absichtlicher Deaktivierungen und Audio-Fallback-Fälle.totalPausesDuration- Gesamte Pausendauer (ms).freezeCount- Freeze Count (von WebRTC definiertes Freeze-Ereignis).totalFreezesDuration- Gesamtdauer des Einfrierens (ms).codec- Aktueller Decoder-Codec.
OTSubscriberKitAudioNetworkStats
Liefert Statistiken über den Audiotrack eines Abonnenten. Sie umfasst:
audioPacketsLost- Geschätzte verlorene Pakete.audioPacketsReceived- Empfangene Pakete.audioBytesReceived- Empfangene Bytes.timestamp- Unix-Zeitstempel in Millisekunden.senderStats- Metriken auf der Absenderseite (optional).
Statistik auf der Absenderseite
Siehe die Übersicht der Absenderstatistiken.
Aktivieren von Statistiken auf der Absenderseite
Senderstatistiken werden von den Abonnenten empfangen. Um absenderseitige Statistiken zu erhalten, aktivieren Sie sie für den Herausgeber des Streams, indem Sie die Option senderStatsTrack Eigenschaft zu true für die OTPublisherKitSettings Objekt, das zur Erstellung des Verlags verwendet wird.
OTPublisherKitSettings *settings = [[OTPublisherKitSettings alloc] init];
settings.senderStatsTrack = YES;
OTPublisher *publisher = [[OTPublisher alloc] initWithDelegate:self
settings:settings];
Wenn senderStatsTrack nicht aktiviert ist, wird kein Absenderstatistikkanal für diesen Verlag veröffentlicht. Der Standardwert ist NO.
Abonnieren von Statistiken auf der Absenderseite
Wenn der Herausgeber des Streams senderseitige Statistiken aktiviert hat, erhalten die Abonnenten diese automatisch, sobald ein Hörer wie oben beschrieben für Video- oder Audiostatistiken registriert ist.
Implementieren Sie die Delegierungsmethode für Videostatistiken:
- (void)subscriber:(OTSubscriberKit *)subscriber
videoNetworkStatsUpdated:(OTSubscriberKitVideoNetworkStats *)stats
{
// The property may be nil if no sender statistics have been received yet.
if (stats.senderStats) {
OTSenderStats *sender = stats.senderStats;
NSLog(@"Connection max allocated bitrate: %lld bps", (long long)sender.connectionMaxAllocatedBitrate);
NSLog(@"Connection current estimated bandwidth: %lld bps", (long long)sender.connectionEstimatedBandwidth);
} else {
NSLog(@"Sender-side stats not available yet.");
}
}
In ähnlicher Weise implementieren -subscriber:audioNetworkStatsUpdated: für Audiostatistiken, die auch eine senderStats Eigentum.
Empfang von Statistikereignissen
Die absenderseitigen Statistiken werden über die OTSubscriberKitNetworkStatsDelegate Callbacks für Video und Audio, wie oben gezeigt. Die OTSenderStats, enthalten als die senderStats Mitglied in beiden OTSubscriberKitVideoNetworkStats und OTSubscriberKitAudioNetworkStatsbietet zwei Eigenschaften:
connectionMaxAllocatedBitrate- Die maximale Bitrate, die für die Verbindung geschätzt werden kannconnectionEstimatedBandwidth- 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.
RTC-Statistikbericht
Um Low-Level-Peer-Verbindungsstatistiken für Verlage zu erhalten, verwenden Sie die [OTPublisherKit getRtcStatsReport:] Methode. Dies liefert RTC-Statistikberichte für den Medienstrom.
Dies ist ein asynchroner Vorgang. Setzen Sie die >[OTPublisherKit rtcStatsReportDelegate]> Eigenschaft und implementieren die >[OTPublisherKitRtcStatsReportDelegate publisher:rtcStatsReport:]> Methode vor dem Aufruf [OTPublisherKit getRtcStatsReport:].
Wenn die Statistiken verfügbar sind, wird die Implementierung der >[OTPublisherKitRtcStatsReportDelegate publisher:rtcStatsReport:]> Nachricht gesendet wird. Die Nachricht enthält ein Array von OTPublisherRtcStats Objekte, die eine jsonArrayOfReports Eigentum.
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 abzurufen, verwenden Sie die [OTSubscriberKit getRtcStatsReport:] Methode. Dies liefert einen RTC-Statistikbericht für den Medienstrom.
Dies ist ein asynchroner Vorgang. Setzen Sie die [OTSubscriberKit rtcStatsReportDelegate]> Eigenschaft und implementieren die >[OTSubscriberKitRtcStatsReportDelegate subscriber:rtcStatsReport:]> Methode vor dem Aufruf [OTSubscriberKit getRtcStatsReport:].
Wenn die Statistiken verfügbar sind, wird die Implementierung der >[OTSubscriberKitRtcStatsReportDelegate subscriber:rtcStatsReport:]> Nachricht gesendet wird. Die Nachricht enthält ein a jsonArrayOfReports 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.
Muster
Die Vonage Video iOS SDK Client SDK Beobachtbarkeit Beispielanwendung demonstriert die Funktionen zur Beobachtung von Clients in einer mobilen Anwendung, die mit dem iOS Client SDK erstellt wurde.