Konferenzprotokoll
Dieses Dokument soll die Entwicklungen beschreiben, die wir bei der Verwaltung von Konferenzen (audio/video) vornehmen werden. Das Ziel ist es, die aktuelle Implementierung zu verbessern, die SIP-Anrufe einfach zusammensetzt und eine Gitteransicht bietet, um eine Ansicht zu erhalten, in der die Teilnehmer aufgeführt sind, unabhängig gedämpft werden können oder das Video-Layout geändert wird (um nur einen Teilnehmer zu zeigen).
Definitionen
Host: Ist der Benutzer, der die Audio-/Video-Streams für die anderen mischt
Teilnehmer: Jeder Nutzer der Konferenz, auch der Gastgeber
Entlastung
Dieses Dokument beschreibt bisher nur die ersten Schritte, die die Identifizierung der Teilnehmer und die Position im Videomischler an alle Teilnehmer bedeuten.
Möglichere Layouts
GRID: Jedes Mitglied ist mit der gleichen Höhe/Breite angezeigt
ONE_BIG_WITH_SMALL: Ein Mitglied wird vergrößert und die andere Vorschau angezeigt
ONE_BIG: Ein Mitglied nimmt den vollen Bildschirm dar
Zwei neue Methoden zur Verwaltung der Konferenz-Layout in CallManager stehen zur Verfügung:
/**
* Change the conference layout
* @param confId
* @param layout 0 = matrix, 1 = one big, others in small, 2 = one in big
*/
void setConferenceLayout(const std::string& confId, int layout);
/**
* Change the active participant (used in layout != matrix)
* @param confId
* @param participantId If participantId not found, the local video will be shown
*/
void setActiveParticipant(const std::string& confId, const std::string& participantId);
Durchführung
Die Umsetzung ist ziemlich einfach. Alles wird von conference.cpp
(Um den Teilnehmer mit Quellen zu verknüpfen) und video_mixer.cpp
(Um das gewünschte Layout zu renderen) verwaltet.
Synchronisierung von Konferenzinformationen
Hinweis: Im Grunde wird das Wort Teilnehmer für eine in einer Konferenz gemischte CallId verwendet. Dies kann zunächst zu einigen Problemen für die API führen und muss in Zukunft behoben werden
Ziel ist es, alle Teilnehmer über die Metadaten des dargestellten Videos zu informieren. Dies bedeutet, wer sich bei der Konferenz befindet und wo sich das Video befindet.
Wenn ein Teilnehmer selbst eine Konferenz ist, sollten seine eingehenden Layout-Informationen verschmolzen werden, wenn sie an andere Teilnehmer gesendet werden.
Layout-Informationen
Das Layout wird als VectorMapStringString für Clients und intern mit einem Vektor
Layout = {
{
"uri": "participant", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "true"
},
{
"uri": "participant1", "x":"0", "y":"0", "w": "0", "h": "0", "isModerator": "false"
}
(...)
}
Die möglichen Schlüssel sind:
Uri = Uri des Kontos
Gerät = Gerät ID
Medien = Medien-Id
aktiv = wenn der Teilnehmer aktiv ist
x = Position (x) im Video
Y = Position (y) im Video
w = Größe (Breite) im Video
h = Größe (Höhe) im Video
Video-Sauf = wenn das Video still ist
audioLocalMuted = wenn das Audio lokal still ist
audioModerator Muted = wenn das Audio von Moderatoren gedämpft wird
istModerator = wenn es sich um einen Moderator handelt
Handgehoben = wenn die Hand angehoben wird
voiceActivity = wenn der Stream eine Stimmeaktivität hat
Aufzeichnung = wenn der Peer die Konferenz aufnimmt
Neue API
Eine neue Methode (in CallManager) und ein neues Signal zur Erfassung aktueller Konferenzinformationen und -updates stehen zur Verfügung:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Durchführung
Das Conference
Object (das nur existiert, wenn wir Anrufe mischen, das bedeutet, dass wir der Master sind) verwaltet die Informationen für die gesamte Konferenz, basierend auf den LayoutInfos jedes Call
Objektes.
Jedes Call
Objekt verfügt nun über eine LayoutInfo und wenn aktualisiert, bitten Sie das Conference
Objekt, seine Informationen zu aktualisieren.
Der Konferenzleiter sendet seine Informationen über den SIP-Kanal als Nachricht mit dem folgenden MIME-Typ: application/confInfo+json
Wenn also ein Anruf einige Informationen erhält, wissen wir, dass dieser Anruf Mitglied einer Konferenz ist.
Zusammenfassend verwaltet Call
eingehende Layouts, Conference
-managed gesendete Layouts.
Änderung des Zustands der Konferenz
Um den Zustand der Konferenz zu ändern, müssen die Teilnehmer Bestellungen senden, die der Gastgeber abwickeln wird.
Das Protokoll hat folgende Anforderungen:
Es sollte Auftragsvergabe auf mehreren Ebenen erledigen.
Das Konto, das die Identität des Teilnehmers darstellt
Geräte, da jedes Konto über mehrere Geräte verbunden werden kann
Medien, da es mehrere Videos per Gerät geben kann (z. B. 1 Kamera und 1 Bildschirm-Sharing)
Um Bandbreite zu sparen, sollten Kunden mehrere Bestellungen gleichzeitig senden können.
Allgemeine Maßnahmen
Um ein Layout zu ändern, kann der Moderator eine Nutzlast mit „Application/confOrder+json“ als Typ senden: wo 0 ein Raster ist, 1 ein Benutzer in groß, andere in klein, 2 ist ein in groß
Aktionen des Kontos
Für den Moment gibt es jedoch keine unterstützten Maßnahmen für den zukünftigen Moderator: true/false sollte behandelt werden, um einen Moderator zu ändern.
Die Handlungen des Geräts
hangup: true
zu einem Gerät aus der Konferenz aufhängen (nur Moderatoren)raisehand: true/false
um den Status der Hebenhand zu ändern. Nur durch das Gerät selbst möglich, sonst fallen.
Die Aktionen der Medien
muteAudio
nur von Moderatoren möglich, um das Audio eines Teilnehmers zu stummenmuteVideo
noch nicht unterstützt.active
, um die Medien als aktiv zu markieren.voiceActivity
zum Hinweis auf den Status der Sprachaktivität eines Medienstroms (nur für Audio relevant)
Beispiel
Die Anmeldung/Konferenzbestimmung+json
enthält also:
{
"989587609427420" : {
"moderator": true/false,
"devices": {
"40940943604396R64363": {
"hangup": true,
"raisehand": true/false,
"media":{
"3532532662432" : {
"muteAudio": true/false,
"muteVideo": true/false,
"active": true/false,
"voiceActivity": true/false
}
}
}
}
},
"layout": 0/1/2,
}
Hinweis: die Art des Mediums sollte in Konferenzinformationen enthalten sein und kann für den Kunden zur Verbesserung der Anzeige verwendet werden (z. B. nicht die Bildschirmverteilung zu schneiden)
Moderatoren kontrollieren
Es gibt eigentlich 3 Möglichkeiten:
Konfiguration des Wechselkontos zur Hinzufügung einer Liste von Moderatoren (In der config.yml (
defaultModerators
kann eine Liste von Standardmoderatoren enthalten)Wenn
localModeratorsEnabled
stimmt, sind alle Konten des Geräts ModeratorenWenn
allModeratorsEnabled
stimmt, wird jeder in der Konferenz ein Moderator sein
Die Zukunft
Separate streams to allow more controls?
Anmerkungen/Kommentare
Es ist wahrscheinlich, dass sich das Protokoll für zukünftige Bedürfnisse entwickeln wird. Ich glaube, es ist am besten, wenn wir ein „Version“ Feld haben. Die ältere Version wird erkannt werden, wenn dieses Feld fehlt.