Protokol konference
Cilj tega dokumenta je opisati razvoj, ki ga bomo storili pri upravljanju konferencij (audio/video). Cilj je izboljšati trenutno izvajanje, ki preprosto združuje SIP klice in zagotavlja pregled omrežja, da se prikažejo udeleženci, ki jih je mogoče samostojno pomiriti ali pa se spremeni video razporeditev (za prikaz samo enega udeležencega)
Definisije
Host: Je uporabnik, ki meša avdio/video tokove za druge
Sodelovalec: Vsak uporabnik konference, tudi gostitelj
Izključitev odgovornosti
Ta dokument opisuje le prve korake, ki so za zdaj namenjene identifikaciji udeležencev in položaju v videomeksu, ki ga pošljejo vsem udeleženci.
Možni razpored
GRID: Vsak član je prikazan z enako višino/širino
ONE_BIG_WITH_SMALL: Ena članica je povečana in prikazana je druga predvajalka
ONE_BIG: En član prikaže celotni zaslon
Za upravljanje konfiguracije konference v CallManagerju so na voljo dve novi metodi:
/**
* 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);
Izvajanje
Izvajanje je precej preprosto. Vse upravlja conference.cpp
(za povezovanje udeleženca z viri) in video_mixer.cpp
(za prikaz želenega oblikovanja).
Informacije o sinhronizaciji konferencij
Opomba: Na splošno se za mešano klic na konferenci uporablja beseda udeleženec.
Cilj je, da se vsem udeleženci obvesti o metadanih podatkih prikazanega videa.
Če je udeleženec sam konferenca, se informacije o njegovi prihodnji postavki morajo združiti, ko jih pošljemo drugim udeležencem.
Informacije o razporeditvi
Razporeditev se shrani kot VectorMapStringString za stranke in notranji s vektorjem
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žni ključi so:
uri = uri računov
naprava = identifikacija naprave
medij = identifikacija medija
aktivno = če je udeleženec aktiven
x = položaj (x) v videu
y = položaj (y) v videu
w = velikost (širokost) v videu
h = velikost (visina) v videu
videoUmuted = če je videoUmuted
audioLocalMuted = če je zvok lokalno umeten
audioModeratorMuted = če so zvočni mediji zaumirali
isModerator = če je moderator
Roka dvignjena = če je roka dvignjena
glasActivity = če je tok glasovna aktivnost
zapisovanje = če je partner zapisoval konferenco
Novi API
Na voljo je nova metoda (v CallManagerju) in novi signal za pridobivanje trenutnih informacij in posodobitev konference:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Izvajanje
ConferenceObjekt (ki obstaja samo, če mešava klice, kar pomeni, da smo vi gospodar) upravlja informacije za celotno konferenco, na podlagi LayoutInfo vsakega
Call`Objekt.
Torej, vsak Call
objekt zdaj ima LayoutInfo in če je posodobljen, prosite Conference
objekt, da posodobi svoje informacije.
Vodja konference pošlje svoje informacije prek SIP kanala kot sporočilo z naslednjim tipom MIME: application/confInfo+json
Če klice prejmejo informacije, vemo, da je član konference.
Če povzamemo, Call
upravlja prejetih postavk, Conference
-managed poslanih postavk.
Sprememba stanja konference
Da bi spremenili stanje konference, morajo udeleženci pošiljati naročila, ki jih bo voditelj opravil.
Protokol ima naslednje potrebe:
V resnici je za konferenco 3 ravni, ki opredeljujejo udeleženca:
Račun, ki je identiteta udeleženca
Naprave, ker se lahko vsak račun poveže prek več naprav
Mediji, ker lahko na različnih napravah (npr. 1 kamera in 1 deljenje zaslona)
Za prihranek širokopasovnega prometa bi morali biti stranke sposobne pošiljati več naročil hkrati.
Splošna akcija
Če želite spremeniti načrt, lahko moderator pošlje koristno obremenitev z „aplikacijo/konfiguracijo+json“ kot tip: kjer je 0 mreža, 1 je eden uporabnik v velikem, drugi v majhnem, 2 je eden v velikem
Dejanja računa
Zaenkrat ni podprtega ukrepa, vendar v prihodnosti moderator: real/false
je treba obravnavati, da bi zamenjal moderatorja.
Dejanja naprave
hangup: true
za obložitev naprave iz konference (samo moderatorji)raisehand: true/false
spremeniti status dvigače roke.
Dejanja medijev
muteAudio
samo moderatorji lahko utišajo zvok udeležencamuteVideo
še ni podprt.active
označiti medije kot aktivne.voiceAktivnost
za navede stanje glasovne dejavnosti medijskega toka (samo relevantno za avdio)
Primeri
Torej priložba/povezava+json
bo vsebovala:
{
"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,
}
Opomba: vrsta medija je treba vključiti v informacije o konferencah in jo lahko uporabite za izboljšanje prikaza (npr. ne poslabšajte deljenja zaslona)
Kontrolirati moderatorji
V bistvu obstajajo tri možnosti:
Konfiguracija spreminjajočega računa za dodajanje seznama moderatorjev (v konfiguraciji.yml (
defaultModerators
lahko vsebuje seznam standardnih moderatorjev)Če je
localModeratorsEnabled
res, bodo vse račune naprave moderatorjiČe je vse moderatorje omogočeni res, bo vsak na konferenci moderator.
Prihodnost
Ločeni tokovi, da bi omogočili več nadzora?
Opombe/Komentarji
Pravzaprav je verjetno, da se bo protokol razvil za prihodnje potrebe. Mislim, da je najbolje, če imamo polje „verzija“. Starejša različica bo prepoznana, če ta polje manjka.