

# SDK de Transmissão do IVS: Modos de áudio para dispositivos móveis \| Streaming em tempo real
<a name="broadcast-mobile-audio-modes"></a>

A qualidade do áudio é uma parte importante de qualquer experiência de mídia em tempo real, e não há uma configuração de áudio única que funcione melhor para cada caso de uso. Para garantir que seus usuários tenham a melhor experiência ao ouvir uma transmissão em tempo real do IVS, nossos SDKs móveis oferecem várias configurações de áudio predefinidas, bem como personalizações mais poderosas, conforme necessário.

## Introdução
<a name="broadcast-mobile-audio-modes-introduction"></a>

Os SDKs de transmissão móvel do IVS oferecem uma classe `StageAudioManager`. Essa classe foi projetada para ser o único ponto de contato para controlar os modos de áudio subjacentes em ambas as plataformas. No Android, isso controla o [AudioManager](https://developer.android.com/reference/android/media/AudioManager), incluindo o modo de áudio, a fonte do áudio, o tipo de conteúdo, o uso e os dispositivos de comunicação. No iOS, o elemento controla o a aplicação [AVAudioSession](https://developer.apple.com/documentation/avfaudio/avaudiosession), bem como se o [voiceProcessing](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc) está habilitado.

**Importante**: não interaja com `AVAudioSession` ou `AudioManager` diretamente enquanto o SDK de Transmissão em tempo real do IVS estiver ativo. Isso poderá resultar na perda de áudio ou na gravação ou reprodução do áudio no dispositivo errado.

Antes de criar seu primeiro objeto `DeviceDiscovery` ou `Stage`, é necessário configurar classe `StageAudioManager`.

------
#### [ Android (Kotlin) ]

```
StageAudioManager.getInstance(context).setPreset(StageAudioManager.UseCasePreset.VIDEO_CHAT) // The default value

val deviceDiscovery = DeviceDiscovery(context)
val stage = Stage(context, token, this)

// Other Stage implementation code
```

------
#### [ iOS (Swift) ]

```
IVSStageAudioManager.sharedInstance().setPreset(.videoChat) // The default value

let deviceDiscovery = IVSDeviceDiscovery()
let stage = try? IVSStage(token: token, strategy: self)

// Other Stage implementation code
```

------

Se nada for definido em `StageAudioManager` antes da inicialização de uma instância `DeviceDiscovery` ou `Stage`, a predefinição `VideoChat` será aplicada automaticamente.

## Predefinições de casos de uso de áudio
<a name="broadcast-mobile-audio-modes-presets"></a>

O SDK de Transmissão em tempo real fornece três predefinições, cada uma personalizada para casos de uso comuns, conforme descrito abaixo. Para cada predefinição, abordamos cinco categorias principais que diferenciam as predefinições umas das outras.

A categoria **Volume Rocker** refere-se ao tipo de volume (volume de mídia ou volume de chamadas) que é usado ou alterado por meio dos controles de volume físicos no dispositivo. Observe que isso afeta o volume ao alternar os modos de áudio. Por exemplo, suponha que o volume do dispositivo esteja definido para o valor máximo ao usar a predefinição Video Chat. Alternar para a predefinição Subscribe Only gera um nível de volume diferente do sistema operacional, o que pode levar a uma alteração significativa no volume do dispositivo.

### Bate-papo por vídeo
<a name="audio-modes-presets-video-chat"></a>

Essa é a predefinição padrão, projetada para quando o dispositivo local tiver uma conversa em tempo real com outros participantes.

**Problema conhecido no iOS**: usar essa predefinição e não conectar um microfone faz com que o áudio seja reproduzido pelo fone de ouvido em vez de pelo alto-falante do dispositivo. Use essa predefinição somente em combinação com um microfone.


| Categoria | Android | iOS | 
| --- | --- | --- | 
| Cancelamento de eco | Habilitado | Habilitado | 
| Supressão de ruído | Habilitado | Habilitado | 
| Alternador de volume | Volume da chamada | Volume da chamada | 
| Seleção de microfone | Limitado com base no sistema operacional. Os microfones USB podem não estar disponíveis. | Limitado com base no sistema operacional. Os microfones USB e Bluetooth podem não estar disponíveis.<br />Os fones de ouvido Bluetooth que processam entrada e saída juntas devem funcionar (por exemplo, AirPods). | 
| Saída de áudio | Qualquer dispositivo de saída deve funcionar. | Limitado com base no sistema operacional. Fones de ouvido com fio podem não estar disponíveis. | 
| Qualidade de áudio | Média/baixa. Soará como um telefonema, não como uma reprodução de mídia. | Média/baixa. Soará como um telefonema, não como uma reprodução de mídia. | 

### Somente inscrição
<a name="audio-modes-presets-subscribe-only"></a>

Essa predefinição foi criada para quando você planeja se inscrever em outros participantes da publicação, mas não publicar a si mesmo. Ela se concentra na qualidade do áudio e na compatibilidade com todos os dispositivos de saída disponíveis.


| Categoria | Android | iOS | 
| --- | --- | --- | 
| Cancelamento de eco | Desabilitado | Desabilitado | 
| Supressão de ruído | Desabilitado | Desabilitado | 
| Alternador de volume | Volume de mídia | Volume de mídia | 
| Seleção de microfone | N/D, essa predefinição não foi projetada para publicação. | N/D, essa predefinição não foi projetada para publicação. | 
| Saída de áudio | Qualquer dispositivo de saída deve funcionar. | Qualquer dispositivo de saída deve funcionar. | 
| Qualidade de áudio | Alta. Qualquer tipo de mídia deve ser transmitido com clareza, inclusive música. | Alta. Qualquer tipo de mídia deve ser transmitido com clareza, inclusive música. | 

### Studio
<a name="audio-modes-presets-studio"></a>

Essa predefinição foi projetada para inscrições de alta qualidade, mantendo a capacidade de publicação. É necessário que o hardware de gravação e reprodução forneça o cancelamento de eco. Um caso de uso aqui seria usar um microfone USB e um fone de ouvido com fio. O SDK manterá a mais alta qualidade de áudio e, ao mesmo tempo, dependerá da separação física desses dispositivos contra a ocorrência de eco.


| Categoria | Android | iOS | 
| --- | --- | --- | 
| Cancelamento de eco | Desabilitado | Desabilitado | 
| Supressão de ruído | Desabilitado | Desabilitado | 
| Alternador de volume | Volume de mídia na maioria dos casos. Volume da chamada quando um microfone Bluetooth estiver conectado.  | Volume de mídia | 
| Seleção de microfone | Qualquer microfone deve funcionar. | Qualquer microfone deve funcionar. | 
| Saída de áudio | Qualquer dispositivo de saída deve funcionar. | Qualquer dispositivo de saída deve funcionar. | 
| Qualidade de áudio | Alta. Ambos os lados devem ser capazes de enviar música e ouvi-la claramente do outro lado.<br />Quando um fone de ouvido Bluetooth for conectado, a qualidade do áudio diminuirá devido à ativação do modo SCO do Bluetooth. | Alta. Ambos os lados devem ser capazes de enviar música e ouvi-la claramente do outro lado.<br />Quando um fone de ouvido Bluetooth for conectado, a qualidade do áudio poderá diminuir devido à ativação do modo SCO do Bluetooth, dependendo do fone de ouvido.  | 

## Casos de uso avançados
<a name="broadcast-mobile-audio-modes-advanced-use-cases"></a>

Além das predefinições, os SDKs de Transmissão de streaming em tempo real para iOS e Android permitem configurar os modos de áudio da plataforma subjacente:
+ No Android, defina [AudioSource](https://developer.android.com/reference/android/media/MediaRecorder.AudioSource), [Usage](https://developer.android.com/reference/android/media/AudioAttributes#USAGE_ALARM) e [ContentType](https://developer.android.com/reference/android/media/AudioAttributes#CONTENT_TYPE_MOVIE).
+ No iOS, use [AVAudioSession.Category](https://developer.apple.com/documentation/avfaudio/avaudiosession/category), [AVAudioSession.CategoryOptions](https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions), [AVAudioSession.Mode](https://developer.apple.com/documentation/avfaudio/avaudiosession/mode) e a possibilidade de alternar entre ter o [processamento de voz](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc) habilitado ou não durante a publicação.

Observação: ao usar esses métodos de SDK de áudio, é possível configurar incorretamente a sessão de áudio subjacente. Por exemplo, usar a opção `.allowBluetooth` no iOS em combinação com a categoria `.playback` cria uma configuração de áudio inválida e o SDK não pode gravar ou reproduzir áudio. Esses métodos são projetados para serem usados somente quando uma aplicação tiver requisitos específicos de sessão de áudio que foram validados.

------
#### [ Android (Kotlin) ]

```
// This would act similar to the Subscribe Only preset, but it uses a different ContentType.
StageAudioManager.getInstance(context)
    .setConfiguration(StageAudioManager.Source.GENERIC,
                      StageAudioManager.ContentType.MOVIE,
                      StageAudioManager.Usage.MEDIA);

val stage = Stage(context, token, this)

// Other Stage implementation code
```

------
#### [ iOS (Swift) ]

```
// This would act similar to the Subscribe Only preset, but it uses a different mode and options.
IVSStageAudioManager.sharedInstance()
    .setCategory(.playback,
                 options: [.duckOthers, .mixWithOthers],
                 mode: .default)

let stage = try? IVSStage(token: token, strategy: self)

// Other Stage implementation code
```

------

### Cancelamento do Echo no iOS
<a name="advanced-use-cases-ios_echo_cancellation"></a>

O cancelamento do Echo no iOS também pode ser controlado via `IVSStageAudioManager` de forma independente usando o método `echoCancellationEnabled`. Esse método controla se o [processamento de voz](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc) está habilitado nos nós de entrada e saída do `AVAudioEngine` subjacente usado pelo SDK. É importante entender o efeito de alterar essa propriedade manualmente:
+ A propriedade `AVAudioEngine` será reconhecida somente se o microfone do SDK estiver ativo. Isso é necessário devido à exigência do iOS de que o processamento de voz seja habilitado simultaneamente nos nós de entrada e saída. Normalmente, isso é feito usando o microfone retornado pelo `IVSDeviceDiscovery` para criar um `IVSLocalStageStream` a ser publicado. Como alternativa, o microfone pode ser habilitado, sem ser usado para publicar, anexando uma `IVSAudioDeviceStatsCallback` ao próprio microfone. Essa abordagem alternativa será útil se o cancelamento do Echo for necessário ao usar um microfone personalizado baseado em fonte de áudio em vez do microfone do SDK do IVS.
+ A habilitação da propriedade `AVAudioEngine` requer um modo de `.videoChat` ou `.voiceChat`. Solicitar um modo diferente faz com que o framework de áudio subjacente do iOS resista ao SDK, causando perda de áudio.
+ Habilitar `AVAudioEngine` automaticamente habilita a opção `.allowBluetooth `.

Os comportamentos podem ser diferentes dependendo do dispositivo e da versão do iOS.

### Fontes de áudio personalizadas para iOS
<a name="advanced-use-cases-ios_custom_audio_sources"></a>

Fontes de áudio personalizadas podem ser usadas com o SDK usando `IVSDeviceDiscovery.createAudioSource`. Ao se conectar a um palco, o SDK de transmissão de streaming em tempo real do IVS ainda gerencia uma instância `AVAudioEngine` interna para reprodução de áudio, mesmo que o microfone do SDK não seja usado. Como resultado, os valores fornecidos para `IVSStageAudioManager` devem ser compatíveis com o áudio fornecido pela fonte de áudio personalizada.

Se a fonte de áudio personalizada usada para publicar estiver gravando do microfone, mas for gerenciada pela aplicação host, o SDK de cancelamento do Echo acima não funcionará, a menos que o microfone gerenciado pelo SDK seja ativado. Para contornar esse requisito, consulte [Cancelamento do Echo no iOS](#advanced-use-cases-ios_echo_cancellation).

### Publicação com Bluetooth no Android
<a name="advanced-use-cases-bluetooth-android"></a>

O SDK reverterá automaticamente para a predefinição `VIDEO_CHAT` no Android quando as condições a seguir forem atendidas:
+ A configuração atribuída não usar o valor de uso `VOICE_COMMUNICATION`.
+ Houver um microfone Bluetooth conectado ao dispositivo.
+ O participante local estiver publicando em um palco.

Essa é uma limitação do sistema operacional Android em relação à forma como os fones de ouvido Bluetooth são usados para gravar áudio.

## Integração com outros SDKs
<a name="broadcast-mobile-audio-modes-integrating-other-sdks"></a>

Como o iOS e o Android são compatíveis apenas com um modo de áudio ativo por aplicação, é comum entrar em conflito se o aplicativo usar vários SDKs que exijam controle do modo de áudio. Veja abaixo algumas estratégias comuns de resolução para tentar solucionar esses conflitos.

### Combinar os valores do modo de áudio
<a name="integrating-other-sdks-match-values"></a>

Usando as opções avançadas de configuração de áudio do SDK do IVS ou a funcionalidade de outro SDK, faça com que os dois SDKs se alinhem aos valores subjacentes.

### Agora
<a name="integrating-other-sdks-agora"></a>

#### iOS
<a name="integrating-other-sdks-agora-ios"></a>

No iOS, pedir que o SDK do Agora que mantenha o `AVAudioSession` ativo impedirá que ele seja desativado enquanto o SDK de Transmissão de streaming em tempo real do IVS estiver fazendo uso dele.

```
myRtcEngine.SetParameters("{\"che.audio.keep.audiosession\":true}");
```

#### Android
<a name="integrating-other-sdks-agora-android"></a>

Evite chamar `setEnableSpeakerphone` em `RtcEngine` e chamar `enableLocalAudio(false)` enquanto publica com o SDK de Transmissão de streaming em tempo real do IVS. Você pode chamar `enableLocalAudio(true)` novamente quando o SDK do IVS não estiver sendo publicado.