Skalierbares Video
Skalierbares Video ist eine Funktion für geroutete Sitzungen, die die Videoqualität in Sitzungen mit mehreren Teilnehmern verbessert, indem jeder Teilnehmer eine Videoqualität erhält, die seinen aktuellen Netzwerkbedingungen entspricht - unabhängig von allen anderen Teilnehmern.
Ohne skalierbares Video leitet der Media Router die gleiche Videoqualität an alle Abonnenten eines Streams weiter. Wenn sich die Verbindung eines Teilnehmers verschlechtert, teilt der Router dem Anbieter anhand einer Bandbreitenschätzung mit, dass er die Bitrate reduzieren soll, wodurch sich die Qualität für alle Teilnehmer des Streams verringert. Bei aktivem skalierbarem Video wählt der Router die am besten geeignete Qualitätsstufe für jeden Abonnenten unabhängig und in Echtzeit aus, ohne die Qualität für andere Abonnenten zu beeinflussen.
Skalierbares Video erfordert eine weitergeleitete Sitzung (eine Sitzung, die den Medien-Router verwendet). Sie ist in weitergeleiteten Sitzungen nicht verfügbar und wäre dort auch nicht sinnvoll, da die Streams direkt zwischen den Clients übertragen werden, ohne dass ein Router zur Auswahl oder zum Wechsel der Qualitätsebenen im Weg steht. Siehe Der Media Router und die Medienmodi.
Skalierbares Video ist standardmäßig aktiviert. Die Einstellung auf Anwendungsebene ist standardmäßig auf AutoDas bedeutet, dass der Media Router skalierbares Video automatisch aktiviert, wenn sich mehr als zwei Clients in einer Sitzung befinden und alle anderen Bedingungen erfüllt sind. Sie können ihn auch auf Auf (immer aktiv) oder Aus - siehe Einstellung auf Applikationsebene für Details. Für die meisten Applications sind keine Codeänderungen erforderlich.
Codecs und Skalierbarkeitsmodelle
Wie skalierbares Video funktioniert, hängt von dem Codec ab, den der Herausgeber aushandelt. Wenn Sie die Unterschiede kennen, können Sie den richtigen Codec für Ihren Anwendungsfall auswählen, z. B. wenn Sie die CPU-Auslastung des Herausgebers, die Upstream-Bandbreite oder die Qualitätsanpassung auf der Seite des Abonnenten optimieren müssen.
VP8: Simulcast
Mit VP8Skalierbares Video wird implementiert durch Simultanübertragung. Der Herausgeber kodiert und überträgt mehrere völlig getrennte Bitströme mit unterschiedlichen Auflösungen und Bildfrequenzen - z. B. 1080p, 540p und 270p mit jeweils eigenen zeitlichen (Bildfrequenz-)Schichten. Jeder Stream ist in sich abgeschlossen und kann für sich decodiert werden.
Da die einzelnen Streams völlig unabhängig voneinander sind, kann der Media Router jeden Teilnehmer ohne erneute Codierung sofort auf eine andere Qualitätsstufe umschalten und bietet so eine hohe Ausfallsicherheit bei sich ändernden Netzwerkbedingungen.
Kompromiss: Das Kodieren und Hochladen mehrerer Streams erfordert mehr CPU und Upstream-Bandbreite auf der Seite des Herausgebers als das Senden einer einzigen Qualität. Die Kodierung von Schichten mit niedrigerer Auflösung ist deutlich billiger als die der höchsten Qualität, aber die Gesamtkosten sind immer noch höher als bei einem nicht simulierten Stream.
VP9: Skalierbare Videokodierung (SVC)
Mit VP9skalierbare Videoanwendungen Skalierbare Videokodierung (SVC). Der Herausgeber kodiert einen einzelnen Bitstrom, in den mehrere räumliche (Auflösung) und zeitliche (Bildrate) Ebenen mathematisch eingebettet sind. Jede höhere Schicht hängt von den niedrigeren Schichten ab, so dass ein Decoder, der nur die Basisschicht empfängt, eine niedrige Qualität erhält, während ein Decoder, der alle Schichten empfängt, die volle Qualität erhält - und das aus demselben Bitstrom.
Die CPU-Kosten des Publishers für die SVC-Codierung sind höher als die für die Codierung eines einzelnen Streams - ungefähr vergleichbar mit VP8-Simulcast -, aber SVC erfordert weniger Upstream-Bandbreite, da nur ein Bitstream hochgeladen werden muss, anstatt mehrere unabhängige Streams. Aus dem einzelnen kodierten Stream kann der Media Router genau die richtige Teilmenge von Schichten für jeden Abonnenten extrahieren und weiterleiten, was eine effiziente und flexible Qualitätsanpassung ermöglicht, die auch gegenüber Paketverlusten widerstandsfähiger ist.
SVC erfordert, dass sowohl der Publisher-Endpunkt als auch der Media Router VP9 SVC unterstützen. Firefox unterstützt VP9, aber nicht SVC - ein Firefox-Herausgeber sendet VP9 ohne Layer, so dass der Media Router die Qualität für diesen Stream nicht anpassen kann.
Für eine vollständige Erklärung der SVC-Schichten, der Skalierbarkeitsmodi (L1T3, L2T3, L3T3), Archivierungsverhalten und Geräteunterstützung, siehe VP9 Skalierbare Videocodierung für geroutete Sitzungen.
Der wichtigste Unterschied auf einen Blick
| Aspekt | Simultanübertragung (VP8) | SVC (VP9) |
|---|---|---|
| Was der Verlag sendet | Mehrere unabhängige Bitströme mit unterschiedlichen Auflösungen und Bildraten (unterschiedliche SSRCs/RIDs) | 1 Bitstrom mit eingebetteten räumlichen und zeitlichen Schichten (einzelnes SSRC) |
| Räumliche Schichten | Multi-Stream: jede Auflösung ist ein separater kodierter Stream | Eingebettet in einen einzigen Bitstrom |
| Zeitliche Schichten | Jeder Simulcast-Stream kann zeitliche Schichten enthalten | Eingebettet in einen einzigen Bitstrom |
| Rolle des Medienrouters | Auswählen, welcher Stream weitergeleitet werden soll | Extrahieren und Weiterleiten der richtigen Schichten |
| Unterstützung für Firefox-Publisher | Unterstützt durch RID-basierte Kodierungen | VP9 ja; SVC wird von Firefox nicht unterstützt |
Auflösungsverhältnis der räumlichen Ebene: Jeder räumliche Schritt verwendet eine Auflösungsverhältnis 2:1. Eine L3T3 Stream hat Ebenen mit 100%, 50% und 25% der Quellauflösung (z.B. 1080p → 540p → 270p). Dies ist der Grund setPreferredResolution() können sehr unterschiedliche Auflösungen anstreben.
H.264: Skalierbares Video wird nicht unterstützt
Der H.264-Codec wird von der Vonage Video API für die Veröffentlichung und das Abonnieren vollständig unterstützt, aber Skalierbares Video ist für H.264-Streams nicht verfügbar. Der Media Router kann die Qualitätsebenen für H.264-Streams nicht wechseln, und die Einstellungen für skalierbares Video haben keine Auswirkungen, wenn H.264 ausgehandelt wird. Wenn Ihre Anwendung skalierbares Video erfordert, verwenden Sie stattdessen VP8 oder VP9. Siehe . Video-Codecs.
Skalierbare Videounterstützung
Skalierbares Video wird für VP8 Simulcast und VP9 SVC unterstützt. Es wird nicht unterstützt für H.264-Streams. Es ist nur verfügbar in weitergeleitete Sitzungen.
Die folgenden Clients unterstützen skalierbares Video:
- Web-SDK - Chrome, Firefox, Safari, Samsung Internet, WebView Android, WebView auf iOS und Chromium-basiertes Edge. Hinweis: Firefox unterstützt VP8 Simulcast, aber nicht VP9 SVC.
- Android-SDK (auf unterstützten Geräten)
- iOS-SDK (auf unterstützten Geräten)
- Windows-SDK
- Linux-SDK
- macOS-SDK
- React Native SDK (auf unterstützten Geräten)
Einzelheiten zur Kompatibilität von VP9-SVC-Geräten und -Browsern finden Sie unter VP9 Skalierbare Videocodierung für geroutete Sitzungen.
Anmerkung: Standardmäßig ist skalierbares Video für Streams zur Bildschirmfreigabe deaktiviert und für Kamera- und benutzerdefinierte Videoquellen-Streams aktiviert. Um skalierbares Video für die Bildschirmfreigabe zu aktivieren, siehe Skalierbare Streams zur Bildschirmfreigabe.
Skalierbares Video verwenden
Einstellung auf Applikationsebene
Skalierbares Video verfügt über drei Modi, die Sie pro Anwendung in der Vonage Dashboard:
- Melden Sie sich bei Ihrem Vonage Video API Account.
- Wählen Sie im Menü auf der linken Seite Applications.
- Klicken Sie bei einer bestehenden Anwendung auf das Drei-Punkte-Menü und wählen Sie bearbeiten. Für eine neue Anwendung rufen Sie den Abschnitt Fähigkeiten auf, nachdem Sie auf Erstellen Sie eine neue Anwendung.
- Umschalten zur Aktivierung der Video Option.
- Scrollen Sie nach unten und klicken Sie auf Erweiterte Funktionen anzeigen.
- Unter Skalierbares Videowählen Sie eine der folgenden Möglichkeiten:
- Auto (empfohlen) - Der Media Router aktiviert skalierbares Video, wenn sich mehr als zwei Clients in einer Sitzung befinden. Lassen Sie diese Option aktiviert, es sei denn, Sie haben einen besonderen Grund, sie zu deaktivieren.
- Auf - Skalierbares Video ist immer (in unterstützten Clients) für alle Sitzungen in dieser Anwendung aktiviert.
- Aus - Skalierbares Video ist für alle Sitzungen in dieser Anwendung deaktiviert. Verwenden Sie dies, um die Auflösung und die Bildrate zu sperren oder um die CPU- und Bandbreitennutzung des Herausgebers zu reduzieren.
- Klicken Sie auf Änderungen speichern.
Anmerkung: Diese Einstellung steuert VP8-Simultanübertragung Verhalten. VP9 verwendet immer SVC, wenn es unterstützt wird, und H.264 unterstützt kein skalierbares Video - beides wird durch diese Einstellung nicht beeinflusst.
Anmerkung: Streams benötigen mehr Upstream-Bandbreite vom Herausgeber, wenn skalierbares Video aktiv ist, da zusätzliche Qualitätsebenen kodiert und übertragen werden.
Skalierbare Streams zur Bildschirmfreigabe
Standardmäßig ist skalierbares Video deaktiviert für Screen-Sharing-Streams und aktiviert für Kamera- und benutzerdefinierte Videoquellenströme. Inhalte für die Bildschirmfreigabe ändern sich in der Regel weniger häufig als Kameravideos, so dass die zusätzlichen Codierungskosten für skalierbares Video in der Regel unnötig sind. Die Aktivierung kann jedoch in Sitzungen von Vorteil sein, in denen Screen-Sharing-Teilnehmer unterschiedliche Netzwerkbedingungen haben. Sie können die Standardeinstellung pro Herausgeber außer Kraft setzen:
| SDK | Methode / Eigenschaft |
|---|---|
| Web-SDK | scalableScreenshare Option in OT.initPublisher() |
| Android-SDK | PublisherKit.Builder.scalableScreenshare() |
| iOS-SDK | OTPublisherKitSettings.scalableScreenshare |
| Windows-SDK | Publisher.Builder.ScalableScreenshare |
| Linux-SDK | otc_publisher_settings_set_scalable_screenshare() |
Wie sich der Inhaltshinweis auf die Ebenen der Bildschirmfreigabe auswirkt
Wenn für einen VP8-Bildschirmfreigabestream in einer weitergeleiteten Sitzung skalierbares Video aktiviert ist, wird die Hinweis zu Videoinhalten Die Einstellung, die Sie für den Publisher vornehmen, bestimmt, wie dieser die von ihm gesendeten Simulcast-Ebenen strukturiert. Aus diesem Grund variiert die Anzahl der Streams (SSRCs), die Sie für einen Publisher mit Bildschirmfreigabe in einem Tool wie chrome://webrtc-internals hängt vom Inhaltshinweis ab:
-
detailodertext— Der Publisher ist darauf ausgelegt, feine Details und die Lesbarkeit (Text, Strichzeichnungen, statische Inhalte) zu erhalten. Er sendet zwei Streams mit derselben räumlichen Auflösung, die sich lediglich in der Bildrate unterscheiden: einen Stream in voller Auflösung mit der regulären Bildrate und einen zweiten Stream in voller Auflösung mit einer niedrigeren Bildrate. Dadurch bleiben die gemeinsam genutzten Inhalte scharf und gut lesbar, während der Media Router gleichzeitig auf eine Ebene mit niedrigerer Bitrate zurückgreifen kann, wenn sich die Netzwerkverbindung eines Abonnenten verschlechtert – so führt eine Verschlechterung zu einer Verringerung der Bildrate, anstatt die Details zu verwischen. Zwei Ebenen in voller Auflösung bieten ein gutes Gleichgewicht zwischen Ausfallsicherheit bei einer Verschlechterung der Verbindung und der Beibehaltung der ursprünglichen, detailreichen Auflösung. -
motion— Der Publisher sorgt für einen reibungslosen Ablauf (beispielsweise bei der gemeinsamen Wiedergabe von Videos). Er verhält sich wie eine Kamera-Simulcast-Übertragung und sendet mehrere Datenströme mit unterschiedlichen räumlichen Auflösungen, sodass der Media Router einen Teilnehmer auf eine niedrigere Auflösung umschalten kann, um unter eingeschränkten Netzwerkbedingungen eine flüssige Bildwiedergabe zu gewährleisten.
Wähle den Inhaltshinweis aus, der zu deinem geteilten Inhalt passt: detail oder text legt den Schwerpunkt darauf, die Detailschärfe zu erhalten (wobei die Bildrate zuerst beeinträchtigt wird), während motion legt den Schwerpunkt auf flüssige Bewegungen (wobei die Auflösung zuerst reduziert wird).
Anmerkung: Dieses Layer-Verhalten gilt für VP8-Simulcast-Streams zur Bildschirmfreigabe. Legen Sie den Content-Hint über den videoContentHint Option in OT.initPublisher() oder die publisher.setVideoContentHint() Methode – siehe Hinweise zum Videoinhalt.
Einstellung der bevorzugten Bildrate und Auflösung des Teilnehmers
Wenn ein Stream mit skalierbarem Video veröffentlicht wird, können die Abonnenten dem Media Router eine bevorzugte Qualität mitteilen. Der Medienrouter wählt die nächstgelegene verfügbare Ebene aus, die den tatsächlichen Netzwerkbedingungen des Abonnenten entspricht.
Das ist wichtig: Aufruf von setPreferredResolution() oder setPreferredFrameRate() eine Neuaushandlung mit dem Medien-Router auslöst. Dies wiederholt oder in schneller Folge zu tun, ist kostspielig - es verbraucht CPU und kann die Gesamtqualität des Streams beeinträchtigen. Legen Sie die bevorzugten Werte einmal fest (oder nur, wenn sich das Layout des Teilnehmers wesentlich ändert), anstatt sie ständig anzupassen.
Warnung: Diese Einstellungen auf der Abonnentenseite setzen voraus, dass der Herausgeber das Standardlayout der Skalierbarkeitsschicht verwendet. Falls der Herausgeber dieses durch setTargetScalabilityMode(), die vom Media Router weitergeleitete Ebene entspricht möglicherweise nicht der angeforderten Auflösung oder Bildrate. Siehe Anpassung an die vom Teilnehmer bevorzugte Auflösung und Bildfrequenz für Einzelheiten.
| SDK | Bildfrequenz | Auflösung |
|---|---|---|
| Web-SDK | Subscriber.setPreferredFrameRate() - siehe Abo-Streams Web-Leitfaden |
Subscriber.setPreferredResolution() - siehe Abo-Streams Web-Leitfaden |
| Android-SDK | SubscriberKit.setPreferredFrameRate() - siehe abonnieren-streams Android Anleitung |
SubscriberKit.setPreferredResolution() - siehe abonnieren-streams Android Anleitung |
| iOS-SDK | OTSubscriberKit.preferredFrameRate - siehe iOS-Leitfaden für Abonnentenströme |
OTSubscriberKit.preferredResolution - siehe iOS-Leitfaden für Abonnentenströme |
| Windows-SDK | Subscriber.PreferredFramerate - siehe abonnieren-streamt Windows Anleitung |
Subscriber.PreferredResolution - siehe abonnieren-streamt Windows Anleitung |
| Linux-SDK | otc_subscriber_set_preferred_frame_rate() - siehe abonnieren-streamt Linux-Leitfaden |
otc_subscriber_set_preferred_resolution() - siehe abonnieren-streamt Linux-Leitfaden |
| React Native | preferredFrameRate Eigenschaft von OTSubscriber - siehe abonnieren-streams React Native Anleitung |
preferredResolution Eigenschaft von OTSubscriber - siehe abonnieren-streams React Native Anleitung |
So verifizieren Sie, dass Scalable Video funktioniert
Im SDK gibt es kein einzelnes Flag "skalierbares Video aktiv", aber Sie können mit den folgenden Ansätzen bestätigen, dass es funktioniert.
Video-Inspektor
Die Video-Inspektor Tool im Modul Qualitätsmetriken zeigt den Codec, die Auflösung und die Bildrate an. Bewegen Sie den Mauszeiger über einen beliebigen Punkt auf einer gezeichneten Linie, um den aktuell verwendeten Codec anzuzeigen. Wenn skalierbares Video aktiviert ist, kann die Auflösung und/oder die Bildrate für einen oder mehrere Teilnehmer als Reaktion auf sich ändernde Netzwerkbedingungen dynamisch angepasst werden.
WebRTC-Statistiken
Jedes SDK stellt den zugrunde liegenden WebRTC-Statistikbericht zur Verfügung. Auf der Verlegerseite, inspizieren Sie RTCOutboundRtpStreamStats:
- Mit VP8-Simultanübertragungsehen Sie mehrere
ssrcEinträge mit unterschiedlichenframeWidth/frameHeightWerte - einen pro Simulcast-Ebene. - Mit VP9 SVCsehen Sie eine einzelne
ssrcmit einerscalabilityModeEigenschaft gesetzt (zum Beispiel,L3T3).
Anmerkung: Für einen VP8 Bildschirmfreigabe Stream veröffentlicht mit dem detail oder text Inhaltshinweis: Die beiden ssrc Einträge haben die dasselbe frameWidth/frameHeight und unterscheiden sich in der Bildfrequenz statt in der Auflösung. Siehe Wie sich der Inhaltshinweis auf die Ebenen der Bildschirmfreigabe auswirkt.
SDK-Methoden für den Zugriff auf den Statistikbericht:
- Web SDK -
Publisher.getRtcStatsReport()undSubscriber.getRtcStatsReport() - Linux - siehe Stream-Statistiken abrufen
Checkliste: Bedingungen, die erfüllt sein müssen, damit skalierbares Video aktiv ist
Wenn Sie kein adaptives Qualitätsverhalten beobachten können, überprüfen Sie Folgendes:
- Die Sitzung ist geroutet (nicht weitergegeben).
- Skalierbares Video ist nicht eingestellt auf Aus auf der Ebene der Anwendung.
- Der ausgehandelte Codec ist VP8 oder VP9 (nicht H.264).
- Der Verlag läuft auf einem unterstützter Client.
Festlegen des Zielskalierbarkeitsmodus
Sie können den Skalierbarkeitsmodus für einen Publisher explizit festlegen und so die Anzahl der räumlichen (Auflösung) und zeitlichen (Bildrate) Ebenen steuern, die WebRTC codiert. Auf diese Weise erhalten Sie eine detaillierte Kontrolle über das Gleichgewicht zwischen der Anpassungsfähigkeit der Videoqualität und dem Ressourcenverbrauch.
Wie es funktioniert
Der Zielskalierbarkeitsmodus wird auf den Medienpfad des Media Routers (Publisher → Media Router) angewendet. Er kann jederzeit festgelegt oder geändert werden – dafür muss die Medienpfad-Aushandlung nicht abgeschlossen sein, und Sie können ihn während einer aktiven Sitzung im laufenden Betrieb aktualisieren, während der Encoder bereits läuft. Wenn Sie die set-Methode aufrufen, bevor der Medienpfad eingerichtet ist, speichert das SDK den Wert und wendet ihn an, sobald die Codec-Aushandlung abgeschlossen ist. In Adaptives Medien-Routing Bei (AMR)-Sitzungen wird der Modus nur auf den Medienpfad zum Medienrouter (Publisher → Medienrouter) angewendet, da Skalierbarkeitsmodi nicht verwendet werden, wenn der Medienrouter im Medienpfad umgangen wird.
Was das Ziel steuert
Der Zielskalierbarkeitsmodus gibt dem Encoder vor, wie viele räumliche (Auflösung) und zeitliche (Bildfrequenz) Ebenen erzeugt werden sollen. Dies bestimmt direkt, welche Qualitätsoptionen dem Media Router bei der Weiterleitung von Videos an die einzelnen Abonnenten zur Verfügung stehen:
- Weitere räumliche Ebenen — Der Media Router kann die Auflösung für Teilnehmer mit begrenzter Bandbreite herabsetzen, während für andere die volle Auflösung beibehalten wird. Zum Beispiel:
L3T3bietet dem Router drei Auflösungsstufen zur Auswahl. - Weitere zeitliche Ebenen — Der Media Router kann die Bildrate für Teilnehmer mit begrenzter Bandbreite senken, ohne dabei die Auflösung zu verringern. Zum Beispiel:
L1T3behält stets die volle Auflösung bei, bietet dem Router jedoch drei Bildratenstufen zur Auswahl – dies eignet sich besonders für detailreiche Inhalte wie Folien oder Dokumente. - Weniger Ebenen — reduziert die CPU- und Bandbreitenauslastung des Publishers, schränkt jedoch die Fähigkeit des Media Routers ein, die Qualität pro Teilnehmer anzupassen.
Wenn das Ziel möglicherweise nicht vollständig umgesetzt wird
Das Ziel ist eine Einstellung – der Encoder wendet sie an, wenn die Bedingungen dies zulassen. Der tatsächlich angewendete Modus kann in folgenden Fällen von Ihrem Ziel abweichen:
- Codec-Einschränkungen — Wenn der ausgehandelte Codec die angeforderten Ebenen nicht unterstützt, wird der Modus angepasst. Beispielsweise wird bei der Einstellung
L2T3mit VP8 ergibt sichL1T3wird angewendet, da VP8 keine räumliche Skalierbarkeit unterstützt. Siehe Codec-abhängiger Fallback. - Die Auflösung ist für die angeforderten räumlichen Ebenen zu gering — Bei jedem Schritt der räumlichen Ebenen wird ein Auflösungsverhältnis von 2:1 verwendet. Wenn die Aufnahmeauflösung des Anbieters zu niedrig ist, um eine sinnvolle Unterteilung vorzunehmen (beispielsweise bei einer Veröffentlichung mit 320×240 bei
L3T3(wie angefordert) kann der Encoder möglicherweise weniger räumliche Ebenen erzeugen als angefordert, da die unterste Ebene zu klein wäre, um von Nutzen zu sein. - Hardware- oder Ressourcenbeschränkungen — Auf Geräten mit begrenzten Ressourcen erzeugt der Encoder möglicherweise nicht alle angeforderten Ebenen, wenn dadurch die CPU- oder Bandbreitenkapazitäten überschritten würden.
Überprüfen des ausgewählten Modus
Die get-Methode gibt Ihren Ziel (was Sie eingestellt haben), nicht unbedingt das, was tatsächlich angewendet wurde. Um zu überprüfen, welche Skalierungsstufen der Encoder tatsächlich erzeugt, nutzen Sie den WebRTC-Statistikbericht – insbesondere den RTCOutboundRtpStreamStats — via getRtcStatsReport(). Weitere Informationen zum plattformübergreifenden Zugriff auf Statistiken finden Sie unter So verifizieren Sie, dass Scalable Video funktioniert und Beobachtbarkeit der Kunden.
Gültige Skalierbarkeitsmodi
Die folgenden Modi werden unterstützt:
| Modus | Räumliche Schichten | Zeitliche Schichten | Beschreibung |
|---|---|---|---|
L1T1 |
1 | 1 | Eine Auflösung, eine Bildrate (keine Skalierbarkeit) |
L1T2 |
1 | 2 | Eine Auflösung, zwei Bildratenstufen |
L1T3 |
1 | 3 | Eine Auflösung, drei Bildratenstufen |
L2T1 |
2 | 1 | Zwei Auflösungen, eine Bildrate |
L2T2 |
2 | 2 | Zwei Auflösungen, zwei Bildratenstufen |
L2T3 |
2 | 3 | Zwei Auflösungen, drei Bildratenstufen |
L3T1 |
3 | 1 | Drei Auflösungen, eine Bildrate |
L3T2 |
3 | 2 | Drei Auflösungen, zwei Bildratenstufen |
L3T3 |
3 | 3 | Drei Auflösungen, drei Bildratenstufen |
Das Format entspricht dem W3C WebRTC SVC-Spezifikation: L<spatial>T<temporal>, wobei die Zahl nach L ist die Anzahl der räumlichen Ebenen und die Zahl nach T ist die Anzahl der zeitlichen Schichten.
Jeder Wert, der nicht in dieser Liste enthalten ist, wird mit einer Fehlermeldung abgelehnt. Wenn Sie die set-Methode noch nie aufgerufen haben (zum Beispiel, setTargetScalabilityMode() im Web/auf Android oder die targetScalabilityMode Eigenschaft unter iOS/Windows) gibt die entsprechende get-Methode einen leeren oder einen Null-Wert (plattformabhängig) zurück – dies liegt daran, dass der Skalierbarkeitsmodus ein Ziel Dies ist lediglich eine Einstellung und kein intern verwalteter Standardwert. Das SDK legt kein Standardziel für Sie fest. Solange Sie also nicht explizit eines festlegen, wird kein Wert zurückgegeben.
Codec-abhängiger Fallback
Der Modus, der tatsächlich angewendet hängt von dem Codec ab, der auf dem Medienpfad des Media Routers ausgehandelt wurde:
- SVC-fähige Codecs (VP9) — Der angeforderte Modus wird unverändert übernommen. Diese Codecs unterstützen sowohl räumliche als auch zeitliche Skalierbarkeitsstufen nativ.
- VP8 — VP8 unterstützt ausschließlich zeitliche Skalierbarkeit, ohne räumliche Ebenen; räumliche Eigenschaften werden durch die Veröffentlichung mehrerer Streams mit unterschiedlichen Auflösungen (Simulcast) berücksichtigt. Der am ehesten passende Modus ergibt sich, indem die zeitliche Dimension beibehalten und die Anzahl der räumlichen Ebenen auf 1 festgelegt wird. Wenn Sie beispielsweise folgende Einstellung vornehmen:
L2T2und VP8 wird ausgehandelt,L1T2wird angewendet. - H.264 — Scalable Video wird für H.264 in dieser Video API nicht unterstützt, daher gilt das oben beschriebene Fallback-Verhalten nicht für H.264-Streams.
Die get-Methode gibt immer das zurück, was Sie explizit festgelegt haben (Ihre Absicht), unabhängig davon, was nach dem codec-abhängigen Fallback tatsächlich angewendet wurde. Wenn Sie beispielsweise L2T3 und VP8 ausgehandelt wird, wendet der Media Router Folgendes an: L1T3 (da VP8 keine räumlichen Ebenen enthält), aber die get-Methode gibt dennoch L2T3 — entsprechend Ihrem ursprünglichen Ziel, nicht dem effektiven Modus.
Anpassung an die vom Teilnehmer bevorzugte Auflösung und Bildfrequenz
Die Logik zur Schichtauswahl des Media Routers für Subscriber.setPreferredResolution() und Subscriber.setPreferredFrameRate() basiert auf dem Standardlayout der Skalierbarkeitsschichten. Wenn ein Publisher einen vom Standard abweichenden Ziel-Skalierbarkeitsmodus festlegt, stimmen die vom Encoder tatsächlich erzeugten räumlichen und/oder zeitlichen Schichten nicht mehr mit den vom Media Router als verfügbar angenommenen Schichten überein, und die Schicht, die der Router an einen Abonnenten weiterleitet, entspricht möglicherweise nicht der vom Abonnenten angeforderten Auflösung oder Bildrate.
Warnung: Wenn ein Publisher den Skalierbarkeitsmodus mit setTargetScalabilityMode() (oder die entsprechende Eigenschaft unter iOS/Windows), Abonnenten, die anrufen setPreferredResolution() oder setPreferredFrameRate() im Stream dieses Anbieters erhalten nicht unbedingt die gewünschte Auflösung oder Bildrate. Wenn Sie beispielsweise eine niedrigere bevorzugte Auflösung mit setPreferredResolution() kann möglicherweise keine Wirkung zeigen, wenn der vom Herausgeber gewählte Modus keine passende räumliche Ebene bereitstellt, und eine bevorzugte Bildrate kann einer anderen zeitlichen Ebene zugeordnet werden als erwartet. Wenn Ihre Anwendung darauf angewiesen ist, dass die Auswahl der bevorzugten Auflösung/Bildrate auf der Abonnentenseite vorhersehbar funktioniert, belassen Sie den Zielskalierbarkeitsmodus auf seiner Standardeinstellung.
Plattformspezifische API-Nutzung
Das Publisher-Objekt umfasst setTargetScalabilityMode() und getTargetScalabilityMode() Methoden.
Festlegen des Zielskalierbarkeitsmodus
Rufen Sie an. setTargetScalabilityMode() auf einem Publisher-Objekt, um den Zielskalierbarkeitsmodus festzulegen. Die Methode akzeptiert eine Zeichenfolge, die den gewünschten Modus angibt:
publisher.setTargetScalabilityMode('L3T3');
Diese Methode kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Medienpfadaushandlung bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers hergestellt ist.
Die Methode löst einen Fehler aus, wenn der angeforderte Modus ungültig ist (d. h. nicht zu den folgenden gehört: L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode('L3T3');
} catch (err) {
console.error('Invalid scalability mode:', err.message);
}
Den gewünschten Skalierbarkeitsmodus ermitteln
Rufen Sie an. getTargetScalabilityMode() um den explizit festgelegten Wert abzurufen. Die Funktion gibt undefined falls der Setter noch nie aufgerufen wurde:
const mode = publisher.getTargetScalabilityMode();
console.log(mode); // 'L3T3' or undefined
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Die PublisherKit Klasse umfasst setTargetScalabilityMode() und getTargetScalabilityMode() Methoden.
Festlegen des Zielskalierbarkeitsmodus
Rufen Sie an. setTargetScalabilityMode() in einer PublisherKit-Instanz, um den Ziel-Skalierbarkeitsmodus festzulegen:
publisher.setTargetScalabilityMode("L3T3");
Diese Methode kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Medienpfadaushandlung bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers hergestellt ist.
Die Methode löst einen OpenTokException wenn der angeforderte Modus ungültig ist (d. h. nicht zu den folgenden gehört: L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode("L3T3");
} catch (OpenTokException e) {
Log.e(TAG, "Invalid scalability mode: " + e.getMessage());
}
Den gewünschten Skalierbarkeitsmodus ermitteln
Rufen Sie an. getTargetScalabilityMode() um den explizit festgelegten Wert abzurufen. Die Funktion gibt null falls der Setter noch nie aufgerufen wurde:
String mode = publisher.getTargetScalabilityMode();
// "L3T3" or null
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Die OTPublisherKit Die Klasse enthält die targetScalabilityMode Eigentum.
Festlegen des Zielskalierbarkeitsmodus
Setzen Sie die targetScalabilityMode Eigenschaft einer OTPublisherKit-Instanz, um den Zielskalierbarkeitsmodus festzulegen:
try publisher.setTargetScalabilityMode("L3T3")
Der Setter kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Aushandlung des Medienpfads bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers eingerichtet ist.
Der Setter löst eine OTError wenn der angeforderte Modus ungültig ist (d. h. nicht zu den folgenden gehört: L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
Den gewünschten Skalierbarkeitsmodus ermitteln
Lesen Sie die targetScalabilityMode Eigenschaft, um den explizit festgelegten Wert abzurufen. Sie gibt nil falls der Setter noch nie aufgerufen wurde:
let mode = publisher.targetScalabilityMode
// "L3T3" or nil
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Die OTPublisherKit Die Klasse enthält die targetScalabilityMode Eigentum.
Festlegen des Zielskalierbarkeitsmodus
Setzen Sie die targetScalabilityMode Eigenschaft einer OTPublisherKit-Instanz, um den Zielskalierbarkeitsmodus festzulegen:
NSError *error = nil;
[publisher setTargetScalabilityMode:@"L3T3" error:&error];
Der Setter kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Aushandlung des Medienpfads bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers eingerichtet ist.
Der Setter löst eine OTError wenn der angeforderte Modus ungültig ist (d. h. nicht zu den folgenden gehört: L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
Den gewünschten Skalierbarkeitsmodus ermitteln
Lesen Sie die targetScalabilityMode Eigenschaft, um den explizit festgelegten Wert abzurufen. Sie gibt nil falls der Setter noch nie aufgerufen wurde:
NSString *mode = publisher.targetScalabilityMode;
// @"L3T3" or nil
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Die Publisher Die Klasse enthält die TargetScalabilityMode Eigentum.
Festlegen des Zielskalierbarkeitsmodus
Setzen Sie die TargetScalabilityMode Eigenschaft einer Publisher-Instanz, um den Zielskalierbarkeitsmodus festzulegen:
publisher.TargetScalabilityMode = "L3T3";
Der Setter kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Aushandlung des Medienpfads bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers eingerichtet ist.
Der Zuspieler wirft einen OpenTokException wenn der angeforderte Modus ungültig ist (d. h. nicht zu den folgenden gehört: L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try
{
publisher.TargetScalabilityMode = "L3T3";
}
catch (OpenTokException e)
{
Console.WriteLine("Invalid scalability mode: " + e.Message);
}
Den gewünschten Skalierbarkeitsmodus ermitteln
Lesen Sie die TargetScalabilityMode Eigenschaft, um den explizit festgelegten Wert abzurufen. Sie gibt null falls der Setter noch nie aufgerufen wurde:
string mode = publisher.TargetScalabilityMode;
// "L3T3" or null
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Das C-SDK enthält otc_publisher_set_target_scalability_mode() und otc_publisher_get_target_scalability_mode() Funktionen.
Festlegen des Zielskalierbarkeitsmodus
Rufen Sie an. otc_publisher_set_target_scalability_mode() So legen Sie den Zielskalierbarkeitsmodus für einen Publisher fest:
otc_status status = otc_publisher_set_target_scalability_mode(publisher, "L3T3");
if (status != OTC_SUCCESS) {
printf("Failed to set scalability mode\n");
}
Diese Methode kann jederzeit aufgerufen werden – es ist nicht erforderlich, dass die Medienpfadaushandlung bereits abgeschlossen ist. Der Modus wird angewendet, sobald der Medienpfad des Media Routers hergestellt ist.
Die Funktion gibt Folgendes zurück: OTC_INVALID_PARAM wenn:
- Der Publisher-Zeiger ist
NULL - Die Zeichenfolge für den Skalierbarkeitsmodus lautet
NULL - Der angeforderte Modus ist ungültig (d. h., er gehört nicht zu
L1T1,L1T2,L1T3,L2T1,L2T2,L2T3,L3T1,L3T2,L3T3)
Den gewünschten Skalierbarkeitsmodus ermitteln
Rufen Sie an. otc_publisher_get_target_scalability_mode() um den explizit festgelegten Wert abzurufen. Die Funktion gibt NULL falls der Setter noch nie aufgerufen wurde:
const char* mode = otc_publisher_get_target_scalability_mode(publisher);
if (mode != NULL) {
printf("Target scalability mode: %s\n", mode);
}
Anmerkung: Der Getter gibt die Absicht des Benutzers zurück, nicht den tatsächlich angewendeten Modus. Wenn ein Nicht-SVC-Codec (VP8 oder H.264) ausgehandelt wird, kann der angewendete Modus abweichen (räumliche Ebenen werden auf 1 begrenzt).
Häufige Missverständnisse und FAQs
Ist skalierbares Video das Gleiche wie VP9 SVC?
Nein. "Skalierbares Video" ist der Name der Vonage Video API-Funktion. Die technischer Mechanismus hängt vom jeweiligen Codec ab:
- VP8 implementiert skalierbares Video durch Simultanübertragung - der Herausgeber sendet mehrere unabhängige Datenströme.
- VP9 implementiert skalierbares Video durch SVC - der Herausgeber sendet einen Stream mit eingebetteten Schichten.
Mit beiden Mechanismen kann der Media Router die Qualität, die jeder Teilnehmer erhält, anpassen. Wenn in der Dokumentation von "skalierbarem Video" die Rede ist, ohne einen Codec zu nennen, bezieht sich dies auf die Funktion als Ganzes.
Erzwingt das Festlegen eines bevorzugten Codecs das Einschalten von skalierbarem Video?
Nein. Die Auswahl eines bevorzugten Codecs (im Dashboard oder über die preferredVideoCodecs Publisher-Option) ist unabhängig von skalierbarem Video. Ob skalierbares Video aktiviert wird, hängt von allen folgenden Faktoren ab:
- Die Einstellung für skalierbare Videoanwendungen (Ein / Aus / Auto).
- Die weitergeleitete Sitzung.
- Der ausgehandelte Codec unterstützt skalierbares Video (VP8 oder VP9 - nicht H.264).
- Der Client oder Browser des Herausgebers unterstützt skalierbares Video.
Warum ist Subscriber.setPreferredResolution() Keine Anpassung der Qualität?
Die Abonnentenseite setPreferredResolution() und setPreferredFrameRate() sind Hinweise auf den Media Routerund keine direkten Befehle an den Encoder des Anbieters. Der Medien-Router kann nur dann auf diese Hinweise reagieren, wenn er aktiv zwischen skalierbaren Videoschichten für diesen Abonnenten auswählt. Wenn eine der folgenden Bedingungen zutrifft, gibt es keine Ebenen, aus denen ausgewählt werden kann, und die Hinweise haben keine Wirkung:
- Skalierbares Video wird auf der Anwendungsebene oder im Publisher-Stream deaktiviert.
- Der ausgehandelte Codec ist H.264 (skalierbares Video wird nicht unterstützt).
- Der Client des Herausgebers erzeugt keine skalierbaren Schichten (z. B. ein Firefox-Herausgeber, der VP9 ohne SVC-Schichten sendet).
- Der Herausgeber hat eine CPU- oder Bandbreitenbeschränkung und sendet keine höheren Schichten, aus denen der Router auswählen kann.
- Der Herausgeber hat über
setTargetScalabilityMode()— Die Ebenenauswahl des Media Routers basiert auf dem Standardlayout, sodass die Einstellungen der Teilnehmer möglicherweise nicht der Ebene entsprechen, die der Teilnehmer erwartet. - Die Sitzung wird weitervermittelt - bei einer weitervermittelten Sitzung leitet der Medien-Router keine Streams weiter, so dass keine Layer-Auswahl stattfinden kann. Beachten Sie, dass bei weitergeleiteten (P2P-)Sitzungen der Encoder des Herausgebers seine Ausgabe direkt an die Netzwerkbedingungen des Teilnehmers anpasst, was jedoch nicht mit einer skalierbaren Auswahl der Videoebene gleichzusetzen ist.
Anmerkung: In weitergeleiteten Sitzungen akzeptieren einige SDKs diese API-Aufrufe möglicherweise weiterhin ohne Fehler, aber der Media Router ist nicht an der Stream-Weiterleitung beteiligt, so dass die Einstellungen für die Auswahl der Qualitätsschicht nicht berücksichtigt werden können.
Anmerkung: Publisher-seitige Auflösungs- und Framerate-APIs (sofern in bestimmten SDKs verfügbar) verhalten sich anders - sie steuern direkt die Auflösung und Framerate des kodierten Streams und nicht einen Qualitätshinweis des Media Routers.
Kann ich skalierbare und nicht skalierbare Publisher in der gleichen Sitzung mischen?
Ja. Skalierbares Video wird pro Stream bestimmt, nicht pro Sitzung. Eine Sitzung kann gleichzeitig Publisher haben, die skalierbares Video verwenden, und Publisher, die dies nicht tun (z. B. H.264-Publisher oder Clients, die mit deaktiviertem skalierbarem Video veröffentlichen). Der Medien-Router behandelt jeden Stream unabhängig.
Wirkt sich skalierbares Video auf die Archivierung aus?
Für VP8-SimultanübertragungDie Aufzeichnung erfolgt in der höchsten verfügbaren Qualitätsstufe.
Für VP9 SVCWenn Sie den Stream eines Teilnehmers als VP9 SVC-kodierte WebM-Datei speichern, werden die einzelnen Archive als solche gespeichert. Zusammengestellte Archive werden unabhängig vom Sitzungscodec immer in H.264/AAC MP4 transcodiert.
Die Wiedergabe von VP9 SVC WebM-Dateien funktioniert möglicherweise nicht in allen Media-Playern. Anweisungen zur Wiedergabe und Transkodierungsbefehle finden Sie unter Hinweise zur Archivierung im VP9-Leitfaden.
Weitere Informationen finden Sie unter diesen Support-Artikel.