Protokol konferencie

Tento dokument má na cieľ opísať vývoj, ktorý budeme robiť pri riadení konferencií (audio/video). Cieľom je zlepšiť súčasné implementovanie, ktoré jednoducho spojuje hovory SIP a poskytuje zobrazenie siete, na zobrazenie, kde sú účastníci uvedené, môže byť nezávisle zmutované alebo rozloženie videa zmenené (aby sa zobrazoval len jeden účastník)

Definície

  • Hostiteľ: Je používateľ, ktorý zmieša zvukové/videové streamy pre ostatné

  • Účastník: Každý používateľ konferencie, dokonca aj hostiteľ

Odvolanie od zodpovednosti

Tento dokument zatiaľ opisuje len prvé kroky, čo znamená identifikáciu účastníkov a pozíciu v videomesičovi, ktorý je odoslaný všetkým účastníkom.

Možné usporiadanie

  • GRID: Každý člen je zobrazený s rovnakou výškou/šírkou

  • ONE_BIG_WITH_SMALL: Jeden člen je zoomovaný a zobrazuje sa ďalší predbežný prehľad

  • ONE_BIG: Jeden člen zobrazí plný obrazovka

Na riadenie usporiadania konferencie v CallManager sú k dispozícii dve nové metódy:

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

Vytvorenie je pomerne jednoduché. Všetko riadi conference.cpp (počítať účastníka na zdroje) a video_mixer.cpp (predstaviť požadovaný rozvrh).

Synchronizácia konferenčných informácií

Poznámka: V skutočnosti sa slovo účastník používa pre callId zmiešaný v konferencii.

Cieľom je informovať všetkých účastníkov o metadatach zobrazeného videa. To znamená, kto je účastníkom konferencie a kde sa video nachádza.

Ak je účastník samotný konferenčná, jeho vstupné informácie o usporiadaní by sa mali zlúčiť pri odoslaní iným účastníkom.

Informácie o usporiadaní

Layout je uložený ako VectorMapStringString pre klientov a internálne s vektorom s týmto formátom:

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

Možné kľúčy sú:

  • uri = urí účtu

  • zariadenie = identifikátor zariadenia

  • médium = identifikátor médium

  • aktívny = ak je účastník aktívny

  • x = pozícia (x) v videu

  • y = pozícia (y) v videu

  • w = veľkosť (šírka) v videu

  • h = veľkosť (vysokosť) v videu

  • videoMutued = ak je video umutuje

  • audioLocalMuted = ak je zvuk lokálne utiahnutý

  • audioModeratorMuted = ak je zvuk utiekaný moderátormi

  • isModerator = ak je to moderátor

  • handRaised = ak je ruka zväčšená

  • hlasAktivita = ak má stream hlasovú aktivitu

  • záznam = ak peer zaznamenáva konferenciu

Nová API

Nový spôsob (v CallManager) a nový signál na získanie aktuálnych konferenčných informácií a aktualizácií sú k dispozícii:

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

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

ConferenceObjekt (ktorý existuje len vtedy, ak sme zmiešať hovory, to znamená, že sme majstrom) spravuje informácie pre celú konferenciu na základe LayoutInfos každého Call`Objekt. getConferenceInfos získa informácie priamo z tohto objektu.

Takže každý Call objekt má teraz LayoutInfo a ak je aktualizovaný, požiadajte Conference objekt aktualizovať svoje informácie.

Majster konferencie posiela svoje informácie prostredníctvom kanálu SIP ako správu s týmto typom MIME: application/confInfo+json

Takže ak hovor dostane nejaké informácie, vieme, že je členom konferencie.

Zhrnutie: Call spravuje prijaté rozloženia, Conference-managed zaslané rozloženia.

Zmena stavu konferencie

Aby sa zmenil stav konferencie, účastníci musia poslať objednávky, ktoré bude hostiteľ obsluhovať.

Protokol má tieto potreby:

V skutočnosti pre konferenciu je 3 úrovne definovať účastníka:

  • Účtovný účet, ktorý je totožnosťou účastníka

  • Zariadenia, pretože každý účet sa môže pripojiť prostredníctvom viacerých zariadení

  • Mediá, pretože môžu byť viacero videí podľa zariadení (napr. 1 kamera a 1 zdieľanie obrazovky)

Aby sa ušetrila šírenie pásma, klienti by mali byť schopní odosielať viacero objednávok naraz.

Všeobecné opatrenia

Moderátor môže zmeniť rozloženie a poslať užitočný náklad s typom „application/confOrder+json“: kde 0 je sieť, 1 je jeden používateľ vo veľkom, iní vo malom, 2 je jeden vo veľkom

Akcie účtu

V súčasnosti však nie je podporovaná žiadna akcia v budúcnosti moderátor: by sa mal riešiť správny/false na zmenu moderátora.

Akcie zariadenia

  • hangup: true na odpojenie zariadenia z konferencie (iba moderátori)

  • raisehand: true/false zmeniť stav zdvihacej ruky.

Akcie médií

  • muteAudio len moderátormi je možné utiahnuť zvuk účastníka

  • muteVideo zatiaľ nepodporované.

  • active označiť médiá ako aktívne.

  • voiceAktivita na označenie stavu hlasovej aktivity mediálneho toku (pouze relevantné pre zvuk)

Príklad

So, the application/confOrder+json will contain:

{
    "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 */
}

Poznámka: typ médií by sa mal zahrnúť do informácií o konferenciách a môže sa použiť pre klienta na zlepšenie zobrazenia (napr. nezdieľanie obrazovky)

Kontrola moderátorov

V skutočnosti existujú tri možnosti:

  • Konfigovanie zmenu účtu na pridanie zoznamu moderátorov (V konfig.yml (defaultModerators môže obsahovať zoznam štandardných moderátorov)

  • Ak je localModeratorsEnabled pravda, všetky účty zariadenia budú moderátormi

  • Ak je pravda, že allModeratorsEnabled je pravda, každý na konferencii bude moderátorom

Budúcnosť

  • Oddelené toky, aby sme mohli viac kontrolovať?

Poznámky/Komentáre

Je pravdepodobné, že protokol bude evolúovať pre budúce potreby. Verím, že je najlepšie, ak máme pole „verzie“. Staršia verzia bude rozpoznaná, ak toto pole chýba.