Conferentieprotocol

Dit document heeft tot doel de ontwikkelingen te beschrijven die we zullen maken voor het beheer van conferenties (audio/video). Het doel is om de huidige implementatie te verbeteren die eenvoudigweg SIP-oproepen combineert en een gridweergave biedt, zodat de deelnemers zelfstandig kunnen worden gemutst of de video-afdeling kan worden gewijzigd (om slechts één deelnemer te laten zien)

Definities

  • Gastgever: Is de gebruiker die de audio/video streams voor de anderen mengt

  • Deelnemer: Elke gebruiker van de conferentie, zelfs de gastheer

Verwijzing van aansprakelijkheid

Dit document beschrijft voorlopig slechts de eerste stappen, wat de identificatie van de deelnemers en de positie in de video-mixer betekent die aan alle deelnemers wordt verzonden.

Mogelijke uitleg

  • GRID: elk lid wordt getoond met dezelfde hoogte/breedte

  • ONE_BIG_WITH_SMALL: Eén lid wordt gezoomd en de andere voorbeeld wordt weergegeven

  • ONE_BIG: Eén lid neemt het volledige scherm weergegeven

Er zijn twee nieuwe methoden beschikbaar om de conferentie Layout in CallManager te beheren:

/**
 * 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);

Uitvoering

De implementatie is vrij eenvoudig. Alles wordt beheerd door conference.cpp (om deelnemer te koppelen aan bronnen) en video_mixer.cpp (om de gewenste lay-out te renderen).

Synchronisatie van conferenties Informatie

Opmerking: In feite wordt het woord deelnemer gebruikt voor gebedsoproepen gemengd in een conferentie.

Het doel is om alle deelnemers te informeren over de metadata van de video. Dit betekent waar de deelnemer zich bevindt en waar de video zich bevindt.

Als een deelnemer zelf een conferentie is, moet de inkomende layout-informatie worden samengevoegd wanneer deze naar andere deelnemers wordt verzonden.

Layout Info

De Layout wordt opgeslagen als een VectorMapStringString voor cliënten en intern met een vector met het volgende formaat:

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"
    }
    (...)
}

Mogelijke sleutels zijn:

  • uri = de uri van de rekening

  • apparaat = apparaat-ID

  • media = media-ID

  • actief = indien de deelnemer actief is

  • x = positie (x) in de video

  • Y = positie (y) in de video

  • w = grootte (breedte) in de video

  • h = grootte (hoogte) in de video

  • videoMutted = als de video is geblokkeerd

  • audioLocalMuted = als het geluid lokaal is stilgelegd

  • audioModeratorMuded = als de audio door moderators wordt gedemonteerd

  • isModerator = als het een moderator is

  • handHeaved = als de hand is opgeheven

  • voiceActivity = als de stroom stemactiviteit heeft

  • opname = als de collega de conferentie opneemt

Nieuwe API

Er is een nieuwe methode (in CallManager) en een nieuw signaal beschikbaar om respectievelijk actuele conferentieinformatie en updates te krijgen:

VectorMapStringString getConferenceInfos(const std::string& confId);

void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);

Uitvoering

Het Conference Object (dat alleen bestaat als we oproepen mengen, dit betekent dat we de master zijn) beheert de informatie voor de hele conferentie, op basis van de LayoutInfos van elk Call object.

Dus elk Call object heeft nu een LayoutInfo en als het wordt bijgewerkt, vraag het Conference object om zijn informatie te updaten.

De master van een conferentie stuurt zijn informatie via het SIP-kanaal als een bericht met het volgende MIME-type: application/confInfo+json

Als een gesprek confidentiële informatie krijgt, weten we dat dit gesprek lid is van een conferentie.

Om samen te vatten, Call beheert ontvangen layouts, Conference-beheer verzonden layouts.

Verandering van de stand van de conferentie

Om de stand van de conferentie te veranderen, moeten deelnemers bestellingen sturen die de gastheer zal afhandelen.

Het protocol heeft de volgende behoeften:

Het moet op verschillende niveaus bestellingen verwerken.

  • De rekening die de identiteit van de deelnemer is

  • Apparaten, omdat elke account via meerdere apparaten kan worden aangesloten

  • Medias, omdat er meerdere video’s per apparaat kunnen zijn (bijv. 1 camera en 1 scherm sharing)

Om bandbreedte te besparen, moeten klanten meerdere bestellingen tegelijk kunnen sturen.

Algemene acties

Om een layout te veranderen, kan de moderator een payload sturen met “application/confOrder+json” als type: waar 0 een grid is, 1 is één gebruiker in groot, anderen in klein, 2 is één in groot

Acties van de rekening

Vooralsnog is er echter geen actie ondersteund, in de toekomst moderator: true/false moet worden behandeld om een moderator te veranderen.

De werking van het apparaat

  • hangup: true om een apparaat van de conferentie op te hangen (alleen moderators)

  • raisehand: true/false om de status van de raised hand te veranderen.

De acties van de media

  • muteAudio alleen mogelijk door moderators om de audio van een deelnemer te laten stinken

  • muteVideo nog niet ondersteund.

  • active om de media als actief te markeren.

  • voiceActivity om de status van de spraakactiviteit van een media-stroom aan te geven (alleen relevant voor audio)

Voorbeeld

De applicatie/confOrder+json bevat dus:

{
    "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,
}

Opmerking: het type media moet worden opgenomen in conferentieinformatie en kan worden gebruikt voor de cliënt om de weergave te verbeteren (bijv. niet te vergrendelen scherm sharing)

Controleerders

Er zijn eigenlijk drie mogelijkheden:

  • Config van de veranderende account om een lijst met moderators toe te voegen (in de config.yml (defaultModerators kan een lijst met standaard moderators worden opgenomen)

  • Als localModeratorsEnabled is waar, zijn alle accounts van het apparaat moderators

  • Als allModeratorsEnabled is waar, zal iedereen in de conferentie een moderator zijn

De toekomst

  • Afzonderlijke stromen om meer controle te kunnen geven?

Notities/Commentaren

Het is waarschijnlijk dat het protocol zal evolueren voor toekomstige behoeften. Ik denk dat het het beste is als we een “versie” veld hebben. De oudere versie zal worden herkend als dit veld ontbreekt.