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);
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);
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: trueper appendere un dispositivo della conferenza (solo i moderatori)raisehand: true/falseper 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.
activeper segnalare i media come attivi.voiceActivityindicare lo stato dell’attività vocale di un flusso di media (solo rilevante per l’audio)
Esempio
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 */
}
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 (
defaultModeratorspuò 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.