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
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íkamuteVideo
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átormiAk 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.