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
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 deltagermuteVideo
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 moderatorerHvis
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.