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 cu următorul format:

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 moderatori

  • Dacă 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.