Guia do Desenvolvedor do Video Express
Este guia para desenvolvedores fornece informações detalhadas sobre como usar o Video Express.
Sobre o Video Express
O Vonage Video Express é uma biblioteca JavaScript para criar rapidamente um aplicativo web de videoconferência com múltiplos participantes. Ele funciona com base no OpenTok.js, a Video API do Vonage Video para aplicativos web.
Configurar o Video Express sala, com base em uma sessão da Video API, para permitir que vários clientes baseados na web se conectem.
O Video Express inclui o seguinte:
-
A gerenciador de layout, que se encarrega de organizar os elementos de vídeo na página HTML
-
Um gerenciador de qualidade que otimiza continuamente a resolução da transmissão e a taxa de quadros, reduzindo o uso de largura de banda do cliente.
-
Um gerenciador de experiência que define dinamicamente a prioridade dos palestrantes e silencia automaticamente os participantes que entram em reuniões maiores (consulte Detecção de alto-falante ativo).
-
Um Room Manager, que lida com a interação de baixo nível com o WebRTC e fornece primitivas de nível superior, com as quais é mais fácil trabalhar.
Carregando a biblioteca do Video Express
O Video Express está disponível como um módulo Node em npmjs.com:
Você também pode carregar a biblioteca Video Express usando um script marcar uma página HTML:
<script src="https://static.opentok.com/v1/js/video-express.js"></script>
Atualmente, o Vonage Video Express não inclui uma interface de usuário padrão. Portanto, você precisará adicionar CSS para definir o estilo dos componentes da sala em seu aplicativo:
Para começar rapidamente, copie o video-express-styles.css arquivo e inclua-o no head seção da
página usando o Video Express:
<link rel="stylesheet" href="/path/to/video-express-styles.css" media="screen" charset="utf-8">
Entrar em uma sala e transmitir o vídeo da câmera
Ligue para o Room construtor para entrar em uma sala do Video Express
const room = new VideoExpress.Room({
apiKey: 'b28bcf05-b8bf-4c78-9f92-0b7435aa52ee',
sessionId: '1_this1is2my3new4session5id6',
token: 'eyJhbGciOiJIU[...]',
});
O apiKey, sessionId, e token são o ID do aplicativo do seu aplicativo de vídeo,
um ID de sessão para a sala e um token. O token deve incluir a função “publisher”.
Você pode obter o ID do aplicativo no seu Painel do Cliente da Vonage, na seção "Criar e gerenciar" e, em seguida, "Applications". Crie IDs de sessão e
tokens usando o SDKs de servidor.
O código a seguir cria uma instância de `Room` (com todos os parâmetros)
const room = new VideoExpress.Room({
apiKey:'b28bcf05-b8bf-4c78-9f92-0b7435aa52ee',
sessionId: "1_this1is2my3new4session5id6",
token: "eyJhbGciOiJIU[...]",
roomContainer: "roomcontainer",
managedLayoutOptions: {
layoutMode: "active-speaker",
cameraPublisherContainer: "cameraPublisherContainerDiv",
screenPublisherContainer: "screenPublisherContainerDiv",
}
});
O código a seguir cria uma instância de `Room`, mas exclui os contêineres da câmera e do compartilhamento de tela:
const room = new VideoExpress.Room({
apiKey: 'b28bcf05-b8bf-4c78-9f92-0b7435aa52ee',
sessionId: "1_this1is2my3new4session5id6",
token: "eyJhbGciOiJIU[...]",
roomContainer: "roomcontainer",
managedLayoutOptions: {
layoutMode: "active-speaker",
}
});
Quando o cliente entra na sala, o objeto Room dispara um connected
evento:
room.on('connected', () => {
console.log('Connected');
// Can use this event to update visual indicator for connection status
});
Veja Eventos para obter mais informações sobre o modelo de eventos do Video Express.
Ao entrar em uma sala, o Video Express cria um emissor de câmera para o cliente. Isso transmite o vídeo do cliente para os demais participantes da sala. O usuário é solicitado a conceder acesso à câmera e ao microfone. Se o usuário negar o acesso à câmera e ao microfone, o cliente será desconectado da sala, já que não é permitido entrar em uma sala sem transmitir o fluxo da câmera.
Importante: O Vonage Video Express 1.0 suporta atualmente 25 participantes simultâneos em uma sala. Se você adicionar mais de 25 pessoas a uma sessão, será necessário garantir que o desempenho da rede e do hardware dos participantes seja suficiente.
Sair de uma sala
Para sair da sala, feche a janela do navegador ou ligue para o leave() método do
objeto Room:
room.leave();
Detectar quando o cliente local sai da sala
O objeto `Room` dispacha um disconnected evento que ocorre quando o cliente
sai da sala:
room.on('disconnected', (reason) => {
console.log('disconnected reason: ', reason);
// Can use this event to update visual indicator for connection status
});
O evento emite reason string que identifica o motivo pelo qual o cliente se desconectou.
O objeto `Room` dispacha reconnecting e reconnected eventos que ocorrem se o cliente
perder a conexão com a sala e se reconectar:
// You can use these event to update a UI indicator for connection status
room.on('reconnecting', () => {
console.log('Temporarily disconnected.');
});
room.on('reconnected', () => {
console.log('Reconnected.');
});
Detectar quando outros clientes entram e saem da sala
O objeto `Room` dispacha um participantJoined evento em que outro participante (que não seja
o usuário local) entra na sala:
room.on('participantJoined', (participant) => {
console.log('participant joined: ', participant.name);
});
O evento emite um objeto Participant que identifica o participante que entrou na sessão. Veja a documentação de referência.
O objeto `Room` dispacha um participantLeft evento que ocorre quando um participante (que não seja o
usuário local) sai da sala:
room.on('participantLeft', (participant, reason) => {
console.log('participant left: ', participant.name);
console.log('reason: ', reason);
});
O evento emite um objeto Participant que identifica o participante que saiu
e um reason string que indica o motivo da saída do cliente.
Veja a documentação de referência.
Detectar quando outros clientes publicam transmissões de câmera
Quando outros usuários publicam transmissões de câmera, o gerenciador de layout do Video Express adiciona automaticamente o vídeo à página HTML.
Um objeto Participant despacha um cameraCreated evento que ocorre quando um participante (não
o usuário local) publica um fluxo de câmera:
participant.on('cameraCreated', (cameraSubscriber) => {
console.log('new camera stream for ', participant.name);
});
O evento emite um CameraSubscriber objeto. O objeto CameraSubscriber inclui métodos para ativar e desativar a reprodução de áudio e vídeo no cliente local (consulte Ativando e desativando o áudio e o vídeo de um assinante de câmera).
Um objeto Participant despacha um cameraDestroyed evento que ocorre quando um participante (não
o usuário local) interrompe a transmissão de uma câmera:
participant.on('cameraDestroyed', () => {
console.log('camera destroyed for ', participant.name);
});
Interface do usuário e layout
O Video Express inclui um gerenciador de layout que organiza automaticamente os elementos de vídeo no DOM HTML e ajusta o layout em telas de dispositivos móveis. O gerenciador de layout destaca automaticamente os participantes ativos em uma sala. O layout se ajusta automaticamente para ampliar a imagem dos participantes ativos. O gerenciador de layout amplia automaticamente o vídeo compartilhado na tela, caso haja um.
O gerenciador de layout colocará um vídeo de compartilhamento de tela no bloco maior do layout, mesmo que a opção “palestrante ativo” esteja ativada.
Você pode definir o screenPublisherContainer e cameraPublisherContainer
opções do Room() estrutura para que os vídeos publicados pelo cliente local
— sejam eles de câmera ou de compartilhamento de tela — apareçam fora da interface do usuário do gerenciador de layout.
Em um dispositivo móvel, o gerenciador de layout exibe apenas 4 vídeos de câmera. Além disso, os vídeos de compartilhamento de tela e do palestrante ativo
ocupam toda a tela em um dispositivo móvel. Você pode usar o participantJoined
e participantLeft eventos disparados pelo objeto Room para exibir um indicador personalizado na interface do usuário que mostre
o número total de participantes em uma sala.
Por padrão, o gerenciador de layout determina automaticamente se um cliente está sendo executado em um
dispositivo móvel, com base no agente do usuário do cliente. O managedLayoutOptions parâmetro do
Construtor Room()
inclui um opcional deviceLayoutMode propriedade. Defina-a como "desktop" ou "mobile" para
definir explicitamente o layout do dispositivo.
Opções de layout
Existem dois layouts:
-
grid— Os vídeos estão dispostos em um layout em grade. -
active-speaker— O orador ativo (o participante que está falando no momento) é automaticamente destacado em um elemento DOM maior.
O Room() O construtor inclui um managedLayoutOptions parâmetro que permite definir o
layout ao entrar em uma sala:
const room = new VideoExpress.Room({
apiKey: 'b28bcf05-b8bf-4c78-9f92-0b7435aa52ee',
sessionId: '1_this1is2my3new4session5id6',
token: 'eyJhbGciOiJIU[...]',
roomContainer: 'roomContainer',
managedLayoutOptions: {
layoutMode: 'active-speaker'
}
});
Você também pode alterar o modo de layout chamando a função Room.setLayoutMode() método:
room.setLayoutMode('grid'); // Set layout mode to grid
room.setLayoutMode('active-speaker'); // Set layout mode to active-speaker
O managedLayoutOptions parâmetro do
Construtor Room()
também inclui um opcional deviceLayoutMode propriedade. Defina-a como "desktop" ou "mobile" para
definir explicitamente o layout do dispositivo. Por padrão, o gerenciador de layout
determina automaticamente se um cliente está sendo executado em um dispositivo móvel, com base no
agente de usuário do cliente.
O opcional mediaShutoffThreshold parâmetro do
Construtor Room()
define um limite para o número atual de participantes na sala (no momento da entrada) que
impedirá que o CameraPublisher do cliente local publique áudio e vídeo.
O opcional maxVideoParticipantsOnScreen parâmetro do
Construtor Room()
define o número máximo de vídeos do CameraSubscriber exibidos simultaneamente em uma sala.
Isso afeta apenas a exibição de vídeos no cliente local.
Como alterar a câmera e o microfone utilizados
Configurando os dispositivos de áudio/vídeo do editor da câmera
// Changes the audio input device
room.camera.setAudioDevice(audioDeviceId);
// Changes the video input device
room.camera.setVideoDevice(videoDeviceId);
Obtendo os dispositivos de áudio/vídeo do provedor da câmera
// Returns the current audio input device
const currentAudioDevice = await room.camera.getAudioDevice();
// Returns the current video input device
const currentVideoDevice = room.camera.getVideoDevice();
Configurando o dispositivo de saída de áudio
Para obter uma lista dos dispositivos de saída de áudio disponíveis, chame a função VideoExpress.getAudioOutputDevices()
método:
const devices = await VideoExpress.getAudioOutputDevices();
Para obter o ID e o nome do dispositivo de saída de áudio atual, chame a função
VideoExpress.getActiveAudioOutputDevice() método:
const device = await VideoExpress.getActiveAudioOutputDevice();
console.log(device.deviceId, device.label);
Para definir o dispositivo de saída de áudio, chame a função VideoExpress.setAudioOutputDevice()
método, passando um ID de dispositivo:
const devices = await VideoExpress.setAudioOutputDevice(deviceId);
O código a seguir mostra como implementar métodos para alternar entre os dispositivos de saída de áudio disponíveis:
const currentAudioIndex;
const devices = await VideoExpress.getAudioOutputDevices;
const currentDevice = await devices.getActiveAudioOutputDevice();
devices.forEach((device, index) => {
if (device.label === currentDevice.label) {
currentAudioIndex = index;
}
});
const cycleAudioOutput = () => {
currentAudioIndex += 1;
let deviceId = devices[currentAudioIndex % devices.length].deviceId;
VideoExpress.setAudioOutputDevice(deviceId);
};
Criação de um editor de visualização
Opcionalmente, você pode configurar um elemento de visualização do editor antes de entrar na sala:
const previewPublisher = new VideoExpress.PreviewPublisher('previewContainer');
await previewPublisher.previewMedia(
publisherOptions: {
targetElement: 'previewContainer',
publisherProperties: {
resolution: '1280x720'
},
},
);
O usuário é solicitado a conceder acesso à câmera e ao microfone. Se o usuário conceder
o acesso, a promessa retornada pelo previewPublisher.previewMedia() O método é resolvido.
Caso contrário, ele é rejeitado.
Você pode usar o visualizador de pré-visualização para que o usuário selecione a câmera e o microfone antes de entrar na sala:
// Get the current audio input device
const currentAudioDevice = await previewPublisher.getAudioDevice();
// Change the audio input device
previewPublisher.setAudioDevice(audioDeviceId);
// Get the current video input device
const currentVideoDevice = previewPublisher.getVideoDevice();
// Change the video input device
previewPublisher.setVideoDevice(videoDeviceId);
Para obter uma lista dos dispositivos de entrada de áudio e vídeo disponíveis, chame a função VideoExpress.getDevices()
método:
const devices = await VideoExpress.getDevices();
O código a seguir mostra como implementar métodos para alternar entre os dispositivos de entrada de áudio e vídeo disponíveis:
let currentAudioIndex;
let currentVideoIndex;
VideoExpress.getDevices((err, devices) => {
audioInputs = devices.filter((device) => device.kind === 'audioInput');
// Find the right starting index for cycleMicrophone
audioInputs.forEach((device, index) => {
if (device.label === previewPublisher.getAudioSource().label) {
currentAudioIndex = index;
}
});
currentAudioIndex = devices
// Get all video inputs
.filter((device) => device.kind === 'audioInput')
// Find the right starting index for cycleMicrophone
.findIndex((device) => device.label === previewPublisher.getAudioSource().label);
currentVideoIndex = devices
// Get all video inputs
.filter((device) => device.kind === 'videoInput')
// Find the right starting index for cycleCamera
.findIndex((device) => device.label === previewPublisher.getVideoDevice().label);
});
const cycleMicrophone = () => {
currentAudioIndex += 1;
let deviceId = audioInputs[currentAudioIndex % audioInputs.length].deviceId;
previewPublisher.setAudioSource(deviceId);
};
const cycleCamera = () => {
currentVideoIndex += 1;
let deviceId = videoInputs[currentVideoIndex % videoInputs.length].deviceId;
previewPublisher.setVideoSource(deviceId);
};
Antes de entrar na sala, você pode excluir o editor de visualização (removendo-o da página):
previewPublisher.destroy();
Ativar e desativar vídeos publicados
Acesso ao áudio/vídeo do editor da câmera
// Check whether a camera publisher video is enabled or not:
room.camera.isVideoEnabled();
// Check whether a camera publisher audio is enabled or not:
room.camera.isAudioEnabled();
// Enable the camera publisher's video:
room.camera.enableVideo();
// Disable the camera publisher's video:
room.camera.disableVideo();
// Enable the camera publisher's audio:
room.camera.enableAudio();
// Disable the camera publisher's audio:
room.camera.disableAudio();
Ativando e desativando o áudio e o vídeo de um assinante de câmera
Esses métodos afetam o áudio e o vídeo apenas no assinante do cliente local.
// Check whether a camera subscriber's video is enabled or not:
participant.camera.isVideoEnabled();
// Check whether a camera subscriber's audio is enabled or not:
participant.camera.isAudioEnabled();
// Enable a camera subscriber's video:
participant.camera.enableVideo();
// Disable a camera subscriber's video:
participant.camera.disableVideo();
// Enable a camera subscriber's audio:
participant.camera.enableAudio();
// Disable a camera subscriber's audio:
participant.camera.disableAudio();
Configurando filtros de vídeo
Você pode definir filtros de desfoque de fundo e de substituição de fundo para um CameraPublisher vídeo
transmissão com o
CameraPublisher.setVideoFilter() método. É possível remover filtros com o
CameraPublisher.clearVideoFilter()
método.
// Applying a background blur filter
room.camera.setVideoFilter({
type: 'backgroundBlur',
blurStrength: 'high'
});
// Removing the filter
room.camera.clearVideoFilter();
Configurar imagens para quando um vídeo estiver desativado
Você pode definir a imagem de fundo de um vídeo com o setDisabledImageURI método disponível para o
CameraSubscriber,
CameraPublisher,
ScreenSubscriber,
ScreenPublisher, e
PreviewPublisher aulas.
Esta imagem aparecerá quando o vídeo estiver sem som.
const disabledImageURI = 'https://path-to.file/dog-dance.jpg';
room.camera.setDisabledImageURI(disabledImageURI);
Detecção de alto-falante ativo
O gerenciador de layout do Video Express organiza automaticamente os elementos de vídeo no DOM HTML e ajusta o layout em telas de dispositivos móveis. O gerenciador de layout destaca automaticamente os participantes ativos em uma sala. O layout se ajusta automaticamente para ampliar a imagem do participante ativo. O gerenciador de layout amplia automaticamente um vídeo de compartilhamento de tela, caso haja algum. O gerenciador de layout exibe automaticamente o participante ativo caso ele esteja oculto.
Para ativar o destaque do alto-falante ativo, defina o managedLayoutOptions.speakerHighlightEnabled opção
do Construtor Room()
para true. Para personalizar a cor do destaque, defina o managedLayoutOptions.speakerHighlightColor
opção do Room() construtor.
O objeto Room dispacha um activeSpeakerChanged evento que ocorre quando há um novo participante falando
na sala. Quando esse evento é disparado, você pode adicionar efeitos na interface do usuário com base em qual participante
está falando no momento.
room.on('activeSpeakerChanged', (participant) => {
console.log('Active speaker: ', participant.name);
});
O evento emite um objeto Participant, identificando quem está falando no momento.
Compartilhamento de tela
Para iniciar o compartilhamento de tela, ligue para o Room.startScreensharing() método:
room.startScreensharing('screenContainer')
.then(() => console.log('Started screen sharing'))
.catch((err) => console.err(err));
O método aceita um parâmetro opcional: o elemento HTML de destino que servirá como contêiner
do vídeo compartilhado na tela. Pode ser um HTMLElement ou uma string (o id do
elemento HTML). Se nenhum parâmetro for passado, o contêiner é o
screenPublisherContainer propriedade do managedLayoutOptions parâmetro passado
para o Construtor Room(), ou
para o roomContainer propriedade passada
para o Room() constructor. Se nenhuma dessas opções for especificada, o vídeo do
emissor do compartilhamento de tela é adicionado como um elemento filho do body elemento da página HTML.
O usuário é solicitado a conceder acesso à tela. Se o usuário conceder acesso à tela,
a Promise retornada pela Room.startScreensharing() O método é resolvido quando o compartilhamento de tela
é iniciado. Caso contrário, a Promise é rejeitada.
Para interromper o compartilhamento de tela, ligue para o Room.stopScreenSharing() método:
room.stopScreenSharing();
Quando o emissor do compartilhamento de tela é iniciado, um assinante correspondente desse compartilhamento é automaticamente adicionado ao gerenciador de layout na página de cada um dos demais participantes.
Acesso ao áudio/vídeo do apresentador que está compartilhando a tela
O código a seguir verifica se o vídeo do emissor no compartilhamento de tela está ativado ou não:
room.screen.isVideoEnabled();
O código a seguir verifica se o áudio do emissor no compartilhamento de tela está ativado ou não:
room.screen.isAudioEnabled();
Para ativar o vídeo do criador que está compartilhando a tela:
room.screen.enableVideo();
Para desativar o vídeo do apresentador que está compartilhando a tela:
room.screen.disableVideo();
Para ativar o áudio do apresentador que está compartilhando a tela:
room.screen.enableAudio();
Para desativar o áudio do apresentador durante o compartilhamento de tela:
room.screen.disableAudio()
Detectar quando outros clientes publicam transmissões de compartilhamento de tela
Quando outros usuários publicam transmissões com compartilhamento de tela, o gerenciador de layout do Video Express adiciona automaticamente o vídeo à página HTML.
Um objeto Participant despacha um screenCreated evento que ocorre quando o participante (não
o usuário local) publica uma transmissão de compartilhamento de tela:
participant.on('screenCreated', (screenSubscriber) => {
console.log('new screen-sharing stream for ', participant.name);
});
O evento emite um ScreenSubscriber objeto. O objeto ScreenSubscriber inclui métodos para ativar e desativar a reprodução de áudio e vídeo para a transmissão de compartilhamento de tela no cliente local (consulte Ativar e desativar o áudio e o vídeo de um participante que está compartilhando a tela).
Um objeto Participant despacha um screenDestroyed evento que ocorre quando um participante (não
o usuário local) interrompe a transmissão de uma câmera:
participant.on('screenDestroyed', () => {
console.log('screen-sharing stream destroyed for ', participant.name);
});
Ativar e desativar o áudio e o vídeo de um participante que está compartilhando a tela
// Check whether a screen-sharing subscriber video is enabled or not:
participant.screen.isVideoEnabled();
// Check whether a screen-sharing subscriber audio is enabled or not:
participant.screen.isAudioEnabled();
// Enable a screen-sharing subscriber's video:
participant.screen.enableVideo();
// Disable a screen-sharing subscriber's video:
participant.screen.disableVideo();
// Enable a screen-sharing subscriber's audio:
participant.screen.enableAudio();
// Disable a screen-sharing subscriber's audio:
participant.screen.disableAudio();
Eventos
Os eventos do Video Express utilizam o emissor de eventos padrão.
Para adicionar ouvintes de evento a um objeto, basta chamar seu on() método. Por exemplo,
o código a seguir adiciona um ouvinte para o connected envio de eventos pelo objeto
Room:
room.on('connected', () => {
console.log('Connected');
});
O on() O método recebe dois parâmetros: o nome do evento (uma string) e uma
função de retorno de chamada que é chamada quando o evento é disparado.
Em alguns eventos, os argumentos são passados para a função de retorno de chamada. Diz-se que o evento
é emitir esses objetos. Por exemplo, a Sala disconnected o evento emite um reason string:
room.on('disconnected', (reason) => {
console.log('Disconnected:', reason);
});
O Quarto participantLeft O evento emite dois objetos — um objeto Participant e um reason string:
room.on('connected', (participant, reason) => {
console.log('participant left: ', participant.name);
console.log('reason: ', reason);
});
Recursos avançados
Criptografia de ponta a ponta
Para usar a criptografia de ponta a ponta, instancie o Room objeto com um segredo de criptografia:
const room = new VideoExpress.Room({
apiKey: 'b28bcf05-b8bf-4c78-9f92-0b7435aa52ee',
sessionId: '1_this1is2my3new4session5id6',
token: 'eyJhbGciOiJIU[...]',
encryptionSecret: 'this-is-a-secret',
});
Depois que uma sala é criada com um segredo de criptografia, ela pode ser atualizada para usar um novo segredo chamando a função Room.setEncryptionSecret(encryptionSecret) método:
room.setEncryptionSecret('this-is-a-secret');
Observação: A criptografia de ponta a ponta precisa ser habilitada primeiro por meio dos SDKs do servidor. Consulte o Guia do desenvolvedor do Video Express.
Sinalização
Depois de entrar em uma sala, você pode usar o Room.signal() método para enviar
um sinal a um ou mais participantes na sala.
O código a seguir envia um sinal a todos os participantes da sala:
room.signal({
data: 'hello.'
});
O código a seguir envia um sinal para um participante específico da sala:
room.signal({
to: participant, // this is a Participant object
data: `hello ${participant.name}.`
});
Você pode incluir um type propriedade do sinal options para ajudar a identificar
o sinal:
room.signal({
type: 'greeting',
data: `hello.`
});
Quando um sinal é recebido, o objeto Room despacha um signal evento, que
emite um objeto SignalEvent que define o sinal:
room.on('signal', (signalEvent) => {
console.log(`Signal received from ${signalEvent.from}. Data: ${signalEvent.data}.`);
});
Quando um sinal que inclui um type assim que é recebido, o objeto Room despacha um signal:type evento,
que emite um objeto SignalEvent que define o sinal:
room.on('signal:greeting', (signalEvent) => {
console.log(`Signal received from ${signalEvent.from}. Data: ${signalEvent.data}.`);
});
Para obter mais informações, consulte o Room.signal() e o sinal e sinal: eventos no vídeo Documentação de referência rápida. Consulte também o Visão geral da sinalização.
Como definir uma URL de proxy
Com o recurso de proxy de IP, os clientes encaminham todo o tráfego da Internet (exceto transmissões de mídia) por meio do seu servidor proxy. O tráfego que não é de mídia inclui a comunicação com os servidores da Video API e a infraestrutura de registro.
O recurso de proxy de IP está disponível como um recurso adicional.
O código a seguir define a URL do servidor proxy IP. Chame-o antes de chamar o Room()
construtor:
VideoExpress.setProxyUrl('https://123.123.123.123:8080');
Para obter mais informações, consulte o Guia do desenvolvedor de proxy IP.
Utilização de servidores TURN personalizados
O recurso configurável do servidor TURN está disponível como um recurso adicional. Para configurar os servidores TURN utilizados pelo cliente Video Express,
defina as opções do iceConfig propriedade do options parâmetro do
Construtor Room().
Para obter mais informações, consulte o Guia do desenvolvedor do servidor TURN configurável.
Utilização dos dados de conexão
Ao chamar a função para entrar em uma sala do Video Express, você passa um token de conexão. Um token
pode conter uma string de dados de conexão opcional, com metadados. Você pode acessar esses dados
com o
Room.participantConnectionData e
Participant.connectionData
propriedades.
Código do lado do servidor (Node.js)
Este exemplo mostra como adicionar dados de conexão ao gerar um token usando o SDK do OpenTok para Node.js:
// Generating token from your server
const token = opentok.generateToken(sessionId, {
role: 'moderator',
data: '{"disabledImageURI":"https://path-to.file/jason.jpg"}',
});
Código do lado do cliente (Video Express)
// Setting a participant's disabledImageURI with data from token
participant.on('cameraCreated', (cameraSubscriber) => {
// connectionData is a JSON string from some your server
const { connectionData } = participant;
const { disabledImageURI } = JSON.parse(connectionData);
cameraSubscriber.setDisabledImageURI(disabledImageURI);
});
Para obter mais informações, consulte Visão geral da criação de tokens.
Como usar o Video Express no ambiente Enterprise
Atualmente, o Vonage Video Express oferece apenas um ambiente Padrão. No entanto, é possível utilizar projetos Enterprise com o Video Express. Isso garante que o Video Express utilize a infraestrutura da Vonage, servidores de sinalização e de mídia dedicados a Applications de parceiros que utilizam o ambiente Enterprise. Isso proporciona maior estabilidade diante de mudanças e maior resiliência contra picos de carga na plataforma.
Como usar o Video Express em aplicativos móveis
Veja o Demonstração do Vonage Video Express para iOS e Android aplicativo no GitHub. Esse aplicativo utiliza o Video Express em visualizações da web (como o WKWebView no iOS e o WebView no Android) para aplicativos móveis.
Problemas conhecidos e limitações
O Vonage Video Express funciona com base no OpenTok.js, a Video API do Vonage para JavaScript. Todos os clientes que se conectarem a uma sala do Vonage Video Express devem usar o Vonage Video Express. O uso de outros SDKs de cliente da Video API do Vonage (incluindo clientes web desenvolvidos diretamente com as APIs do OpenTok.js) pode desativar alguns recursos do Vonage Video Express.
Existem algumas limitações dos recursos do OpenTok.js e da plataforma Video API que o Vonage Video Express não oferece suporte:
-
O Video Express não é compatível com grandes transmissões interativas porque, atualmente, o Video Express exige que todos os clientes que entram em uma sala transmitam um fluxo de câmera.
-
O Video Express pode demorar um pouco mais para se conectar quando usado com o
Lista de IPs permitidos Recurso. O Video Express tem como objetivo simplificar a experiência do desenvolvedor. Por esse motivo, o Video Express tentará baixar os arquivos de configuração por meio de uma CDN (que pode estar bloqueada pelo seu firewall) antes de utilizar os endereços da lista de IPs permitidos. Não é possível especificar que um cliente utilize apenas os endereços IP permitidos (como seria o caso com oipWhitelistopção no OpenTok.jsOT.initSession()(método). Um cliente do Video Express pode demorar um pouco mais para se conectar do que um cliente que utilize o OpenTok.js configurado com oipWhitelistopção definida comotrueao usar Lista de IPs permitidos com firewalls que bloqueiam redes de distribuição de conteúdo.
Participantes no Video Express correspondem a conexões. As transmissões da câmera
e do compartilhamento de tela no Video Express correspondem a correntes. Os dados e eventos
relacionados a conexões e fluxos são exibidos em ferramentas de desenvolvimento como o Inspector,
o Insights e outros. O Video Express fornece IDs de conexão, por meio de
Participant.id, Room.participantId, e as chaves de Room.participants,
que podem ser usados para identificar usuários específicos para conexão e eventos e dados de transmissão.
Alguns recursos que exigem IDs de conexão e de transmissão não são compatíveis com o Video Express.
Entre eles estão:
-
A maioria Recursos de moderação. No entanto, você pode usar o método da API REST para forçar o silenciamento do áudio em todas as transmissões de uma sala do Video Express (embora não seja possível incluir uma lista de IDs de transmissões a serem excluídas). Mais recursos de moderação do Video Express serão lançados em breve.
-
Seleção dos fluxos a serem incluídos em um arquivo ou transmissão ao vivo.
-
Alterando a classe de layout para um arquivo ou transmissão ao vivo que utiliza um layout personalizado.
O Vonage Video Express não oferece acesso ao OpenTok.js subjacente
Editora e
Assinante objetos. Portanto, não é possível usar o
getStats() e getRtcStatsReport() métodos desses objetos.
O Video Express otimiza automaticamente a taxa de quadros e a resolução de todos os fluxos de vídeo, de modo que não há necessidade de chamar
o setPreferredFrameRate() e setPreferredResolution() métodos para um assinante ou editor.
Para obter detalhes sobre problemas conhecidos e problemas corrigidos, consulte o Notas de lançamento do Vonage Video Express.