Vídeo escalável
O vídeo escalável é um recurso para sessões roteadas que melhora a qualidade do vídeo em sessões com vários participantes, permitindo que cada assinante receba uma qualidade de vídeo adequada às suas condições atuais de rede — independentemente dos demais assinantes.
Sem o vídeo escalável, o Media Router encaminha a mesma qualidade de vídeo para todos os assinantes de uma transmissão. Quando a conexão de um assinante fica instável, o roteador usa a estimativa de largura de banda para solicitar ao editor que reduza a taxa de bits — o que diminui a qualidade para todos os assinantes daquela transmissão. Com o vídeo escalável ativado, o roteador seleciona a camada de qualidade mais adequada para cada assinante de forma independente e em tempo real, sem afetar o que os outros assinantes recebem.
O vídeo escalável requer um sessão encaminhada (uma sessão que utiliza o Media Router). Ela não está disponível em sessões retransmitidas e não seria útil nesse contexto, uma vez que os fluxos trafegam diretamente entre os clientes, sem nenhum roteador no caminho para selecionar ou alternar entre camadas de qualidade. Consulte O Media Router e os modos de mídia.
O vídeo escalável está ativado por padrão. A configuração no nível do aplicativo é, por padrão, Auto, o que significa que o Media Router ativa o vídeo escalável automaticamente quando há mais de dois clientes em uma sessão e todas as outras condições são atendidas. Você também pode configurá-lo para Em (sempre ativo) ou Desligado — veja Configuração no nível do aplicativo para mais detalhes. Na maioria das aplicações, não é necessário fazer alterações no código.
Codecs e modelos de escalabilidade
O funcionamento do vídeo escalável depende do codec negociado pelo provedor. Compreender as diferenças ajuda você a escolher o codec certo para o seu caso de uso, como quando é necessário otimizar o uso da CPU do provedor, a largura de banda de envio ou a adaptação da qualidade do lado do assinante.
VP8: Transmissão simultânea
Com VP8, o vídeo escalável é implementado por meio de transmissão simultânea. A emissora codifica e transmite vários fluxos de bits totalmente independentes, com diferentes resoluções e taxas de quadros — por exemplo, 1080p, 540p e 270p, cada um com suas próprias camadas temporais (taxa de quadros). Cada fluxo é independente e pode ser decodificado separadamente.
Como cada fluxo é totalmente independente, o Media Router pode alternar instantaneamente qualquer assinante para um nível de qualidade diferente, sem necessidade de recodificação — proporcionando grande resiliência às mudanças nas condições da rede.
Compromisso: A codificação e o envio de múltiplas transmissões exigem mais recursos da CPU e largura de banda de envio do lado do editor do que o envio de uma única qualidade. As camadas de resolução mais baixa são significativamente mais econômicas de codificar do que a qualidade mais alta, mas o custo total ainda é maior do que o de uma transmissão não simultânea.
VP9: Codificação de Vídeo Escalável (SVC)
Com VP9, usos do vídeo escalável Codificação Escalável de Vídeo (SVC). O editor codifica um único fluxo de bits que contém várias camadas espaciais (resolução) e temporais (taxa de quadros) matematicamente incorporadas a ele. Cada camada superior depende das camadas inferiores; assim, um decodificador que receba apenas a camada base obtém baixa qualidade, enquanto aquele que receba todas as camadas obtém qualidade total — tudo a partir do mesmo fluxo de bits.
O custo de CPU do provedor para a codificação SVC é maior do que para a codificação de um único fluxo — aproximadamente comparável à transmissão simultânea em VP8 —, mas o SVC requer menos largura de banda de envio, pois há apenas um fluxo de bits a ser enviado, em vez de vários fluxos independentes. A partir do único fluxo codificado, o Media Router pode extrair e encaminhar exatamente o subconjunto correto de camadas para cada assinante, proporcionando uma adaptação de qualidade eficiente e flexível que também é mais resistente à perda de pacotes.
O SVC exige que tanto o endpoint do publisher quanto o Media Router sejam compatíveis com VP9 SVC. O Firefox é compatível com VP9, mas não com SVC — um editor do Firefox envia VP9 sem camadas, de modo que o Media Router não consegue ajustar a qualidade desse fluxo.
Para uma explicação completa sobre as camadas do SVC e os modos de escalabilidade (L1T3, L2T3, L3T3), comportamento de arquivamento e compatibilidade com dispositivos, consulte Codificação de vídeo escalável VP9 para sessões roteadas.
Principais diferenças em resumo
| Aspecto | Transmissão simultânea (VP8) | SVC (VP9) |
|---|---|---|
| O que a editora envia | Vários fluxos de bits independentes com diferentes resoluções e taxas de quadros (SSRCs/RIDs distintos) | 1 fluxo de bits com camadas espaciais e temporais incorporadas (SSRC único) |
| Camadas espaciais | Multifluxo: cada resolução é um fluxo codificado separado | Incorporado em um único fluxo de bits |
| Camadas temporais | Cada transmissão simultânea pode incluir camadas temporais | Incorporado em um único fluxo de bits |
| Função do Media Router | Escolha qual transmissão deseja encaminhar | Extraia e encaminhe as camadas corretas |
| Suporte a editores no Firefox | Compatível com codificações baseadas em RID | VP9 sim; SVC não é compatível com o Firefox |
Índice de resolução da camada espacial: Cada passo espacial utiliza um Relação de resolução de 2:1. Um L3T3 O stream possui camadas com 100%, 50% e 25% da resolução da fonte (por exemplo, 1080p → 540p → 270p). É por isso que setPreferredResolution() podem ser direcionados para resoluções substancialmente diferentes.
H.264: Vídeo escalável não é compatível
O codec H.264 é totalmente compatível com a Video API da Vonage para publicação e assinatura, mas O vídeo escalável não está disponível para transmissões em H.264. O Media Router não pode alternar entre camadas de qualidade para fluxos H.264, e as configurações de vídeo escalável não surtem efeito quando o H.264 é negociado. Se o seu aplicativo exigir vídeo escalável, use VP8 ou VP9 em vez disso. Consulte Codecs de vídeo.
Suporte a vídeo escalável
O vídeo escalável é compatível com a transmissão simultânea em VP8 e com o VP9 SVC. Não é compatível com Fluxos H.264. Está disponível apenas em sessões encaminhadas.
Os seguintes clientes oferecem suporte a vídeo escalável:
- SDK da Web — Chrome, Firefox, Safari, Samsung Internet, WebView no Android, WebView no iOS e o Edge baseado no Chromium. Observação: o Firefox oferece suporte à transmissão simultânea em VP8, mas não ao VP9 SVC.
- SDK do Android (em dispositivos compatíveis)
- SDK do iOS (em dispositivos compatíveis)
- SDK do Windows
- SDK do Linux
- SDK do macOS
- SDK do React Native (em dispositivos compatíveis)
Para obter detalhes sobre a compatibilidade do VP9 SVC com dispositivos e navegadores, consulte Codificação de vídeo escalável VP9 para sessões roteadas.
Observação: Por padrão, o vídeo escalável está desativado para transmissões de compartilhamento de tela e ativado para transmissões de câmera e de fontes de vídeo personalizadas. Para ativar o vídeo escalável para o compartilhamento de tela, consulte Transmissões escaláveis de compartilhamento de tela.
Como usar o vídeo escalável
Configuração no nível do aplicativo
O vídeo escalável possui três modos que você pode definir por aplicação no Painel do Vonage:
- Faça login na sua Account da Video API da Vonage.
- No menu à esquerda, selecione Applications.
- Para uma aplicação já instalada, clique no menu com os três pontos e selecione Editar. Para uma nova inscrição, acesse a seção de qualificações após clicar em Criar um novo aplicativo.
- Ative o botão para habilitar o Vídeo opção.
- Role a página para baixo e clique Mostrar recursos avançados.
- Sob Vídeo escalável, escolha uma das seguintes opções:
- Auto (recomendado) — O Media Router permite a exibição de vídeo escalável quando há mais de dois clientes em uma sessão. Deixe essa opção selecionada, a menos que tenha um motivo específico para alterá-la.
- Em — O vídeo escalável está sempre ativado (em clientes compatíveis) para todas as sessões neste aplicativo.
- Desligado — O vídeo escalável está desativado para todas as sessões neste aplicativo. Use essa opção para fixar a resolução e a taxa de quadros, ou para reduzir o uso de CPU e largura de banda pelo editor.
- Clique Salvar alterações.
Observação: Essa configuração controla Transmissão simultânea em VP8 comportamento. O VP9 sempre utiliza SVC quando compatível, e o H.264 não suporta vídeo escalável — nenhum dos dois é afetado por essa configuração.
Observação: As transmissões exigem mais largura de banda de envio do provedor quando o vídeo escalável está ativo, pois camadas adicionais de qualidade são codificadas e transmitidas.
Transmissões escaláveis de compartilhamento de tela
Por padrão, o vídeo escalável é desativado para transmissões com compartilhamento de tela e ativado para transmissões de câmera e fontes de vídeo personalizadas. O conteúdo compartilhado na tela geralmente muda com menos frequência do que o vídeo da câmera; portanto, o custo adicional de codificação do vídeo escalável costuma ser desnecessário. No entanto, ativá-lo pode ser benéfico em sessões em que os participantes do compartilhamento de tela apresentam condições de rede variáveis. É possível substituir a configuração padrão por editor:
| SDK | Método / Propriedade |
|---|---|
| SDK da Web | scalableScreenshare opção em OT.initPublisher() |
| SDK do Android | PublisherKit.Builder.scalableScreenshare() |
| SDK do iOS | OTPublisherKitSettings.scalableScreenshare |
| SDK do Windows | Publisher.Builder.ScalableScreenshare |
| SDK do Linux | otc_publisher_settings_set_scalable_screenshare() |
Como a sugestão de conteúdo afeta as camadas de compartilhamento de tela
Quando o vídeo escalável está habilitado para uma transmissão de compartilhamento de tela em VP8 em uma sessão roteada, o dica sobre conteúdo em vídeo A configuração que você define para o emissor determina como ele estrutura as camadas de transmissão simultânea que envia. É por isso que o número de fluxos (SSRCs) que você observa para um emissor de compartilhamento de tela em uma ferramenta como chrome://webrtc-internals depende da dica de conteúdo:
-
detailoutext— O editor é otimizado para preservar os detalhes finos e a legibilidade (texto, desenhos lineares, conteúdo estático). Ele envia dois fluxos com a mesma resolução espacial que diferem apenas na taxa de quadros: um fluxo em resolução total na taxa de quadros normal e um segundo fluxo em resolução total com uma taxa de quadros mais baixa. Isso mantém o conteúdo compartilhado nítido e legível, ao mesmo tempo em que oferece ao Media Router uma camada com taxa de bits mais baixa para ser utilizada como alternativa quando a rede do assinante se deteriora — de modo que a deterioração reduza a taxa de quadros, em vez de desfocar os detalhes. Duas camadas em resolução total proporcionam um bom equilíbrio entre a resiliência durante a degradação e a manutenção da resolução detalhada original. -
motion— O editor otimiza para garantir um movimento suave (por exemplo, durante a reprodução de vídeos compartilhados). Ele funciona como uma transmissão simultânea de câmera, enviando vários fluxos em diferentes resoluções espaciais, de modo que o Media Router possa reduzir a resolução para um assinante a fim de manter a fluidez dos movimentos em condições de rede limitadas.
Escolha a sugestão de conteúdo que melhor corresponda ao seu conteúdo compartilhado: detail ou text prioriza manter os detalhes nítidos (reduzindo a taxa de quadros em primeiro lugar), enquanto motion prioriza a fluidez do movimento (reduzindo primeiro a resolução).
Observação: Esse comportamento da camada se aplica a transmissões simultâneas de compartilhamento de tela em VP8. Defina a dica de conteúdo por meio do videoContentHint opção em OT.initPublisher() ou o publisher.setVideoContentHint() método — consulte Dicas sobre conteúdo em vídeo.
Configuração da taxa de quadros e da resolução preferidas pelo assinante
Quando uma transmissão é publicada com vídeo escalável, os assinantes podem indicar ao Media Router a qualidade de sua preferência. O Media Router seleciona a camada disponível mais próxima que se adapte às condições reais de rede do assinante.
Importante: Chamando setPreferredResolution() ou setPreferredFrameRate() isso desencadeia uma renegociação com o Media Router. Fazer isso repetidamente ou em rápida sucessão tem um custo elevado — consome recursos da CPU e pode prejudicar a qualidade geral da transmissão. Defina os valores preferidos uma única vez (ou apenas quando o layout do assinante sofrer alterações significativas), em vez de ajustá-los continuamente.
Aviso: Essas preferências do lado do assinante pressupõem que o editor esteja utilizando o layout padrão da camada de escalabilidade. Se o editor tiver substituído esse layout por setTargetScalabilityMode(), a camada que o Media Router encaminha pode não corresponder à resolução ou à taxa de quadros solicitada. Consulte Interação com a resolução e a taxa de quadros preferidas pelo assinante para mais detalhes.
| SDK | Taxa de quadros | Resolução |
|---|---|---|
| SDK da Web | Subscriber.setPreferredFrameRate() — veja Guia da Web sobre assinaturas de streaming |
Subscriber.setPreferredResolution() — veja Guia da Web sobre assinaturas de streaming |
| SDK do Android | SubscriberKit.setPreferredFrameRate() — veja Guia do Android sobre o `subscribe-streams` |
SubscriberKit.setPreferredResolution() — veja Guia do Android sobre o `subscribe-streams` |
| SDK do iOS | OTSubscriberKit.preferredFrameRate — veja Guia do subscribe-streams para iOS |
OTSubscriberKit.preferredResolution — veja Guia do subscribe-streams para iOS |
| SDK do Windows | Subscriber.PreferredFramerate — veja Guia do Windows sobre o subscribe-streams |
Subscriber.PreferredResolution — veja Guia do Windows sobre o subscribe-streams |
| SDK do Linux | otc_subscriber_set_preferred_frame_rate() — veja Guia do Linux sobre subscribe-streams |
otc_subscriber_set_preferred_resolution() — veja Guia do Linux sobre subscribe-streams |
| React Native | preferredFrameRate propriedade de OTSubscriber — veja Guia do React Native sobre subscribe-streams |
preferredResolution propriedade de OTSubscriber — veja Guia do React Native sobre subscribe-streams |
Como verificar se o vídeo escalável está funcionando
Não há um único indicador de “vídeo escalável ativo” no SDK, mas é possível verificar se ele está funcionando por meio das seguintes abordagens.
Inspecionador de Vídeos
O Inspecionador de Vídeos A ferramenta no módulo Métricas de Qualidade exibe o codec, a resolução e a taxa de quadros. Passe o cursor sobre qualquer ponto de uma linha traçada para visualizar o codec atualmente em uso. Quando o vídeo escalável está ativado, a resolução e/ou a taxa de quadros para um ou mais assinantes podem ser ajustadas dinamicamente em resposta às mudanças nas condições da rede.
Estatísticas do WebRTC
Cada SDK disponibiliza o relatório de estatísticas do WebRTC subjacente. Do lado do editor, verifique RTCOutboundRtpStreamStats:
- Com Transmissão simultânea em VP8, você verá vários
ssrcentradas com diferentesframeWidth/frameHeightvalores — um por camada de transmissão simultânea. - Com VP9 SVC, você verá um único
ssrccom umscalabilityModeconjunto de propriedades (por exemplo,L3T3).
Observação: Para um VP8 compartilhamento de tela transmissão publicada com o detail ou text dica de conteúdo: os dois ssrc as entradas têm o o mesmo frameWidth/frameHeight e diferem na taxa de quadros, em vez de na resolução. Veja Como a sugestão de conteúdo afeta as camadas de compartilhamento de tela.
Métodos do SDK para acessar o relatório de estatísticas:
- SDK da Web —
Publisher.getRtcStatsReport()eSubscriber.getRtcStatsReport() - Linux — consulte Obtendo estatísticas da transmissão
Lista de verificação: Condições necessárias para que o vídeo escalável esteja ativo
Caso não observe o comportamento de qualidade adaptativa, Verify o seguinte:
- A sessão é derrotado (não transmitido).
- O vídeo escalável não está configurado para Desligado no nível do aplicativo.
- O codec negociado é VP8 ou VP9 (não H.264).
- A editora está operando em um cliente compatível.
Definição do modo de escalabilidade alvo
É possível definir explicitamente o modo de escalabilidade de um emissor, controlando o número de camadas espaciais (resolução) e temporais (taxa de quadros) que o WebRTC codifica. Isso permite um controle preciso sobre o equilíbrio entre a adaptabilidade da qualidade do vídeo e o uso de recursos.
Como funciona
O modo de escalabilidade alvo é aplicado ao caminho de mídia do Media Router (editor → Media Router). Ele pode ser definido ou alterado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída, e você pode atualizá-lo dinamicamente durante uma sessão ativa, enquanto o codificador já estiver em execução. Se você chamar o método `set` antes que o caminho de mídia seja estabelecido, o SDK retém o valor e o aplica assim que a negociação do codec for concluída. Em Roteamento Adaptativo de Mídia Nas sessões (AMR), o modo é aplicado apenas ao caminho de mídia do Media Router (editor → Media Router), uma vez que os modos de escalabilidade não são utilizados quando se ignora o Media Router no caminho de mídia.
O que o alvo controla
O modo de escalabilidade de destino indica ao codificador quantas camadas espaciais (resolução) e temporais (taxa de quadros) devem ser produzidas. Isso determina diretamente quais opções de qualidade o Media Router tem à disposição ao encaminhar o vídeo para cada assinante:
- Mais camadas espaciais — o Media Router pode reduzir a resolução para assinantes com largura de banda limitada, mantendo a resolução total para os demais. Por exemplo,
L3T3oferece três níveis de resolução para o roteador escolher. - Mais camadas temporais — o Media Router pode reduzir a taxa de quadros para assinantes com largura de banda limitada, sem reduzir a resolução. Por exemplo,
L1T3mantém a resolução total o tempo todo, mas oferece ao roteador três níveis de taxa de quadros para escolher — isso é ideal para conteúdos em que os detalhes são essenciais, como slides ou documentos. - Menos camadas — reduz o uso da CPU e da largura de banda do provedor, mas limita a capacidade do Media Router de ajustar a qualidade para cada assinante.
Quando a meta talvez não seja totalmente cumprida
A configuração desejada é uma preferência — o codificador a aplica quando as condições permitirem. O modo efetivamente aplicado pode diferir da sua configuração desejada nos seguintes casos:
- Limitações do codec — Se o codec negociado não for compatível com as camadas solicitadas, o modo é ajustado. Por exemplo, ao definir
L2T3com o VP8, o resultado éL1T3está sendo aplicado porque o VP8 não oferece escalabilidade espacial. Veja Solução alternativa dependente do codec. - Resolução muito baixa para as camadas espaciais solicitadas — Cada etapa da camada espacial utiliza uma proporção de resolução de 2:1. Se a resolução de captura do editor for baixa demais para permitir uma subdivisão significativa (por exemplo, publicação em 320×240 com
L3T3(conforme solicitado), o codificador pode produzir menos camadas espaciais do que o solicitado, pois a camada mais baixa seria pequena demais para ser útil. - Limitações de hardware ou de recursos — Em dispositivos com recursos limitados, o codificador pode não gerar todas as camadas solicitadas caso isso exceda os limites de CPU ou largura de banda.
Verificação do modo aplicado
O método `get` retorna o seu alvo (o que você configurou), não necessariamente o que foi aplicado. Para verificar as camadas de escalabilidade efetivamente geradas pelo codificador, use o relatório de estatísticas do WebRTC — especificamente o RTCOutboundRtpStreamStats — via getRtcStatsReport(). Para obter detalhes sobre como acessar estatísticas em diferentes plataformas, consulte Como verificar se o vídeo escalável está funcionando e Observabilidade do cliente.
Modos de escalabilidade válidos
São suportados os seguintes modos:
| Modo | Camadas espaciais | Camadas temporais | Descrição |
|---|---|---|---|
L1T1 |
1 | 1 | Resolução única, taxa de quadros única (sem escalabilidade) |
L1T2 |
1 | 2 | Resolução única, dois níveis de taxa de quadros |
L1T3 |
1 | 3 | Resolução única, três níveis de taxa de quadros |
L2T1 |
2 | 1 | Duas resoluções, uma única taxa de quadros |
L2T2 |
2 | 2 | Duas resoluções, dois níveis de taxa de quadros |
L2T3 |
2 | 3 | Duas resoluções, três níveis de taxa de quadros |
L3T1 |
3 | 1 | Três resoluções, taxa de quadros única |
L3T2 |
3 | 2 | Três resoluções, dois níveis de taxa de quadros |
L3T3 |
3 | 3 | Três resoluções, três níveis de taxa de quadros |
O formato segue o Especificação SVC do WebRTC do W3C: L<spatial>T<temporal>, onde o número após L é a contagem de camadas espaciais e o número após T é o número de camadas temporais.
Qualquer valor fora dessa lista é rejeitado com um erro. Se você nunca chamou o método `set` (por exemplo, setTargetScalabilityMode() na Web/Android ou no targetScalabilityMode propriedade no iOS/Windows), o método get correspondente retorna um valor vazio ou nulo (dependendo da plataforma) — isso ocorre porque o modo de escalabilidade é um alvo Apenas uma preferência, não um padrão gerenciado internamente. O SDK não define um destino padrão por você; portanto, até que você defina um explicitamente, não há nenhum valor a ser retornado.
Solução alternativa dependente do codec
O modo que, na verdade, é aplicado depende do codec negociado no caminho de mídia do Media Router:
- Codecs compatíveis com SVC (VP9) — o modo solicitado é aplicado tal como está. Esses codecs oferecem suporte nativo tanto às camadas de escalabilidade espacial quanto às de escalabilidade temporal.
- VP8 — O VP8 suporta apenas escalabilidade temporal, sem camadas espaciais; as qualidades espaciais são tratadas por meio da publicação de múltiplos fluxos em diferentes resoluções (transmissão simultânea). O modo aplicável mais próximo é obtido preservando a dimensão temporal e forçando as camadas espaciais a 1. Por exemplo, se você definir
L2T2e o VP8 é negociado,L1T2é aplicada. - H.264 — O vídeo escalável não é compatível com o H.264 nesta Video API; portanto, o comportamento alternativo descrito acima não se aplica a fluxos H.264.
O método `get` sempre retorna o que você definiu explicitamente (sua intenção), independentemente do que foi efetivamente aplicado após o fallback dependente do codec. Por exemplo, se você definir L2T3 e, caso o VP8 seja negociado, o Media Router aplica L1T3 (já que o VP8 não possui camadas espaciais), mas o método get ainda retorna L2T3 — refletindo sua meta original, e não o modo efetivo.
Interação com a resolução e a taxa de quadros preferidas pelo assinante
A lógica de seleção de camada do Media Router para Subscriber.setPreferredResolution() e Subscriber.setPreferredFrameRate() é construído com base no layout padrão da camada de escalabilidade. Quando um emissor define um modo de escalabilidade alvo diferente do padrão, as camadas espaciais e/ou temporais efetivamente produzidas pelo codificador deixam de corresponder ao que o Media Router presume estar disponível, e a camada que o roteador encaminha a um assinante pode não corresponder à resolução ou à taxa de quadros solicitadas por esse assinante.
Aviso: Quando um editor substitui o modo de escalabilidade com setTargetScalabilityMode() (ou a propriedade equivalente no iOS/Windows), os assinantes que ligarem setPreferredResolution() ou setPreferredFrameRate() na transmissão dessa emissora não garantirá necessariamente a resolução ou a taxa de quadros solicitadas. Por exemplo, ao solicitar uma resolução preferencial mais baixa com setPreferredResolution() pode não surtir efeito se o modo escolhido pelo editor não expor uma camada espacial correspondente, e uma taxa de quadros preferencial pode ser mapeada para uma camada temporal diferente da esperada. Se o seu aplicativo depende de que a seleção da resolução/taxa de quadros preferencial no lado do assinante funcione de maneira previsível, mantenha o modo de escalabilidade de destino em seu valor padrão.
Uso de APIs específicas da plataforma
O objeto Publisher inclui setTargetScalabilityMode() e getTargetScalabilityMode() métodos.
Definição do modo de escalabilidade alvo
Ligar setTargetScalabilityMode() em um objeto Publisher para definir o modo de escalabilidade de destino. O método aceita uma string que identifica o modo desejado:
publisher.setTargetScalabilityMode('L3T3');
Esse método pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
O método gera um erro se o modo solicitado não for válido (ou seja, se não for um dos L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode('L3T3');
} catch (err) {
console.error('Invalid scalability mode:', err.message);
}
Obtendo o modo de escalabilidade alvo
Ligar getTargetScalabilityMode() para recuperar o valor que foi definido explicitamente. Ela retorna undefined se o setter nunca tiver sido chamado:
const mode = publisher.getTargetScalabilityMode();
console.log(mode); // 'L3T3' or undefined
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
O PublisherKit A classe inclui setTargetScalabilityMode() e getTargetScalabilityMode() métodos.
Definição do modo de escalabilidade alvo
Ligar setTargetScalabilityMode() em uma instância do PublisherKit para definir o modo de escalabilidade de destino:
publisher.setTargetScalabilityMode("L3T3");
Esse método pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
O método lança uma OpenTokException se o modo solicitado não for válido (ou seja, não for um dos L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try {
publisher.setTargetScalabilityMode("L3T3");
} catch (OpenTokException e) {
Log.e(TAG, "Invalid scalability mode: " + e.getMessage());
}
Obtendo o modo de escalabilidade alvo
Ligar getTargetScalabilityMode() para recuperar o valor que foi definido explicitamente. Ela retorna null se o setter nunca tiver sido chamado:
String mode = publisher.getTargetScalabilityMode();
// "L3T3" or null
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
O OTPublisherKit A classe inclui o targetScalabilityMode propriedade.
Definição do modo de escalabilidade alvo
Defina o targetScalabilityMode propriedade em uma instância do OTPublisherKit para definir o modo de escalabilidade de destino:
try publisher.setTargetScalabilityMode("L3T3")
O setter pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
O levantador levanta uma OTError se o modo solicitado não for válido (ou seja, não for um dos L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
Obtendo o modo de escalabilidade alvo
Leia o targetScalabilityMode propriedade para recuperar o valor que foi definido explicitamente. Ela retorna nil se o setter nunca tiver sido chamado:
let mode = publisher.targetScalabilityMode
// "L3T3" or nil
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
O OTPublisherKit A classe inclui o targetScalabilityMode propriedade.
Definição do modo de escalabilidade alvo
Defina o targetScalabilityMode propriedade em uma instância do OTPublisherKit para definir o modo de escalabilidade de destino:
NSError *error = nil;
[publisher setTargetScalabilityMode:@"L3T3" error:&error];
O setter pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
O levantador levanta uma OTError se o modo solicitado não for válido (ou seja, não for um dos L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3).
Obtendo o modo de escalabilidade alvo
Leia o targetScalabilityMode propriedade para recuperar o valor que foi definido explicitamente. Ela retorna nil se o setter nunca tiver sido chamado:
NSString *mode = publisher.targetScalabilityMode;
// @"L3T3" or nil
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
O Publisher A classe inclui o TargetScalabilityMode propriedade.
Definição do modo de escalabilidade alvo
Defina o TargetScalabilityMode propriedade em uma instância de Publisher para definir o modo de escalabilidade desejado:
publisher.TargetScalabilityMode = "L3T3";
O setter pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
O levantador lança uma OpenTokException se o modo solicitado não for válido (ou seja, não for um dos L1T1, L1T2, L1T3, L2T1, L2T2, L2T3, L3T1, L3T2, L3T3):
try
{
publisher.TargetScalabilityMode = "L3T3";
}
catch (OpenTokException e)
{
Console.WriteLine("Invalid scalability mode: " + e.Message);
}
Obtendo o modo de escalabilidade alvo
Leia o TargetScalabilityMode propriedade para recuperar o valor que foi definido explicitamente. Ela retorna null se o setter nunca tiver sido chamado:
string mode = publisher.TargetScalabilityMode;
// "L3T3" or null
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
O SDK em C inclui otc_publisher_set_target_scalability_mode() e otc_publisher_get_target_scalability_mode() funções.
Definição do modo de escalabilidade alvo
Ligar otc_publisher_set_target_scalability_mode() para definir o modo de escalabilidade desejado para um editor:
otc_status status = otc_publisher_set_target_scalability_mode(publisher, "L3T3");
if (status != OTC_SUCCESS) {
printf("Failed to set scalability mode\n");
}
Esse método pode ser chamado a qualquer momento — não é necessário que a negociação do caminho de mídia tenha sido concluída. O modo será aplicado assim que o caminho de mídia do Media Router for estabelecido.
A função retorna OTC_INVALID_PARAM se:
- O ponteiro do editor é
NULL - A string do modo de escalabilidade é
NULL - O modo solicitado não é válido (ou seja, não é um dos
L1T1,L1T2,L1T3,L2T1,L2T2,L2T3,L3T1,L3T2,L3T3)
Obtendo o modo de escalabilidade alvo
Ligar otc_publisher_get_target_scalability_mode() para recuperar o valor que foi definido explicitamente. Ela retorna NULL se o setter nunca tiver sido chamado:
const char* mode = otc_publisher_get_target_scalability_mode(publisher);
if (mode != NULL) {
printf("Target scalability mode: %s\n", mode);
}
Observação: O getter retorna a intenção do usuário, e não o modo efetivamente aplicado. Quando um codec que não seja SVC (VP8 ou H.264) é negociado, o modo aplicado pode ser diferente (as camadas espaciais são limitadas a 1).
Equívocos comuns e perguntas frequentes
O vídeo escalável é a mesma coisa que o VP9 SVC?
Não. “Vídeo escalável” é o nome do recurso da Video API da Vonage. O mecanismo técnico depende do codec:
- VP8 implementa vídeo escalável por meio de transmissão simultânea — a editora envia vários fluxos independentes.
- VP9 implementa vídeo escalável por meio de SVC — o editor envia um fluxo com camadas incorporadas.
Ambos os mecanismos permitem que o Media Router ajuste a qualidade que cada assinante recebe. Quando a documentação menciona “vídeo escalável” sem especificar um codec, ela se refere ao recurso como um todo.
A definição de um codec preferencial ativa o vídeo escalável?
Não. A seleção de um codec preferencial (no painel de controle ou por meio do preferredVideoCodecs (opção do editor) é independente do vídeo escalável. A ativação do vídeo escalável depende de todos os seguintes fatores:
- Configuração do recurso de vídeo escalável (Ligado / Desligado / Automático).
- A sessão está sendo encaminhada.
- O codec negociado compatível com vídeo escalável (VP8 ou VP9 — não H.264).
- O cliente do editor ou o navegador que oferece suporte a vídeo escalável.
Por que é que Subscriber.setPreferredResolution() Não está garantindo a qualidade?
O lado do assinante setPreferredResolution() e setPreferredFrameRate() são dicas para o Media Router, e não comandos diretos ao codificador da emissora. O Media Router só pode agir com base nessas sugestões quando estiver selecionando ativamente entre camadas de vídeo escaláveis para aquele assinante. Se qualquer uma das seguintes condições for verdadeira, não haverá camadas para selecionar e as sugestões não terão efeito:
- O vídeo escalável está desativado no nível do aplicativo ou no stream do editor.
- O codec negociado é o H.264 (vídeo escalável não é compatível).
- O cliente do editor não gera camadas escaláveis (por exemplo, um editor do Firefox que envia VP9 sem camadas SVC).
- O editor está com restrições de CPU ou largura de banda e não está enviando camadas superiores para que o roteador possa selecionar.
- A editora definiu um modo de escalabilidade não padrão por meio de
setTargetScalabilityMode()— a seleção de camadas do Media Router é baseada no layout padrão; portanto, as preferências do assinante podem não corresponder à camada que ele espera. - A sessão é retransmitida — em uma sessão retransmitida, o Media Router não encaminha os fluxos, portanto, a seleção de camada não pode ocorrer. Observe que, em sessões retransmitidas (P2P), o codificador do emissor adapta sua saída diretamente com base nas condições de rede do assinante, mas isso não é o mesmo que a seleção de camada de vídeo escalável.
Observação: Em sessões retransmitidas, alguns SDKs ainda podem aceitar essas chamadas de API sem gerar erros, mas o Media Router não está envolvido no encaminhamento do fluxo; portanto, as preferências não podem ser respeitadas na seleção da camada de qualidade.
Observação: As APIs de resolução e taxa de quadros do lado do editor (quando disponíveis em determinados SDKs) funcionam de maneira diferente — elas controlam diretamente a resolução e a taxa de quadros do fluxo codificado, e não uma sugestão de qualidade do Media Router.
Posso misturar editores escaláveis e não escaláveis na mesma sessão?
Sim. O vídeo escalável é definido por fluxo, e não por sessão. Uma sessão pode conter simultaneamente emissores que utilizam vídeo escalável e emissores que não o utilizam (por exemplo, emissores H.264 ou clientes que transmitem com o vídeo escalável desativado). O Media Router processa cada fluxo de forma independente.
O vídeo escalável afeta o arquivamento?
Para Transmissão simultânea em VP8, o programa de compactação grava usando a camada de qualidade mais alta disponível.
Para VP9 SVC, os arquivos individuais armazenam o fluxo de cada participante no formato WebM com codificação VP9 SVC. Os arquivos compostos são sempre transcodificados para MP4 com H.264/AAC, independentemente do codec da sessão.
A reprodução de arquivos WebM no formato VP9 SVC pode não funcionar em todos os reprodutores de mídia. Para obter instruções de reprodução e comandos de transcodificação, consulte Notas sobre arquivamento no guia do VP9.
Para obter mais informações, consulte este artigo de suporte.