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 con il seguente formato:

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 moderatori

  • Se 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.