Otimizações de streaming em tempo real do IVS
Para garantir que seus usuários tenham a melhor experiência possível ao transmitir e visualizar vídeos usando o streaming em tempo real do IVS, existem diversas maneiras de aprimorar ou otimizar partes da experiência usando os recursos que oferecemos hoje.
Introdução
Ao otimizar a qualidade da experiência de um usuário, é importante considerar a experiência desejada, que pode mudar dependendo do conteúdo que está sendo assistido e das condições da rede.
Ao longo deste guia, focamos nos usuários que são publicadores de streams ou inscritos em streams, e consideramos as ações e as experiências desejadas por esses usuários.
Os SDKs do IVS permitem que você configure a taxa máxima de bits, a taxa de quadros e a resolução do fluxo. Quando há congestionamento de rede para os publicadores, o SDK se adapta automaticamente e reduz a qualidade do vídeo, diminuindo a taxa de bits, a taxa de quadros e a resolução. No Android e no iOS, é possível selecionar a preferência de degradação quando houver congestionamento. O mesmo comportamento é verdadeiro se você habilitar a codificação em camadas com simulcast ou manter a configuração padrão.
Streaming adaptável: codificação em camadas com a transmissão simultânea
Esse recurso é compatível somente nas seguintes versões do cliente:
-
iOS e Android 1.18.0+
-
Web 1.12.0+
Ao usar SDKs de transmissão em tempo real do IVS, os publicadores podem codificar várias camadas de vídeo, e os assinantes se adaptam ou alteram automaticamente para a qualidade mais adequada para as suas redes. Nós chamamos isso de codificação em camadas com a transmissão simultânea.
A codificação em camadas com a transmissão simultânea é compatível com Android e iOS e em navegadores de área de trabalho Chrome e Edge (para Windows e macOS). Não oferecemos suporte à codificação em camadas em outros navegadores.
No diagrama abaixo, o host está enviando três qualidades de vídeo (nomeadamente: alta, média e baixa). O IVS encaminha o vídeo da mais alta qualidade para cada espectador com base na largura de banda disponível, fornecendo uma experiência ideal para cada espectador. Se a conexão de rede do Espectador 1 for alterada de boa para ruim, o IVS automaticamente começa a enviar vídeo de qualidade inferior ao Espectador 1 para que ele possa continuar assistindoao stream ininterruptamente (com a melhor qualidade possível).
Camadas, qualidades e taxas de quadros padrão
As qualidades e as camadas padrão fornecidas para usuários de dispositivos móveis e da Web são as seguintes:
| Dispositivos móveis (Android e iOS) | Web (Chrome) |
|---|---|
Camada alta (ou personalizada):
|
Camada alta (ou personalizada):
|
Camada média: nenhuma (não é necessária, pois a diferença entre as taxas de bits da camada alta e baixa em dispositivos móveis é pequena) |
Camada média:
|
Camada baixa:
|
Camada baixa:
|
Resolução de camadas
As resoluções das camadas média e baixa têm a escala reduzida vertical e automaticamente em relação à camada alta, para manter a mesma proporção.
As camadas média e baixa serão excluídas se suas resoluções estiverem muito próximas da camada acima. Por exemplo, se a resolução configurada for 320 x 180, o SDK também não enviará camadas de resolução mais baixa.
A tabela abaixo mostra as resoluções das camadas geradas para diferentes resoluções configuradas. Os valores listados estão na orientação paisagem, mas podem ser aplicados ao contrário para conteúdo em retrato.
| Resolução de entrada | Resoluções da camada de saída: móvel | Resoluções da camada de saída: Web |
|---|---|---|
|
720p (1.280 x 720) |
Alto (1.280 x 720) Baixo (320 x 180) |
Alto (1.280 x 720) Médio (640 x 360) Baixo (320 x 180) |
|
540p (960 x 540) |
Alto (960 x 540) Baixo (320 x 180) |
Alto (960 x 540) Baixo (320 x 180) |
|
360p (640 x 360) |
Alto (640 x 360) Baixo (360 x 180) |
Alto (640 x 360) Baixo (360 x 180) |
|
270p (480 x 270) |
Alto (480 x 270) |
Alto (480 x 270) |
|
180p (320 x 180) |
Alto (320 x 180) |
Alto (320 x 180) |
Para as resoluções de entrada personalizadas não mapeadas acima, você pode calculá-las usando a ferramenta a seguir
Configuração da codificação em camadas com a transmissão simultânea (Publicador)
Para usar a codificação em camadas com transmissão simultânea, você deve ter habilitado o recurso no cliente. Se você habilitá-lo, verá um aumento no uso da largura de banda de upload pelo publicador, provavelmente com menos congelamento de vídeo para os espectadores.
Android
// Enable Simulcast StageVideoConfiguration config = new StageVideoConfiguration(); config.simulcast.setEnabled(true); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code
iOS
// Enable Simulcast let config = IVSLocalStageStreamVideoConfiguration() config.simulcast.enabled = true let cameraStream = IVSLocalStageStream(device: camera, configuration: config) // Other Stage implementation code
Web
// Enable Simulcast let cameraStream = new LocalStageStream(cameraDevice, { simulcast: { enabled: true } }) // Other Stage implementation code
Para obter informações detalhadas sobre a configuração de camadas individuais, consulte "Configurar a codificação em camadas (Publicador)" em cada guia do SDK de transmissão: Android, iOS e Web.
Configuração da codificação em camadas com a transmissão simultânea (Assinante)
Para configurar quais camadas são recebidas pelos assinantes, consulte as seções "Codificação em camadas com transmissão simultânea" nos guias do SDK de streaming em tempo real:
Com a configuração do assinante, é possível definir o InitialLayerPreference. Isso determina qual qualidade de vídeo é entregue inicialmente, bem como a preferredLayerForStream, que por sua vez determina qual camada é selecionada durante a reprodução do vídeo. Existem eventos e métodos de fluxo para notificar quando as camadas mudam, adaptações ocorrem ou uma seleção de camada é feita.
Configurações de transmissão
Esta seção explora outras configurações que você pode fazer em seus fluxos de vídeo e áudio.
Alterar taxa de bits do fluxo
Para alterar a taxa de bits do fluxo de vídeo, use os exemplos de configuração a seguir.
Android
StageVideoConfiguration config = new StageVideoConfiguration(); // Update Max Bitrate to 1.5mbps config.setMaxBitrate(1500000); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code
iOS
let config = IVSLocalStageStreamVideoConfiguration(); // Update Max Bitrate to 1.5mbps try! config.setMaxBitrate(1500000); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code
Web
let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Bitrate to 1.5mbps or 1500kbps maxBitrate: 1500 }) // Other Stage implementation code
Alterar da taxa de quadros do fluxo de vídeo
Para alterar a taxa de quadros do fluxo de vídeo, use os exemplos de configuração a seguir.
Android
StageVideoConfiguration config = new StageVideoConfiguration(); // Update target framerate to 10fps config.targetFramerate(10); ImageLocalStageStream cameraStream = new ImageLocalStageStream(frontCamera, config); // Other Stage implementation code
iOS
let config = IVSLocalStageStreamVideoConfiguration(); // Update target framerate to 10fps try! config.targetFramerate(10); let cameraStream = IVSLocalStageStream(device: camera, configuration: config); // Other Stage implementation code
Web
// Note: On web it is also recommended to configure the framerate of your device from userMedia const camera = await navigator.mediaDevices.getUserMedia({ video: { frameRate: { ideal: 10, max: 10, }, }, }); let cameraStream = new LocalStageStream(camera.getVideoTracks()[0], { // Update Max Framerate to 10fps maxFramerate: 10 }) // Other Stage implementation code
Otimização da taxa de bits de áudio e compatibilidade com estéreo
Para alterar a taxa de bits e as configurações do estéreo, use os exemplos de configuração a seguir.
Web
// Note: Disable autoGainControl, echoCancellation, and noiseSuppression when enabling stereo. const camera = await navigator.mediaDevices.getUserMedia({ audio: { autoGainControl: false, echoCancellation: false, noiseSuppression: false }, }); let audioStream = new LocalStageStream(camera.getAudioTracks()[0], { // Optional: Update Max Audio Bitrate to 96Kbps. Default is 64Kbps maxAudioBitrateKbps: 96, // Signal stereo support. Note requires dual channel input source. stereo: true }) // Other Stage implementation code
Android
StageAudioConfiguration config = new StageAudioConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. config.setMaxBitrate(96000); AudioLocalStageStream microphoneStream = new AudioLocalStageStream(microphone, config); // Other Stage implementation code
iOS
let config = IVSLocalStageStreamConfiguration(); // Update Max Bitrate to 96Kbps. Default is 64Kbps. try! config.audio.setMaxBitrate(96000); let microphoneStream = IVSLocalStageStream(device: microphone, config: config); // Other Stage implementation code
Alteração do MinDelay do buffer de instabilidade do assinante
Para alterar o atraso mínimo do buffer de instabilidade para um participante que está se inscrevendo, uma subscribeConfiguration personalizada pode ser usada. O buffer de instabilidade determina quantos pacotes são armazenados antes do início da reprodução. O atraso mínimo representa a meta para a quantidade mínima de dados que devem ser armazenados. Alterar o atraso mínimo pode ajudar a reprodução a ser mais resiliente ao enfrentar problemas de perda de pacotes e conexão.
A desvantagem de aumentar o tamanho do buffer de instabilidade é que ele também aumentará o atraso antes do início da reprodução. Aumentar o atraso mínimo fornece mais resiliência, mas ao custo de impactar o tempo de gravação do vídeo. Observe que aumentar o atraso mínimo durante a reprodução tem um efeito semelhante: a reprodução será pausada brevemente para permitir que o buffer de instabilidade seja preenchido.
Se for necessária mais resiliência, recomendamos começar com uma predefinição de atraso mínimo de MEDIUM e definir a configuração de assinatura antes do início da reprodução.
Observe que o atraso mínimo será aplicado somente se o participante for assinante. Se o próprio participante estiver publicando, o atraso mínimo não será aplicado. Isso é feito para garantir que vários publicadores possam se comunicar sem um atraso adicional.
Os exemplos abaixo usam uma predefinição de atraso mínimo de MEDIUM. Consulte a documentação de referência do SDK para ver todos os possíveis valores.
Web
const strategy = { subscribeConfiguration: (participant) => { return { jitterBuffer: { minDelay: JitterBufferMinDelay.MEDIUM } } // ... other strategy functions }
Android
@Override public SubscribeConfiguration subscribeConfigrationForParticipant(@NonNull Stage stage, @NonNull ParticipantInfo participantInfo) { SubscribeConfiguration config = new SubscribeConfiguration(); config.jitterBuffer.setMinDelay(JitterBufferConfiguration.JitterBufferDelay.MEDIUM()); return config; }
iOS
func stage(_ stage: IVSStage, subscribeConfigurationForParticipant participant: IVSParticipantInfo) -> IVSSubscribeConfiguration { let config = IVSSubscribeConfiguration() try! config.jitterBuffer.setMinDelay(.medium()) return config }
Otimizações sugeridas
| Cenário | Recomendações |
|---|---|
| Fluxos com texto ou conteúdo em movimento lento, como apresentações ou slides | Use codificação em camadas com transmissão simultânea ou configure fluxos com menor taxa de quadros. |
| Transmissões com ação ou muito movimento | Use codificação em camadas com transmissão simultânea. |
| Transmissões com conversa ou pouco movimento | Use a codificação em camadas com transmissão simultânea ou escolha somente áudio (consulte “Inscrição em participantes” nos guias do SDK de Transmissão em tempo real: Web, Android e iOS). |
| Usuários fazendo streaming com dados limitados | Use codificação em camadas com transmissão simultânea ou, se quiser menor uso de dados para todos, configure uma taxa de quadros mais baixa e diminua a taxa de bits manualmente. |