Konferenceprotokol

Dette dokument har til formål at beskrive de udviklinger, vi vil gøre for at administrere konferencer (audio/video). Målet er at forbedre den nuværende implementering, der blot kombinerer SIP-opkald og giver et netudsyn, til et udsyn, hvor deltagerne er opført, kan stilles i stand selv, eller video layout ændret (for at vise kun en deltager)

Definitioner

  • Værtsgiver: Er brugeren, der blander lyd/video-strømme til de andre

  • Deltager: Alle brugere i konferencen, selv værten

Afvisning af ansvar

Dette dokument beskriver kun de første trin for øjeblikket. Dette betyder identifikation af deltagerne og position i videomikleren, som sendes til alle deltagere.

Mulige layouter

  • GRID: Alle medlemmer vises med samme højde/bredde

  • ONE_BIG_WITH_SMALL: Et medlem er zoomed og den anden forhåndsvisning vises

  • ONE_BIG: Et medlem tager den fulde skærm afbildet

Der er to nye metoder til at administrere konferensens layout i 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);

Udførelse

Implementeringen er ret enkel. Alt administreres af conference.cpp (for at forbinde deltageren til kilder) og video_mixer.cpp (for at render den ønskede layout).

Synkronisering af konferencer

Bemærk: I virkeligheden bruges ordet deltager til at kalde i en konference. Dette kan i første omgang føre til nogle problemer for API’en og skal løses i fremtiden

Målet er at informere alle deltagere om metadataene om den video, der er blevet vist.

Hvis en deltager selv er en konference, skal den indgående layout-information fusioneres, når den sendes til andre deltagere.

Layout Info

Layout gemmes som en VectorMapStringString for klienter og internt med en vektor med følgende 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"
    }
    (...)
}

Mulige nøgler er:

  • uri = kontoens uri

  • enhed = enhedens ID

  • media = mediets id

  • aktiv = hvis deltageren er aktiv

  • x = position (x) i videoen

  • y = position (y) i videoen

  • w = størrelse (bredde) i videoen

  • h = størrelse (højde) i videoen

  • videoMutted = hvis videoen er mummet

  • audioLocalMuted = hvis lyd er lokalt stummet

  • audioModerator Muted = hvis lydet er mutet af moderatorer

  • isModerator = hvis det er en moderator

  • HandHovedet = hvis hånden er hævet

  • voiceActivity = hvis strømmen har stemmeaktivitet

  • optagelse = hvis den anden deltager optager konferencen

Ny API

Der er en ny metode (i CallManager) og et nyt signal til henholdsvis at få aktuelle konferencer og opdateringer:

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

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

Udførelse

Conference Objektet (som kun eksisterer, hvis vi blander opkald, hvilket betyder, at vi er mesteren) administrerer oplysningerne for hele konferencen, baseret på LayoutInfos for hvert Call-objekt.

Så, hver Call objekt har nu en LayoutInfo og hvis opdateret, bede Conference objekt opdatere sine oplysninger.

Konferencelederen sender sine oplysninger via SIP-kanalen som en besked med følgende MIME-type: application/confInfo+json

Så hvis en opkald modtager nogle oplysninger, ved vi, at opkaldet er medlem af en konference.

For at opsummere: Call administrerer modtagne layouts, Conference-administreret sendt layouts.

Ændring af konferensens status

For at ændre konferencen skal deltagerne sende ordre, som værten vil håndtere.

Protokollet har følgende behov:

Det skal håndtere ordrer på flere niveauer.

  • Den konto, der er deltagerens identitet

  • Enheder, fordi hver konto kan tilslutte sig via flere enheder

  • Medier, fordi der kan være flere videoer per enhed (f.eks. 1 kamera og 1 skærmdeling)

For at spare båndbredde skal kunderne kunne sende flere ordrer på én gang.

Generelle aktioner

For at ændre et layout kan moderatoren sende en nyttoladning med »application/confOrder+json« som type: hvor 0 er et grid, 1 er en bruger i stor, andre i lille, 2 er en i stor

Kontoens handlinger

For øjeblikket er der ingen støtte til en handling, men i fremtiden moderator: true/false skal håndteres for at ændre en moderator.

Enheds handlinger

  • hangup: true til at hænge en enhed fra konferencen (kun moderatorer)

  • raisehand: true/false for at ændre hævdes status. Kun muligt ved selve udstyret, ellers droppet.

Mediernes handlinger

  • muteAudio kun muligt af moderatorer at sløre lyd af en deltager

  • muteVideo ikke understøttet endnu.

  • active at markere medierne som aktive.

  • voiceAktivitet til at angive en mediestrøm’s stemmeaktivitetsstatus (kun relevant for lyd)

Eksempel

Så i ansøgningen/konforder+json vil der være:

{
    "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,
}

Bemærk: medietypen bør være inkluderet i konferenceroplysninger og kan bruges til at forbedre visningen (f.eks. ikke skære skærmdeling)

Kontrol moderer

Der er faktisk tre muligheder:

  • Config af ændringskonto til at tilføje en liste over moderatorer (I config.yml (defaultModerators kan indeholde en liste over standard moderatorer)

  • Hvis localModeratorsEnabled er sandt, vil alle kontoer på enheden være moderatorer

  • Hvis allModeratorsEnabled er sandt, vil enhver i konferencen være moderator

Fremtid

  • Separate strømmen til at tillade flere kontroller?

Bemærkninger/Kommentarer

Det er sandsynligt, at protokollen vil udvikle sig til fremtidige behov. Jeg tror, det er bedst hvis vi har et »version« felt. Den ældre version vil blive genkendt, hvis dette felt mangler.