Protocollo della conferenza
Questo documento ha lo scopo di descrivere le evoluzioni che faremo per la gestione delle conferenze (audio/video). L’obiettivo è quello di migliorare l’attuale implementazione, che si limita a unire le chiamate SIP e a fornire una visualizzazione a griglia, per passare a una visualizzazione in cui i partecipanti sono elencati, possono essere silenziati in modo indipendente o la disposizione del video può essere modificata (per mostrare solo un partecipante).
Definizioni
Host: è l’utente che mescola i flussi audio/video per gli altri
Partecipante: ogni utente della conferenza, anche l’host
Disclaimer
Questo documento descrive solo i primi passaggi, che per ora significano l’identificazione dei partecipanti e la posizione del video mixer inviato a tutti i partecipanti.
Possibili layout
GRID: ogni membro è mostrato con la stessa altezza/larghezza
ONE_BIG_WITH_SMALL: uno membro è zoomato e viene visualizzato l’altro preview
ONE_BIG: un membro prende la schermata completa
Due nuovi metodi sono disponibili per gestire la conferenza Layout in 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);
Attuazione
L’implementazione è piuttosto semplice. Tutto è gestito da conference.cpp
(per collegare il partecipante alle fonti) e video_mixer.cpp
(per rendere il layout desiderato).
Informazioni di sincronizzazione delle conferenze
Nota: In realtà, la parola partecipante è usata per chiamate mescolate in una conferenza. Questo può portare all’inizio a alcuni problemi per l’API e deve essere risolto in futuro
L’obiettivo è di informare tutti i partecipanti dei metadati del video reso. Ciò significa chi è il partecipante alla conferenza e dove si trova il video.
Se un partecipante è una conferenza, le informazioni di layout entranti dovrebbero essere fuse quando inviate ad altri partecipanti.
Informazioni di layout
Il layout viene memorizzato come VectorMapStringString per i clienti e internamente con un vettore
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"
}
(...)
}
Le chiavi possibili sono:
uri = uri della conta
dispositivo = ID del dispositivo
media = ID del media
attivo = se il partecipante è attivo
x = posizione (x) nel video
Y = posizione (y) nel video
w = dimensione (larghezza) nel video
h = dimensione (altezza) nel video
videocamera spenta = se la videocamera è spenta
microfono locale disattivato = se il microfono del tuo dispositivo è stato spento da te
microfono spento al Moderatore = se i moderatori spengono il loro microfono
isModerator = se è un moderatore
mano alzata = se la mano è alzata
voiceActivity = se il flusso ha attività vocale
registrazione = se il pari sta registrando la conferenza
Nuova API
Un nuovo metodo (in CallManager) e un nuovo segnale per ottenere rispettivamente le informazioni e gli aggiornamenti delle conferenze attuali sono disponibili:
VectorMapStringString getConferenceInfos(const std::string& confId);
void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);
Attuazione
L’oggetto Conference
(che esiste solo se mischiamo le chiamate, questo significa che siamo noi il maestro) gestisce le informazioni per l’intera conferenza, basandosi sul layoutInfos di ciascun oggetto Call
.
Quindi, ogni oggetto Call
ora ha una LayoutInfo e se aggiornato, chiedere all’oggetto Conference
di aggiornare le sue informazioni.
Il direttore di una conferenza invia le sue informazioni attraverso il canale SIP come messaggio con il seguente tipo MIME: applicazione/confInfo+json
Quindi, se una chiamata riceve qualche informazione confidenziale, sappiamo che questa chiamata è un membro di una conferenza.
In sintesi, Call
gestisce le layout ricevute, Conference
gestisce le layout inviate.
Cambiare lo stato della conferenza
Per cambiare lo stato della conferenza, i partecipanti devono inviare ordini che l’ospite gestirà.
Il protocollo ha le seguenti esigenze:
In realtà per una conferenza sono 3 i livelli per definire un partecipante:
Il conto che costituisce l’identità del partecipante
Dispositivi, perché ogni account può unirsi tramite più dispositivi
Medi, perché possono esserci più video per dispositivo (ad esempio 1 fotocamera e 1 condivisione dello schermo)
Per risparmiare larghezza di banda, i clienti dovrebbero essere in grado di inviare più ordini contemporaneamente.
Azioni generali
Per modificare un layout, il moderatore può inviare un carico utile con «applicazione/confOrder+json» come tipo: dove 0 è una griglia, 1 è un utente in grande, altri in piccolo, 2 è uno in grande
Azioni del conto
Per il momento, tuttavia, non vi è alcuna azione sostenuta, in futuro moderatore: true/false
deve essere gestito per cambiare un moderatore.
Azioni del dispositivo
hangup: true
per appendere un dispositivo della conferenza (solo i moderatori)raisehand: true/false
per modificare lo stato della mano elevata.
Le azioni dei media
«disattiva microfono» può essere fatto solo dai moderatori per disattivare il microfono di un partecipante
«disattiva videocamera» non è ancora disponibile.
active
per segnalare i media come attivi.voiceActivity
indicare lo stato dell’attività vocale di un flusso di media (solo rilevante per l’audio)
Esempio
Quindi, l’applicazione/confOrder+json` contiene:
{
"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,
}
Nota: il tipo di supporto deve essere incluso nelle informazioni di conferenze e può essere utilizzato per il cliente per migliorare la visualizzazione (ad esempio non tagliare la condivisione dello schermo)
Controllo dei moderatori
Ci sono in realtà 3 possibilità:
Configurazione del conto di cambio per aggiungere un elenco di moderatori (Nella config.yml (
defaultModerators
può contenere un elenco di moderatori predefiniti)Se
localModeratorsEnabled
è vero, tutti gli account del dispositivo saranno moderatoriSe
allModeratorsEnabled
è vero, chiunque nella conferenza sarà un moderatore
Futuro
Strumi separati per permettere più controlli?
Nota/Commenti
E” probabile che il protocollo si evolverà per le esigenze future. Credo che sia meglio se abbiamo un campo «versione». La versione precedente sarà riconosciuta se questo campo manca.