Protocolo da conferência

Este documento visa descrever as evoluções que faremos para a gestão de conferências (áudio/vídeo). O objetivo é melhorar a implementação atual que simplesmente combina chamadas SIP e fornece uma visão de grade, para uma visão onde os participantes são listados, podem ser silenciados de forma independente, ou o layout de vídeo alterado (para mostrar apenas um participante)

Definições

  • Anfitrião: É o usuário que mistura os fluxos de áudio/vídeo para os outros

  • Participante: Todos os utilizadores da conferência, mesmo o anfitrião

Disclaimer

Este documento descreve apenas os primeiros passos, que significam a identificação dos participantes e a posição no videomixer enviado a todos os participantes.

Possibilidades de layout

  • Grade: Cada membro é mostrado com a mesma altura/largura

  • ONE_BIG_WITH_SMALL: Um membro é zoomado e o outro pré-visualização é mostrado

  • ONE_BIG: Um membro retrata a tela completa

Dois novos métodos estão disponíveis para gerir o Layout da conferência no 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);

Implementação

A implementação é bastante simples. Tudo é gerido por conference.cpp (para vincular o participante às fontes) e video_mixer.cpp (para render o layout desejado).

Sincronização das Conferências Informações

Nota: Na verdade, a palavra participante é usada para chamada misturada em uma conferência.

O objetivo é notificar a todos os participantes dos metadados do vídeo apresentado.

Se um participante é uma conferência, as informações de layout recebidas devem ser combinadas quando enviadas para outros participantes.

Informações de Layout

O layout é armazenado como VectorMapStringString para clientes e internamente com um vector com o seguinte 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"
    }
    (...)
}

As chaves possíveis são:

  • uri = uri da conta

  • dispositivo = identificação do dispositivo

  • media = identificação da mídia

  • ativo = se o participante estiver ativo

  • x = posição (x) no vídeo

  • Y = posição (y) no vídeo

  • w = tamanho (largura) no vídeo

  • h = tamanho (altura) no vídeo

  • videoMutuado = se o vídeo está silenciado

  • audioLocalMuted = se o áudio está localmente silenciado

  • audioModerator Muted = se o áudio é silenciado pelos moderadores

  • isModerator = se é um moderador

  • Manha levantada = se a mão estiver levantada

  • Atividade de voz = se o fluxo tem atividade de voz

  • gravação = se o colega está gravando a conferência

Nova API

Um novo método (no CallManager) e um novo sinal para obter respectivamente informações e atualizações de conferências atuais estão disponíveis:

VectorMapStringString getConferenceInfos(const std::string& confId);

void onConferenceInfosUpdated(const std::string& confId, const VectorMapStringString& infos);

Implementação

O Objeto Conference (que só existe se misturarmos chamadas, isto significa que somos o mestre) gerencia as informações para toda a conferência, com base nos LayoutInfos de cada objeto Call.

Assim, cada objeto Call agora tem uma LayoutInfo e, se atualizado, peça ao objeto Conference para atualizar suas informações.

O mestre de uma conferência envia as suas informações através do canal SIP como uma mensagem com o seguinte tipo de MIME: application/confInfo+json

Então, se uma chamada receber alguma informação, sabemos que esta chamada é um membro de uma conferência.

Em resumo, Call gerencia layouts recebidos, Conference-gerenciado layouts enviados.

Mudança do estado da conferência

Para mudar o estado da conferência, os participantes precisam enviar ordens que o anfitrião irá lidar.

O protocolo tem as seguintes necessidades:

Ele deve lidar com pedidos em vários níveis. De fato, para uma conferência, há 3 níveis para definir um participante:

  • A conta que constitui a identidade do participante

  • Dispositivos, porque cada conta pode se juntar através de vários dispositivos

  • Medios, porque podem haver vários vídeos por dispositivo (por exemplo, 1 câmera e 1 compartilhamento de tela)

Para economizar largura de banda, os clientes devem poder enviar vários pedidos ao mesmo tempo.

Ações gerais

Para alterar um layout, o moderador pode enviar uma carga útil com “application/confOrder+json” como tipo: onde 0 é uma grade, 1 é um usuário em grande, outros em pequeno, 2 é um em grande

Ações da conta

Por enquanto, não existe nenhuma acção apoiada, no futuro, no entanto, moderador: verdadeiro/falso deve ser tratado para alterar um moderador.

Ações do dispositivo

  • hangup: true para pendurar um dispositivo da conferência (apenas moderadores)

  • raisehand: verdadeiro/falso para alterar o status da mão elevadora.

Ações dos meios de comunicação social

  • muteAudio somente possível pelos moderadores para silenciar o áudio de um participante

  • muteVideo ainda não suportado.

  • active para marcar os meios de comunicação como activos.

  • voiceActivity para indicar o estado da atividade vocal de um fluxo de mídia (apenas relevante para áudio)

Exemplo

Assim, a application/confOrder+json contém:

{
    "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: o tipo de mídia deve ser incluído nas informações de conferências e pode ser utilizado para melhorar a exibição do cliente (por exemplo, não cortar a partilha de tela)

Controle de moderadores

Na verdade, há 3 possibilidades:

  • Configuração da conta de mudança para adicionar uma lista de moderadores (Na config.yml (defaultModerators pode conter uma lista de moderadores padrão)

  • Se localModeratorsEnabled for verdade, todas as contas do dispositivo serão moderadores

  • Se allModeratorsEnabled for verdade, qualquer pessoa na conferência será moderadora

Futuro

  • Fluxos separados para permitir mais controles?

Notas/Comentários

É provável que o protocolo irá evoluir para as necessidades futuras. Eu acredito que é melhor se temos um campo “versão”. A versão anterior será reconhecida se este campo estiver faltando.