Skalierbares Video
„Scalable Video“ ist eine Funktion für geroutete Sitzungen, die die Videoqualität in Sitzungen mit mehreren Teilnehmern verbessert, indem jeder Teilnehmer – unabhängig von den anderen Teilnehmern – eine Videoqualität erhält, die seinen aktuellen Netzwerkbedingungen entspricht.
Ohne „Scalable Video“ leitet der OpenTok Media Router die gleiche Videoqualität an alle Teilnehmer eines Streams weiter. Wenn sich die Verbindung eines Teilnehmers verschlechtert, weist der Router den Publisher anhand einer Bandbreitenschätzung an, die Bitrate zu reduzieren, wodurch sich die Qualität für alle Teilnehmer dieses Streams verringert. Bei aktiviertem skalierbarem Video wählt der Router für jeden Teilnehmer unabhängig in Echtzeit die am besten geeignete Qualitätsstufe aus, ohne dass dies Auswirkungen auf die Übertragung für andere Teilnehmer hat.
Skalierbares Video erfordert eine weitergeleitete Sitzung (eine Sitzung, die den OpenTok Media Router nutzt). Diese Funktion 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 im Übertragungsweg vorhanden ist, der Qualitätsstufen auswählen oder umschalten könnte. Siehe Der OpenTok Media Router und die Medienmodi.
Skalierbares Video ist standardmäßig aktiviert. Die Einstellung auf Projektebene ist standardmäßig auf Auto, was bedeutet, dass der OpenTok Media Router „Scalable Video“ automatisch aktiviert, wenn mehr als zwei Clients an einer Sitzung teilnehmen und alle anderen Bedingungen erfüllt sind. Sie können die Einstellung auch so festlegen, dass Auf (immer aktiv) oder Aus. Bei den 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 Anbieter kodiert und überträgt mehrere separate Bitströme mit unterschiedlichen Auflösungen und Bildraten, beispielsweise 1080p, 540p und 270p, wobei jeder über eigene zeitliche Ebenen (Bildraten) verfügt. Jeder Stream ist in sich geschlossen und kann eigenständig dekodiert werden.
Da jeder Stream unabhängig ist, kann der OpenTok Media Router jeden Teilnehmer ohne Neukodierung auf eine andere Qualitätsstufe umschalten. Dies sorgt für 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 Sender kodiert einen einzigen Bitstrom, in den mehrere räumliche (Auflösung) und zeitliche (Bildfrequenz) Ebenen eingebettet sind. Jede höhere Ebene hängt von den darunterliegenden Ebenen ab, sodass ein Decoder, der nur die Basisebene empfängt, eine geringere Qualität erhält, während ein Decoder, der alle Ebenen empfängt, die volle Qualität erhält – und das alles aus demselben Bitstrom.
Die CPU-Kosten auf der Publisher-Seite für die SVC-Kodierung sind höher als bei der Kodierung eines einzelnen Streams und in etwa mit einem VP8-Simulcast vergleichbar; SVC benötigt jedoch weniger Upstream-Bandbreite, da nur ein einziger Bitstream statt mehrerer unabhängiger Streams hochgeladen werden muss. Aus dem einzelnen kodierten Stream kann der OpenTok Media Router für jeden Teilnehmer die passende Teilmenge an Layern extrahieren und weiterleiten, was eine effiziente und flexible Qualitätsanpassung ermöglicht, die zudem widerstandsfähiger gegenüber Paketverlusten ist.
Für SVC müssen sowohl der Publisher-Endpunkt als auch der OpenTok Media Router VP9 SVC unterstützen. Firefox unterstützt VP9, aber nicht SVC. Ein Firefox-Publisher überträgt VP9 ohne Ebenen, sodass der OpenTok 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) | Ein Bitstream mit eingebetteten räumlichen und zeitlichen Ebenen (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 OpenTok Media Routers | 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 Der Stream verfügt über Ebenen mit 100 %, 50 % und 25 % der Quellauflösung (zum Beispiel 1080p, 540p und 270p). Aus diesem 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 OpenTok Media Router kann bei H.264-Streams nicht zwischen Qualitätsstufen wechseln, und Einstellungen für skalierbares Video haben keine Auswirkung, 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 für Android, WebView für iOS und der auf Chromium basierende Edge. Hinweis: Firefox unterstützt VP8-Simulcast, jedoch 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
Einstellungen auf Projektebene
„Scalable Video“ verfügt über drei Modi, die Sie für ein Projekt in Ihrem Video API-Konto:
- Gehen Sie zu Ihrem Video API-Konto und wählen Sie das Projekt in der Liste der Projekte im linken Menü aus.
- Unter Projekt-Einstellungenfinden Skalierbares Video und wählen Sie die Einstellung für das Projekt aus:
- Auto (empfohlen) – Der OpenTok Media Router ermöglicht skalierbare Videoübertragung, wenn mehr als zwei Clients an einer Sitzung teilnehmen. Lassen Sie diese Option ausgewählt, es sei denn, Sie haben einen bestimmten Grund, sie zu überschreiben.
- Auf - Skalierbares Video ist (in unterstützten Clients) für alle Sitzungen in diesem Projekt stets aktiviert.
- Aus - Die Video-Skalierung ist für alle Sitzungen in diesem Projekt deaktiviert. Verwenden Sie diese Option, um die Auflösung und Bildrate festzulegen oder die CPU- und Bandbreitenauslastung des Herausgebers zu reduzieren.
- Klicken Sie auf Speichern Sie.
Anmerkung: Diese Einstellung steuert VP8-Simultanübertragung Verhalten. VP9 nutzt immer SVC, sofern dies unterstützt wird, und H.264 unterstützt kein skalierbares Video. Beide Formate sind von dieser Einstellung nicht betroffen.
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 Videoquellen-Streams. Inhalte aus der Bildschirmfreigabe ändern sich in der Regel seltener als Kameravideos, sodass der zusätzliche Kodierungsaufwand für skalierbares Video meist nicht erforderlich ist. Die Aktivierung dieser Funktion kann jedoch in Sitzungen von Vorteil sein, in denen die Teilnehmer der Bildschirmfreigabe unterschiedliche Netzwerkbedingungen haben. Sie können die Standardeinstellung pro Publisher überschreiben:
| 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 geteilten Inhalte scharf und gut lesbar, während der OpenTok Media Router gleichzeitig über eine Ebene mit niedrigerer Bitrate verfügt, auf die er zurückgreifen kann, wenn sich die Netzwerkqualität eines Teilnehmers 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 Netzwerkqualität 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 OpenTok 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 zu Videoinhalten festlegen.
Einstellung der bevorzugten Bildrate und Auflösung des Teilnehmers
Wenn ein Stream mit skalierbarem Video veröffentlicht wird, können Abonnenten dem OpenTok Media Router ihre bevorzugte Qualität mitteilen. Der OpenTok Media Router wählt dann die nächstgelegene verfügbare Ebene aus, die den tatsächlichen Netzwerkbedingungen des Abonnenten entspricht.
Das ist wichtig: Aufruf von setPreferredResolution() oder setPreferredFrameRate() löst eine Neuverhandlung mit dem OpenTok Media Router aus. Dies wiederholt oder in schneller Folge zu tun, ist ressourcenintensiv. Es beansprucht die CPU und kann die Gesamtqualität des Streams beeinträchtigen. Legen Sie die bevorzugten Werte einmalig fest oder nur dann, wenn sich das Layout des Teilnehmers erheblich ä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_framerate() - 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 Das Tool im Modul „Qualitätskennzahlen“ zeigt den Codec, die Auflösung und die Bildrate an. Bewegen Sie den Mauszeiger über einen beliebigen Punkt auf einer dargestellten Linie, um den aktuell verwendeten Codec anzuzeigen. Wenn skalierbares Video aktiviert ist, können sich die Auflösung und/oder die Bildrate für einen oder mehrere Teilnehmer dynamisch an veränderte Netzwerkbedingungen anpassen.
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 unterschiedlichenframeWidthundframeHeightWerte, jeweils einer pro Simulcast-Ebene. - Mit VP9 SVCsehen Sie eine einzelne
ssrcmit einerscalabilityModeEigenschaftssatz, zum BeispielL3T3.
Anmerkung: Für einen VP8 Bildschirmfreigabe Stream veröffentlicht mit dem detail oder text Inhaltshinweis: Die beiden ssrc Einträge haben die dasselbe frameWidth und 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 weitergeleitet.
- Skalierbares Video ist nicht eingestellt auf Aus auf Projektebene.
- 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
Android
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).
Web (JavaScript)
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).
Linux
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).
iOS (Objective-C)
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).
iOS (Swift)
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).
Windows
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).
Häufige Missverständnisse und FAQs
Ist skalierbares Video das Gleiche wie VP9 SVC?
Nein. „Scalable Video“ ist die Bezeichnung für die Funktion der Vonage Video API. Der technische Mechanismus hängt vom jeweiligen Codec ab:
- VP8 implementiert skalierbares Video durch Simultanübertragung. Der Publisher sendet mehrere unabhängige Streams.
- VP9 implementiert skalierbares Video durch SVC. Der Publisher sendet einen Stream mit eingebetteten Ebenen.
Beide Mechanismen ermöglichen es dem OpenTok Media Router, die Qualität anzupassen, die jeder Teilnehmer erhält. Wenn in der Dokumentation von „skalierbarem Video“ die Rede ist, ohne dass ein Codec genannt wird, 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 erfolgt unabhängig von „Scalable Video“. Ob „Scalable Video“ aktiviert wird, hängt von allen folgenden Faktoren ab:
- Die Einstellung für das skalierbare Videoprojekt (Ein, Aus oder Auto).
- Die weitergeleitete Sitzung.
- Der vereinbarte Codec, der skalierbares Video unterstützt (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() Es handelt sich um Hinweise an den OpenTok Media Router, nicht um direkte Befehle an den Encoder des Publishers. Der OpenTok Media Router kann diese Hinweise nur dann berücksichtigen, wenn er aktiv zwischen skalierbaren Video-Layern für diesen Teilnehmer auswählt. Trifft eine der folgenden Bedingungen zu, stehen keine Layer zur Auswahl, und die Hinweise haben keine Wirkung:
- Die skalierbare Videoanzeige ist auf Projektebene oder im Publisher-Stream deaktiviert.
- Der ausgehandelte Codec ist H.264, der kein skalierbares Video unterstützt.
- Der Client des Publishers erzeugt keine skalierbaren Ebenen. Beispielsweise sendet ein Firefox-Publisher VP9 ohne SVC-Ebenen.
- 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 weitergeleitet. Bei einer weitergeleiteten Sitzung leitet der OpenTok Media Router keine Streams weiter, sodass keine Auswahl der Videoebene erfolgen kann. Beachten Sie, dass bei weitergeleiteten (P2P-)Sitzungen der Encoder des Publishers seine Ausgabe direkt an die Netzwerkbedingungen des Subscribers anpasst; dies ist jedoch nicht mit der skalierbaren Auswahl der Videoebene gleichzusetzen.
Anmerkung: Bei weitergeleiteten Sitzungen akzeptieren einige SDKs diese API-Aufrufe möglicherweise weiterhin ohne Fehler, doch da der OpenTok Media Router nicht an der Weiterleitung des Streams beteiligt ist, können die Einstellungen für die Auswahl der Qualitätsstufe nicht berücksichtigt werden.
Anmerkung: Die APIs für Auflösung und Bildrate auf der Publisher-Seite, sofern sie in bestimmten SDKs verfügbar sind, verhalten sich unterschiedlich. Sie steuern direkt die Auflösung und Bildrate des kodierten Streams und nicht einen Qualitätshinweis des OpenTok Media Routers.
Kann ich skalierbare und nicht skalierbare Publisher in der gleichen Sitzung mischen?
Ja. Scalable Video wird pro Stream und nicht pro Sitzung festgelegt. In einer Sitzung können gleichzeitig Publisher mit Scalable Video und solche ohne Scalable Video vorhanden sein, beispielsweise H.264-Publisher oder Clients, bei denen Scalable Video deaktiviert ist. Der OpenTok Media Router verarbeitet 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 mit VP9-Videos im VP9-Leitfaden.
Weitere Informationen finden Sie unter diesen Support-Artikel.