

# Otimizações de streaming em tempo real do IVS
<a name="real-time-streaming-optimization"></a>

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
<a name="real-time-streaming-optimization-intro"></a>

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
<a name="real-time-streaming-optimization-adaptive"></a>

Esse recurso é compatível somente nas seguintes versões do cliente:
+ iOS e Android 1.18.0\$1
+ Web 1.12.0\$1

Ao usar [SDKs de transmissão em tempo real](broadcast.md) 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.\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/images/Layered_Encoding_1.png)


### Camadas, qualidades e taxas de quadros padrão
<a name="real-time-streaming-optimization-default-layers"></a>

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): [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | Camada alta (ou personalizada): [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 
| 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: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 
| Camada baixa: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | Camada baixa: [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/ivs/latest/RealTimeUserGuide/real-time-streaming-optimization.html)  | 

### Resolução de camadas
<a name="real-time-streaming-optimization-layer-resolution"></a>

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](https://codepen.io/amazon-ivs/full/ZENQQvo).

### Configuração da codificação em camadas com a transmissão simultânea (Publicador)
<a name="real-time-streaming-optimization-simulcast"></a>

Para usar a codificação em camadas com transmissão simultânea, você deve [ter habilitado o recurso](#real-time-streaming-optimization-adaptive) 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](android-publish-subscribe.md#android-layered-encoding-simulcast-configure-publisher), [iOS](ios-publish-subscribe.md#ios-layered-encoding-simulcast-configure-publisher) e [Web](web-publish-subscribe.md#web-layered-encoding-simulcast-configure-publisher).

### Configuração da codificação em camadas com a transmissão simultânea (Assinante)
<a name="real-time-streaming-optimization-simulcast-subscriber"></a>

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:
+ [SDK de Transmissão do Android](android-publish-subscribe.md#android-publish-subscribe-layered-encoding-simulcast)
+ [SDK de Transmissão do iOS](ios-publish-subscribe.md#ios-publish-subscribe-layered-encoding-simulcast)
+ [SDK de Transmissão para Web](web-publish-subscribe.md#web-publish-subscribe-layered-encoding-simulcast)

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
<a name="real-time-streaming-configurations"></a>

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
<a name="real-time-streaming-changing-bitrate"></a>

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
<a name="real-time-streaming-changing-framerate"></a>

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
<a name="real-time-streaming-optimize-audio-stream"></a>

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
<a name="real-time-streaming-jitter-buffer-min-delay"></a>

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
<a name="real-time-streaming-optimization-suggested"></a>


| 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](#real-time-streaming-optimization-adaptive) ou [configure fluxos com menor taxa de quadros](#real-time-streaming-changing-framerate).  | 
| Transmissões com ação ou muito movimento | Use [codificação em camadas com transmissão simultânea](#real-time-streaming-optimization-adaptive).  | 
| Transmissões com conversa ou pouco movimento  | Use a [codificação em camadas com transmissão simultânea](#real-time-streaming-optimization-adaptive) ou escolha somente áudio (consulte “Inscrição em participantes” nos guias do SDK de Transmissão em tempo real: [Web](web-publish-subscribe.md#web-publish-subscribe-concepts-strategy-participants), [Android](android-publish-subscribe.md#android-publish-subscribe-concepts-strategy-participants) e [iOS](ios-publish-subscribe.md#ios-publish-subscribe-concepts-strategy-participants)).  | 
| Usuários fazendo streaming com dados limitados  | Use [codificação em camadas com transmissão simultânea](#real-time-streaming-optimization-adaptive) ou, se quiser menor uso de dados para todos, [configure uma taxa de quadros mais baixa](#real-time-streaming-changing-framerate) e [diminua a taxa de bits manualmente](#real-time-streaming-changing-bitrate).  | 