Video-Anschluss
Mit dem Vonage Video Connector können Sie programmgesteuert als serverseitiger Teilnehmer an Vonage Video API-Sitzungen teilnehmen. Er ermöglicht es Ihnen, eine Verbindung zu Videositzungen herzustellen, Streams zu veröffentlichen und zu abonnieren sowie Audio- und Videodaten in Echtzeit zu verarbeiten.
Die Bibliothek übernimmt automatisch die WebRTC-Konnektivität, die Medienverarbeitung und die Sitzungsverwaltung, so dass Sie sich auf die Entwicklung Ihrer Anwendungslogik konzentrieren können. auf die Entwicklung Ihrer Anwendungslogik konzentrieren können. Audio wird als lineare PCM 16-Bit-Daten und Video als 8-Bit-Frames in den Formaten YUV420P, RGB24 oder ARGB32 geliefert, und zwar mit konfigurierbaren Abtastraten, Auflösungen und Kanalkonfigurationen.
Wichtig Der Vonage Video Connector ist für serverseitige Anwendungen konzipiert und erfordert gültige Anmeldedaten sowie Tokens für die Vonage Video API mit den entsprechenden Berechtigungen.
Auf dieser Seite werden die Concepts und das Verhalten beschrieben, die allen Video Connector-Bibliotheken gemeinsam sind. Informationen zur Installation, zu API-Signaturen und zu Code-Beispielen finden Sie im Leitfaden für Ihre Sprache.
Wählen Sie Ihre Bibliothek aus
| Sprache | Leitfaden | Paket |
|---|---|---|
| Python | Video-Connector für Python | vonage-video-connector |
| Node.js | Demnächst | @vonage/video-connector |
Beide Bibliotheken bieten dieselben Funktionen und basieren auf derselben nativen Implementierung. Sie unterscheiden sich in den Namenskonventionen und darin, wie asynchrone Operationen bereitgestellt werden: Die Python-Bibliothek verwendet Callbacks zur Abschlussbenachrichtigung, während die Node.js-Bibliothek Promises zurückgibt. Auf dieser Seite wird das gemeinsame Verhalten der beiden Bibliotheken beschrieben.
Dieses Thema umfasst die folgenden Abschnitte:
- Wie es funktioniert
- Anforderungen
- Kernkonzepte
- Medienformate
- Sitzungskonfiguration
- Verlagsmedien
- Abonnieren von Streams
- Verwaltung der Medienpuffer
- Ereignismodell
- Grenzen
Wie es funktioniert
Der Video-Connector nimmt als regulärer WebRTC-Teilnehmer an einer Sitzung teil. Aus der Sicht der anderen Teilnehmer ist er nicht von einem Browser oder einem mobilen Client zu unterscheiden: Er verfügt über eine eigene Verbindung, kann einen Stream veröffentlichen und die Streams anderer abonnieren.
Der Unterschied besteht darin, dass Medien nicht über eine Kamera, ein Mikrofon oder einen Bildschirm, sondern mit Ihrem Anwendungscode ausgetauscht werden. Sie übermitteln Rohdaten von Audio- und Video-Frames an den Connector, um diese zu veröffentlichen, und empfangen Rohdaten von Audio und Video aus den Streams, die Sie abonniert haben. Dadurch eignet sich der Connector für serverseitige Workloads wie beispielsweise:
- KI-Agenten für Sprache und Video in Echtzeit
- Live-Transkription, -Übersetzung und -Untertitelung
- Erfassung, Archivierung und Compliance-Erfassung
- Computervision und Inhaltsmoderation
- Bearbeitung von Audio- und Videoeffekten
Der typische Lebenszyklus sieht wie folgt aus:
- Stellen Sie mithilfe Ihrer Anwendungs-ID, Ihrer Sitzungs-ID und eines Tokens eine Verbindung zu einer Sitzung her.
- Veröffentlichen Sie einen Stream und speisen Sie dann Audio- und/oder Video-Frames in diesen ein.
- Abonnieren Sie die Streams anderer Teilnehmer, sobald diese eintreffen, und verarbeiten Sie die empfangenen Medien.
- Abmelden, Veröffentlichung rückgängig machen und Verbindung trennen, wenn Sie fertig sind.
Anforderungen
Der Video Connector wird als native Bibliothek mit vorgefertigten Binärdateien ausgeliefert. Er läuft auf Linux auf x86_64 (AMD64) und ARM64 nur.
| Sprache | Laufzeit |
|---|---|
| Python | Python 3.13 |
| Node.js | Node.js 18 oder höher |
Wir empfehlen Debian Bookworm, da dies die Distribution ist, in der der Connector am gründlichsten getestet wurde.
Kernkonzepte
Der Video Connector verwendet eine kleine Anzahl von Objekten, um Sitzungen, Teilnehmer, Streams und Medien darzustellen. Das Verständnis dieser Objekte ist unerlässlich, um mit beiden Bibliotheken effektiv arbeiten zu können.
Sitzung
Eine Vonage Video API-Sitzung, mit der sich Clients verbinden. Die Sitzung wird anhand ihrer ID identifiziert und an Ereignis-Handler auf Sitzungsebene weitergeleitet, sodass Sie feststellen können, welche Sitzung ein Ereignis ausgelöst hat.
Verbindung
Die Verbindung eines Teilnehmers zu einer Sitzung. Jeder Teilnehmer, einschließlich des Connectors selbst, verfügt über genau eine Verbindung. Eine Verbindung umfasst:
- Eine eindeutige Kennung
- Ein Zeitstempel der Erstellung
- Verbindungsdaten, die in dem für die Verbindung verwendeten Token verschlüsselt sind
Verbindungsdaten eignen sich zum Speichern benutzerdefinierter Metadaten zu Teilnehmern, wie beispielsweise Benutzer-IDs oder Rollen.
Stream
Ein von einem Teilnehmer veröffentlichter Medienstrom (Audio, Video oder beides). Ein Strom verfügt über eine eindeutige Kennung und einen Verweis auf die Verbindung, über die er veröffentlicht wurde. Ströme werden Ihnen gemeldet, sobald Teilnehmer mit der Veröffentlichung beginnen, und Sie abonnieren diese, um Medien zu empfangen.
Herausgeber
Ihr eigener veröffentlichter Stream in der Sitzung. Pro Connector-Instanz gibt es höchstens einen Publisher. Der Publisher verfügt über einen Verweis auf den von ihm erstellten Stream – so werden Sie von anderen Teilnehmern wahrgenommen.
Abonnent
Ein Abonnement für den Stream eines anderen Teilnehmers. Sie erstellen einen Abonnenten pro Stream, von dem Sie Medien empfangen möchten, und jeder Abonnent enthält einen Verweis auf den Stream, den er abonniert hat. Medien- und Untertitel-Ereignisse werden zusammen mit dem Abonnenten übermittelt, der sie erzeugt hat, sodass Sie erkennen können, von welchem Teilnehmer die Daten stammen.
In welcher Beziehung stehen sie zueinander?
Session
├── Connection (multiple participants)
│ └── Stream (participant's published media)
│ ├── Publisher (your published stream)
│ └── Subscriber (your subscription to their stream)
├── Audio data (flowing through streams)
└── Video frames (flowing through streams)
Medienformate
Audio
Audio wird immer ausgetauscht als Lineares PCM, 16-Bit-Ganzzahlen mit Vorzeichen. Ein Audio-Frame umfasst ein Sample pro Kanal, daher muss ein Puffer mindestens (Anzahl der Frames × Anzahl der Kanäle) Samples enthalten.
- Musterpreise8000, 12000, 16000, 24000, 32000, 44100, oder 48000 Hz
- Kanäle: 1 (Mono) oder 2 (Stereo)
- Rahmengröße: in der Regel 20-ms-Blöcke, je nach Abtastrate unterschiedlich
Die Abtastrate und die Kanalanzahl lassen sich für das von Ihnen veröffentlichte Audiosignal und das gemischte Audiosignal, das Sie empfangen, unabhängig voneinander konfigurieren. Siehe Sitzungskonfiguration.
Video
Videos werden ausgetauscht als 8-Bit-Werte ohne Vorzeichen in einem von drei Pixelformaten:
| Format | Beschreibung | Puffergröße |
|---|---|---|
YUV420P |
Planares YUV mit 4:2:0-Chroma-Subsampling | width × height × 3 / 2 |
RGB24 |
Gepacktes RGB, 8 Bit pro Kanal | width × height × 3 |
ARGB32 |
Gepacktes ARGB, 8 Bit pro Kanal einschließlich Alpha-Kanal | width × height × 4 |
- Entschließungen: bis zu 1920 × 1080 (insgesamt 2.073.600 Pixel)
- Bildfrequenzen: 1 bis 30 FPS
Sitzungskonfiguration
Audio zum Veröffentlichen im Vergleich zum Abonnieren
Über den Anschluss können Sie zwei unabhängige Audioformate konfigurieren:
- Audio des Verlags legt das Format der Audiodaten fest, die Sie bei der Veröffentlichung bereitstellen. Die von Ihnen übermittelten Audiodaten müssen dieser Abtastrate und der Kanalanzahl entsprechen.
- Abonnentenstruktur (Audio) legt das Format des gemischten Audios fest, das Sie von allen abonnierten Streams erhalten. Die Bibliothek übernimmt das Mischen mehrerer Teilnehmer sowie das Resampling oder die Kanalumwandlung, um das gewünschte Format zu erreichen.
Durch diese Trennung können Sie die Lösung optimal an Ihren Anwendungsfall anpassen. Zum Beispiel:
- Veröffentlichen Sie in Stereo, um eine hochwertige Ausgabe zu erzielen, und erhalten Sie gleichzeitig einen Mono-Mix, um die Bearbeitung zu vereinfachen
- Für Sprache mit 16 kHz senden und für die High-Fidelity-Wiedergabe mit 48 kHz empfangen
- Verwenden Sie auf jeder Seite unterschiedliche Raten, um den Anforderungen einer Audioverarbeitungs-Pipeline gerecht zu werden
Bevorzugte Auflösung und Bildfrequenz für Abonnenten
Beim Abonnieren von gerouteten Streams, die Simulcast nutzen, kann die SFU (Selective Forwarding Unit) der Vonage Video API verschiedene Qualitätsstufen des Videos senden. Über die Abonnenteneinstellungen können Sie eine bestimmte Qualitätsstufe anfordern:
- Bevorzugte Auflösung fordert eine räumliche Ebene an. Die SFU sendet die Ebene, die am besten passt.
- Bevorzugte Bildrate fordert eine zeitliche Ebene an. Die SFU sendet die Ebene, die am besten passt.
Diese Einstellungen tragen dazu bei, die Bandbreite und die Rechenleistung auf der Seite des Teilnehmers zu optimieren, indem nur die Qualitätsstufe angefordert wird, die Sie benötigen, anstatt stets die höchstmögliche Qualität zu erhalten.
Migration von Sitzungen
Die Sitzungsmigration kann aktiviert werden, damit der Konnektor im Falle einer SFU-Rotation automatisch migriert. Standardmäßig ist diese Funktion deaktiviert.
Protokollierung
Die Ausführlichkeit der Konsolenprotokollierung lässt sich in fünf Stufen konfigurieren: ERROR, WARN, INFO, DEBUGund TRACE.
Verlagsmedien
Ein Publisher muss Audio, Video oder beides veröffentlichen. Die Konfiguration eines Publishers ohne beides führt zu einem Fehler.
Warten auf Audiobereitschaft
Wichtig Wenn Sie Audiodaten veröffentlichen, müssen Sie das Ereignis „audio-ready“ abwarten, bevor Sie Audiodaten übermitteln. Dieses Ereignis zeigt an, dass das Audiosystem initialisiert wurde und bereit ist, Daten entgegenzunehmen. Vorher übermittelte Audiodaten werden verworfen. Diese Anforderung gilt nicht für die Veröffentlichung von reinen Videodaten.
Audio-Kontinuität
Wenn Sie Audioinhalte veröffentlichen, sorgt die Bibliothek in Ihrem Namen für einen kontinuierlichen Stream:
Erstveröffentlichung. Die Bibliothek sendet Stille (mit Nullen gefüllte Frames), bis Sie Ihre ersten Audiodaten bereitstellen. Dadurch steht der Stream den Abonnenten sofort zur Verfügung, ohne dass sie warten müssen, bis Ihre Applications Audiodaten erzeugen.
Toleranz gegenüber Stille. Wenn Sie die Audioübertragung vorübergehend unterbrechen, gleicht die Bibliothek kurze Lücken aus, indem sie überhaupt keine Audiopakete sendet. Diese Hysterese verhindert unnötige Stillepakete bei kurzzeitigen Verarbeitungsverzögerungen.
Ausdrückliches Schweigen. Wenn nach Ablauf der Toleranzphase kein neues Audiomaterial verfügbar ist, wechselt die Bibliothek dazu, explizite Stille-Frames zu senden. Dadurch wird der Stream aufrechterhalten, während gleichzeitig angezeigt wird, dass kein aktives Audiomaterial bereitgestellt wird.
Puffer leeren. Wenn Sie weniger als die Audio-Daten einer vollständigen Periode bereitstellen, löscht die Bibliothek die verbleibenden Daten und füllt die Lücke mit Stille auf, um das korrekte Timing beizubehalten und eine Audio-Drift zu verhindern.
Videokontinuität
Wenn Sie ein Video veröffentlichen, sorgt die Bibliothek für Sie für die Kontinuität der Einzelbilder:
Erstveröffentlichung. Die Bibliothek sendet schwarze Bilder, bis Sie Ihr erstes Bild bereitstellen, sodass der Stream den Abonnenten sofort zur Verfügung steht.
Wiederholung des letzten Bildes. Wenn Sie keine Frames mehr bereitstellen, wiederholt die Bibliothek das zuletzt von Ihnen bereitgestellte Frame bis zu 2 Sekunden lang, um den Abonnenten eine flüssige Wiedergabe zu gewährleisten.
Ausweichlösung mit schwarzem Rahmen. Nach 2 Sekunden Wiederholung wechselt die Bibliothek zu schwarzen Bildern. Dies signalisiert den Abonnenten, dass das Video nicht mehr aktiv bereitgestellt wird, während der Stream aufrechterhalten bleibt.
Bewährte Praktiken
- Senden Sie Medien in regelmäßigen Abständen, die Ihrer konfigurierten Abtastrate und Bildrate entsprechen
- Überwachen Sie die Pufferstatistiken, um sicherzustellen, dass Sie genügend Daten bereitstellen.
- Behandeln Sie das Ereignis „Puffer leer“, um zu erkennen, wann Ihre Medienpuffer leer sind
- Passen Sie Ihre Strategie zur Medienerstellung an schwankende Verarbeitungsauslastungen an
Abonnieren von Streams
Sobald ein Teilnehmer mit der Veröffentlichung beginnt, wird ein „Stream-Received“-Ereignis ausgelöst, und Sie entscheiden, ob Sie das Abonnement abonnieren möchten. Medien aus Ihren Abonnements werden über drei separate Kanäle bereitgestellt.
Video wird pro Stream übertragen. Jeder Frame wird mit einer Kennung des Abonnenten gesendet, die dessen Quelle identifiziert, sodass Sie das Video jedes Teilnehmers unabhängig verarbeiten können – für die Layout-Verwaltung, die Aufzeichnung pro Stream oder die Anwendung von Effekten pro Stream.
Gemischter Ton wird auf Sitzungsebene als einzelner Stream übertragen. Die Bibliothek mischt die Audiodaten aus allen abonnierten Streams automatisch zu einem Stream in dem Format zusammen, das Sie für den Abonnenten-Mix konfiguriert haben. Einzelne Teilnehmer lassen sich in diesem gemischten Audiostream nicht unterscheiden.
Individueller Ton wird pro Stream auf Abonnentenebene bereitgestellt. Diese Funktion ist derzeit als Beta-Funktion verfügbar. Der Ton wird in dem Format übertragen, in dem er vom Stream empfangen wird – Linear PCM 16 Bit – und weder die Abtastrate noch die Kanalanzahl können vor dem Empfang konfiguriert werden.
Untertitel werden pro Stream ausgeliefert. Diese Funktion ist derzeit als Beta-Funktion verfügbar. Jedes Untertitel-Ereignis umfasst die Angabe des Abonnenten, der den Quell-Stream identifiziert, den Untertiteltext sowie die Angabe, ob es sich um ein endgültiges oder vorläufiges Ergebnis handelt:
- Vorläufig Die Ergebnisse sind vorläufig und werden möglicherweise aktualisiert, sobald weitere Sprachdaten verarbeitet wurden. Nützlich für die Live-Anzeige.
- Finale Die Ergebnisse sind vollständig und werden sich nicht mehr ändern. Verwenden Sie diese zur Speicherung oder zur weiteren Verarbeitung.
Hinweis Um Untertiteldaten zu empfangen, müssen Live-Untertitel in der zugrunde liegenden Konfiguration der Vonage Video API-Sitzung aktiviert sein (außerhalb dieser Bibliothek; siehe die Vonage Video API Live-Unterschriften Dokumentation) und für den jeweiligen Publisher-Stream, der Audio sendet.
Verwaltung der Medienpuffer
Der Connector verwaltet interne Puffer für die von Ihnen veröffentlichten Audio- und Videodaten. Sie können die Menge der in der Warteschlange befindlichen Medien jederzeit einsehen und beide Puffer leeren, wenn Sie ausstehende Medien verwerfen müssen – beispielsweise, wenn Sie einen Bot mitten in einer Äußerung unterbrechen.
Puffer-Drain-Ereignisse
Ein „Buffer-Drained“-Ereignis wird ausgelöst, wenn ein interner Audio- oder Videopuffer leer ist. Dies geschieht, wenn Medien schneller an die Sitzung übertragen werden, als Ihre Anwendung sie bereitstellen kann. Betrachten Sie das Ereignis als Signal, Ihre Medienproduktionsrate zu erhöhen oder Ihre Veröffentlichungsstrategie anzupassen.
Das Ereignis nutzt eine Hysterese, um eine übermäßige Auslösung zu vermeiden: Nach einer ersten Entleerung wird es erst dann erneut ausgelöst, wenn der Puffer mit neuen Medien aufgefüllt wurde und anschließend wieder leer ist. Dadurch wird eine Flut von wiederholten Benachrichtigungen verhindert, solange der Puffer leer bleibt.
Ereignismodell
Beide Bibliotheken stellen denselben Satz von Ereignissen bereit, gruppiert nach dem Objekt, zu dem sie gehören.
| Umfang | Veranstaltung | Zündet, wenn |
|---|---|---|
| Sitzung | Fehler | Es tritt ein Fehler auf Sitzungsebene auf |
| Sitzung | Verbunden | Die Verbindung zur Sitzung wurde hergestellt |
| Sitzung | Getrennt | Die Verbindung zur Sitzung wird beendet |
| Sitzung | Verbindung erstellt | Ein weiterer Teilnehmer kommt hinzu |
| Sitzung | Verbindung unterbrochen | Ein weiterer Teilnehmer verlässt die Veranstaltung |
| Sitzung | Stream empfangen | Ein Teilnehmer beginnt mit der Veröffentlichung |
| Sitzung | Stream unterbrochen | Der Stream eines Teilnehmers wird entfernt |
| Sitzung | Audio-Daten | Es steht ein gemischter Audio-Stream aus allen abonnierten Streams zur Verfügung |
| Sitzung | Bereit für Audio | Das Audiosystem ist bereit, veröffentlichte Audiodateien zu empfangen |
| Sitzung | Medienpuffer leer | Ein Veröffentlichungspuffer ist leer |
| Herausgeber | Fehler | Es tritt ein Fehler auf Publisher-Ebene auf |
| Herausgeber | Stream erstellt | Ihr veröffentlichter Stream wurde erstellt |
| Herausgeber | Stream zerstört | Dein veröffentlichter Stream wird gelöscht |
| Abonnent | Fehler | Es tritt ein Fehler auf Abonnentenebene auf |
| Abonnent | Verbunden | Das Abonnement wurde eingerichtet |
| Abonnent | Getrennt | Das Abonnement läuft aus |
| Abonnent | Render-Frame | Ein Videobild ist aus dem Stream verfügbar |
| Abonnent | Audio-Daten | Einzelne Audiospuren sind über den Stream verfügbar (Beta) |
| Abonnent | Bildunterschrift | Der Untertiteltext wird aus dem Stream empfangen (Beta) |
Wie diese Ereignisse bereitgestellt werden, ist je nach Sprache unterschiedlich. In Python ist jedes Ereignis ein Callback, den Sie registrieren. In Node.js werden die einmalig auftretenden Lebenszyklusereignisse – „Session connected“, „Publisher stream created“ und „Subscriber connected“ – von dem Promise verarbeitet, das von der entsprechenden Methode zurückgegeben wird, während die übrigen Ereignisse Callbacks sind. Weitere Informationen finden Sie im Sprachhandbuch.
Grenzen
| Eigentum | Grenzwert |
|---|---|
| Plattformen | Linux x86_64 und ARM64 |
| Audio-Abtastraten | 8000, 12000, 16000, 24000, 32000, 44100, 48000 Hz |
| Audiokanäle | 1 oder 2 |
| Format der Hörprobe | Lineares PCM, 16 Bit mit Vorzeichen |
| Videoformate | YUV420P, RGB24, ARGB32 |
| Format des Videobeispiels | 8-Bit, vorzeichenlos |
| Maximale Videoauflösung | 1920 × 1080 (2.073.600 Pixel) |
| Videobildfrequenz | 1 bis 30 FPS |
| Verlage pro Instanz | 1 |
| Anzahl der Connector-Instanzen pro Prozess | 1 |