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
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 participantemuteVideo
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 moderadoresSe
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.