Conferentieprotocol
Dit document heeft tot doel de ontwikkelingen te beschrijven die we zullen maken voor het beheer van conferenties (audio/video). Het doel is om de huidige implementatie te verbeteren die eenvoudigweg SIP-oproepen combineert en een gridweergave biedt, zodat de deelnemers zelfstandig kunnen worden gemutst of de video-afdeling kan worden gewijzigd (om slechts één deelnemer te laten zien)
Definities
Gastgever: Is de gebruiker die de audio/video streams voor de anderen mengt
Deelnemer: Elke gebruiker van de conferentie, zelfs de gastheer
Verwijzing van aansprakelijkheid
Dit document beschrijft voorlopig slechts de eerste stappen, wat de identificatie van de deelnemers en de positie in de video-mixer betekent die aan alle deelnemers wordt verzonden.
Mogelijke uitleg
GRID: elk lid wordt getoond met dezelfde hoogte/breedte
ONE_BIG_WITH_SMALL: Eén lid wordt gezoomd en de andere voorbeeld wordt weergegeven
ONE_BIG: Eén lid neemt het volledige scherm weergegeven
Er zijn twee nieuwe methoden beschikbaar om de conferentie Layout in CallManager te beheren:
/**
* 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);
Uitvoering
De implementatie is vrij eenvoudig. Alles wordt beheerd door conference.cpp
(om deelnemer te koppelen aan bronnen) en video_mixer.cpp
(om de gewenste lay-out te renderen).
Synchronisatie van conferenties Informatie
Opmerking: In feite wordt het woord deelnemer gebruikt voor gebedsoproepen gemengd in een conferentie.
Het doel is om alle deelnemers te informeren over de metadata van de video. Dit betekent waar de deelnemer zich bevindt en waar de video zich bevindt.
Als een deelnemer zelf een conferentie is, moet de inkomende layout-informatie worden samengevoegd wanneer deze naar andere deelnemers wordt verzonden.
Layout Info
De Layout wordt opgeslagen als een VectorMapStringString voor cliënten en intern met een 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"
}
(...)
}
Mogelijke sleutels zijn:
uri = de uri van de rekening
apparaat = apparaat-ID
media = media-ID
actief = indien de deelnemer actief is
x = positie (x) in de video
Y = positie (y) in de video
w = grootte (breedte) in de video
h = grootte (hoogte) in de video
videoMutted = als de video is geblokkeerd
audioLocalMuted = als het geluid lokaal is stilgelegd
audioModeratorMuded = als de audio door moderators wordt gedemonteerd
isModerator = als het een moderator is
handHeaved = als de hand is opgeheven
voiceActivity = als de stroom stemactiviteit heeft
opname = als de collega de conferentie opneemt
Nieuwe API
Er is een nieuwe methode (in CallManager) en een nieuw signaal beschikbaar om respectievelijk actuele conferentieinformatie en updates te krijgen:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Uitvoering
Het Conference
Object (dat alleen bestaat als we oproepen mengen, dit betekent dat we de master zijn) beheert de informatie voor de hele conferentie, op basis van de LayoutInfos van elk Call
object.
Dus elk Call
object heeft nu een LayoutInfo en als het wordt bijgewerkt, vraag het Conference
object om zijn informatie te updaten.
De master van een conferentie stuurt zijn informatie via het SIP-kanaal als een bericht met het volgende MIME-type: application/confInfo+json
Als een gesprek confidentiële informatie krijgt, weten we dat dit gesprek lid is van een conferentie.
Om samen te vatten, Call
beheert ontvangen layouts, Conference
-beheer verzonden layouts.
Verandering van de stand van de conferentie
Om de stand van de conferentie te veranderen, moeten deelnemers bestellingen sturen die de gastheer zal afhandelen.
Het protocol heeft de volgende behoeften:
Het moet op verschillende niveaus bestellingen verwerken.
De rekening die de identiteit van de deelnemer is
Apparaten, omdat elke account via meerdere apparaten kan worden aangesloten
Medias, omdat er meerdere video’s per apparaat kunnen zijn (bijv. 1 camera en 1 scherm sharing)
Om bandbreedte te besparen, moeten klanten meerdere bestellingen tegelijk kunnen sturen.
Algemene acties
Om een layout te veranderen, kan de moderator een payload sturen met “application/confOrder+json” als type: waar 0 een grid is, 1 is één gebruiker in groot, anderen in klein, 2 is één in groot
Acties van de rekening
Vooralsnog is er echter geen actie ondersteund, in de toekomst moderator: true/false
moet worden behandeld om een moderator te veranderen.
De werking van het apparaat
hangup: true
om een apparaat van de conferentie op te hangen (alleen moderators)raisehand: true/false
om de status van de raised hand te veranderen.
De acties van de media
muteAudio
alleen mogelijk door moderators om de audio van een deelnemer te laten stinkenmuteVideo
nog niet ondersteund.active
om de media als actief te markeren.voiceActivity
om de status van de spraakactiviteit van een media-stroom aan te geven (alleen relevant voor audio)
Voorbeeld
De applicatie/confOrder+json
bevat dus:
{
"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,
}
Opmerking: het type media moet worden opgenomen in conferentieinformatie en kan worden gebruikt voor de cliënt om de weergave te verbeteren (bijv. niet te vergrendelen scherm sharing)
Controleerders
Er zijn eigenlijk drie mogelijkheden:
Config van de veranderende account om een lijst met moderators toe te voegen (in de config.yml (
defaultModerators
kan een lijst met standaard moderators worden opgenomen)Als
localModeratorsEnabled
is waar, zijn alle accounts van het apparaat moderatorsAls
allModeratorsEnabled
is waar, zal iedereen in de conferentie een moderator zijn
De toekomst
Afzonderlijke stromen om meer controle te kunnen geven?
Notities/Commentaren
Het is waarschijnlijk dat het protocol zal evolueren voor toekomstige behoeften. Ik denk dat het het beste is als we een “versie” veld hebben. De oudere versie zal worden herkend als dit veld ontbreekt.