Otimizações de streaming em tempo real do IVS - Amazon IVS

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.

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).

Uso da codificação em camadas com a transmissão simultânea para ajustar a qualidade do vídeo com base na qualidade da conexão de rede do espectador.

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):

  • Taxa de bits máxima: 900.000 bps

  • Taxa de quadros: 15 fps

Camada alta (ou personalizada):

  • Taxa de bits máxima: 1.700.000 bps

  • Taxa de quadros: 30 fps

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:

  • Taxa de bits máxima: 700.000 bps

  • Taxa de quadros: 20 fps

Camada baixa:

  • Taxa de bits máxima: 100.000 bps

  • Taxa de quadros: 15 fps

Camada baixa:

  • Taxa de bits máxima: 200.000 bps

  • Taxa de quadros: 15 fps

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

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.