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 mit dem folgenden Format gespeichert:

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 stummen

  • muteVideo 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 Moderatoren

  • Wenn 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.