Protocolul conferinței
Acest document își propune să descrie evoluțiile pe care le vom face pentru gestionarea conferințelor (audio/video). Scopul este de a îmbunătăți implementarea actuală, care doar unește apelurile SIP și oferă o vizualizare în grilă, printr-o vizualizare în care participanții sînt enumerați, pot fi mutați în mod independent sau aspectul video poate fi modificat (pentru a arăta doar un singur participant).
Definitorii
Host: Este utilizatorul care amestecă fluxurile audio/video pentru celelalte
Participant: Fiecare utilizator la conferință, chiar și gazda
Disclaimer
Acest document descrie doar primele pași pentru moment.
Posibile layouturi
GRID: Fiecare membru este prezentat cu aceeași înălțime/ lățime
ONE_BIG_WITH_SMALL: Un membru este îndepărtat și se afișează prealabil celălalt
ONE_BIG: Un membru face ecranul complet
Există două metode noi de gestionare a configurării conferinței în CallManager:
/**
* 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);
Implementarea este destul de simplă. Totul este gestionat de conference.cpp
(pentru a lega participantul la surse) și video_mixer.cpp
(pentru a face reprodusarea layoutului dorit).
Informaţii despre conferinţele de sincronizare
Notă: De fapt, cuvântul participant este folosit pentru apeluri amestecate într-o conferință.
Scopul este de a informa toți participanții cu privire la metadatele videoclipului prezentat.
Dacă un participant este în sine o conferință, informațiile sale de layout intrante ar trebui să fie fuzionate atunci când sunt trimise altor participanți.
Informaţii despre formatare
Layout-ul este stocat ca VectorMapStringString pentru clienți și intern cu un vector
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"
}
(...)
}
Cheile posibile sunt:
uri = uri de cont
dispozitivul = identificarea dispozitivului
media = ID-ul mediului
activ = dacă participantul este activ
x = poziția (x) în video
y = poziția (y) în video
w = dimensiunea (amplitudinea) în video
h = dimensiunea (ălțimea) în video
videocameră oprită = dacă este oprită camera video
microfon local oprit = dacă microfonul aparatului tău este oprit de tine
microfon oprit la Moderator = dacă moderatorii își opresc microfonul
isModerator = dacă este un moderator
Mâna ridicată = dacă mâna este ridicată
activitate vocală = dacă fluxul are activitate vocală
înregistrare = dacă partenerul înregistrează conferința
Nouă API
O nouă metodă (în CallManager) și un nou semnal pentru a obține informații și actualizări actuale ale conferinței sunt disponibile:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Obiectul Conference
(care există numai dacă am amesteca apelurile, ceea ce înseamnă că suntem maestrul) gestionează informațiile pentru întreaga conferință, bazându-se pe LayoutInfos al fiecărui obiect Call
.
Astfel, fiecare obiect Call
are acum o LayoutInfo și, dacă este actualizat, cere obiectului Conference
să actualizeze informațiile sale.
Maestrul unei conferințe își trimite informațiile prin intermediul canalului SIP ca un mesaj cu următorul tip de MIME: application/confInfo+json
Deci, dacă un apel primeşte informaţii, ştim că apelul este membru al unei conferinţe.
În concluzie, Call
gestionează layouts primite, Conference
-managează layouts trimise.
Schimbarea stării conferinței
Pentru a schimba starea conferinţei, participanţii trebuie să trimită ordine pe care gazda le va gestiona.
Protocolul are următoarele nevoi:
De fapt, pentru o conferinţă, este nevoie de 3 nivele pentru a defini un participant:
Contul care reprezintă identitatea participantului
Dispozitivele, deoarece fiecare cont poate fi conectat prin mai multe dispozitive
Medii, deoarece pot exista mai multe videoclipuri de către dispozitive (de exemplu, 1 cameră și 1 partajare a ecranului)
Pentru a economisi lățimea de bandă, clienții ar trebui să poată trimite mai multe comenzi simultan.
Acțiuni generale
Pentru a schimba un layout, moderatorul poate trimite o încărcare utile cu „application/confOrder+json” ca tip: unde 0 este o grilă, 1 este un utilizator în mare, alții în mic, 2 este unul în mare
Acțiunile contului
În prezent, nu există nicio acțiune susținută, cu toate acestea, în viitor moderator: true/false
ar trebui tratat pentru a schimba un moderator.
Acțiunile dispozitivului
hangup: true
pentru a atârna un dispozitiv de la conferință (numai moderatori)raisehand: true/false
pentru a schimba statutul mâinii de ridicare.
Acţiunile mass-mediei
„oprește microfonul” poate fi făcut doar de moderatori pentru a dezactiva microfonul unui participant
„oprește videocamera” nu este încă disponibil.
active
pentru a marca media ca fiind activă.voiceActivitate
pentru a indica starea de activitate vocală a unui flux de media (încetat relevant pentru audio)
Exemplu
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 */
}
Notă: tipul de suport de presa trebuie inclus în informațiile conferințelor și poate fi utilizat pentru clientul pentru a îmbunătăți afișarea (de exemplu, nu se reduce partajarea ecranului)
Controlul moderatorilor
De fapt, există 3 posibilităţi:
Configul contului de schimbare pentru a adăuga o listă de moderatori (în config.yml (
defaultModerators
poate conține o listă de moderatori standard)Dacă
localModeratorsEnabled
este adevărat, toate conturile dispozitivului vor fi moderatoriDacă
allModeratorsEnabled
este adevărat, oricine va fi moderator la conferinţă
Viitorul
Strume separate pentru a permite mai multe controale?
Notă/Comentare
Este probabil ca protocolul va evolua pentru nevoile viitoare. Cred ca este cel mai bine daca avem un câmp „versiune”. Versiunea veche va fi recunoscută dacă acest câmp lipsește.