

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# SDK Siaran IVS: Mode Audio Seluler \| Streaming Waktu Nyata
<a name="broadcast-mobile-audio-modes"></a>

Kualitas audio adalah bagian penting dari pengalaman media tim nyata apa pun, dan tidak ada konfigurasi one-size-fits-all audio yang paling sesuai untuk setiap kasus penggunaan. Untuk memastikan bahwa pengguna Anda memiliki pengalaman terbaik saat mendengarkan streaming real-time IVS, ponsel kami SDKs menyediakan beberapa konfigurasi audio preset, serta penyesuaian yang lebih kuat sesuai kebutuhan.

## Pengantar
<a name="broadcast-mobile-audio-modes-introduction"></a>

Siaran seluler IVS SDKs menyediakan `StageAudioManager` kelas. Kelas ini dirancang untuk menjadi titik kontak tunggal untuk mengontrol mode audio yang mendasarinya pada kedua platform. Di Android, ini mengontrol [AudioManager](https://developer.android.com/reference/android/media/AudioManager), termasuk mode audio, sumber audio, jenis konten, penggunaan, dan perangkat komunikasi. Di iOS, ia mengontrol [AVAudioSesi](https://developer.apple.com/documentation/avfaudio/avaudiosession) aplikasi, serta apakah [VoiceProcessing diaktifkan](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc).

**Penting**: Jangan berinteraksi dengan `AVAudioSession` atau `AudioManager` langsung saat SDK siaran real-time IVS aktif. Melakukan hal itu dapat mengakibatkan hilangnya audio, atau audio yang direkam dari atau diputar kembali pada perangkat yang salah.

Sebelum Anda membuat `Stage` objek `DeviceDiscovery` atau pertama Anda, `StageAudioManager` kelas harus dikonfigurasi.

------
#### [ 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
```

------

Jika tidak ada yang diatur pada inisialisasi `StageAudioManager` sebelum `DeviceDiscovery` atau `Stage` instance, `VideoChat` preset diterapkan secara otomatis.

## Preset Kasus Penggunaan Audio
<a name="broadcast-mobile-audio-modes-presets"></a>

SDK siaran real-time menyediakan tiga preset, masing-masing disesuaikan dengan kasus penggunaan umum, seperti yang dijelaskan di bawah ini. Untuk setiap preset, kami mencakup lima kategori utama yang membedakan preset satu sama lain.

Kategori **Volume Rocker** mengacu pada jenis volume (volume media atau volume panggilan) yang digunakan atau diubah melalui rocker volume fisik pada perangkat. Perhatikan bahwa ini memengaruhi volume saat beralih mode audio. Misalnya, volume perangkat diatur ke nilai maksimum saat menggunakan preset Obrolan Video. Beralih ke preset Subscribe Only menyebabkan tingkat volume yang berbeda dari sistem operasi, yang dapat menyebabkan perubahan volume yang signifikan pada perangkat.

### Obrolan Video
<a name="audio-modes-presets-video-chat"></a>

Ini adalah preset default, yang dirancang untuk saat perangkat lokal akan melakukan percakapan real-time dengan peserta lain.

**Masalah yang diketahui di iOS**: Menggunakan preset ini dan tidak memasang mikrofon menyebabkan audio diputar melalui lubang suara alih-alih speaker perangkat. Gunakan preset ini hanya dalam kombinasi dengan mikrofon.


| Kategori | Android | iOS | 
| --- | --- | --- | 
| Pembatalan Echo | Diaktifkan | Diaktifkan | 
| Penindasan Kebisingan | Diaktifkan | Diaktifkan | 
| Volume Rocker | Volume Panggilan | Volume Panggilan | 
| Pemilihan Mikrofon | Terbatas berdasarkan OS. Mikrofon USB mungkin tidak tersedia. | Terbatas berdasarkan OS. Mikrofon USB dan Bluetooth mungkin tidak tersedia.<br />Headset Bluetooth yang menangani input dan output bersama-sama harus berfungsi; misalnya, AirPods. | 
| Keluaran Audio | Perangkat output apa pun harus berfungsi. | Terbatas berdasarkan OS. Headset kabel mungkin tidak tersedia. | 
| Kualitas Audio | Sedang/Rendah. Ini akan terdengar seperti panggilan telepon, tidak seperti pemutaran media. | Sedang/Rendah. Ini akan terdengar seperti panggilan telepon, tidak seperti pemutaran media. | 

### Hanya Berlangganan
<a name="audio-modes-presets-subscribe-only"></a>

Preset ini dirancang ketika Anda berencana untuk berlangganan peserta penerbitan lain tetapi tidak mempublikasikan sendiri. Ini berfokus pada kualitas audio dan mendukung semua perangkat output yang tersedia.


| Kategori | Android | iOS | 
| --- | --- | --- | 
| Pembatalan Echo | Nonaktif | Nonaktif | 
| Penindasan Kebisingan | Nonaktif | Nonaktif | 
| Volume Rocker | Volume Media | Volume Media | 
| Pemilihan Mikrofon | N/A, preset ini tidak dirancang untuk penerbitan. | N/A, preset ini tidak dirancang untuk penerbitan. | 
| Keluaran Audio | Perangkat output apa pun harus berfungsi. | Perangkat output apa pun harus berfungsi. | 
| Kualitas Audio | Tinggi. Setiap jenis media harus datang dengan jelas, termasuk musik. | Tinggi. Setiap jenis media harus datang dengan jelas, termasuk musik. | 

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

Preset ini dirancang untuk berlangganan berkualitas tinggi sambil mempertahankan kemampuan untuk mempublikasikan. Ini membutuhkan perangkat keras perekaman dan pemutaran untuk memberikan pembatalan gema. Kasus penggunaan di sini adalah menggunakan mikrofon USB dan headset kabel. SDK akan mempertahankan audio berkualitas tinggi sambil mengandalkan pemisahan fisik perangkat tersebut agar tidak menyebabkan gema.


| Kategori | Android | iOS | 
| --- | --- | --- | 
| Pembatalan Echo | Nonaktif | Nonaktif | 
| Penindasan Kebisingan | Nonaktif | Nonaktif | 
| Volume Rocker | Volume Media dalam banyak kasus. Volume Panggilan saat mikrofon Bluetooth terhubung.  | Volume Media | 
| Pemilihan Mikrofon | Mikrofon apa pun harus berfungsi. | Mikrofon apa pun harus berfungsi. | 
| Keluaran Audio | Perangkat output apa pun harus berfungsi. | Perangkat output apa pun harus berfungsi. | 
| Kualitas Audio | Tinggi. Kedua belah pihak harus dapat mengirim musik dan mendengarnya dengan jelas di sisi lain.<br />Saat headset Bluetooth terhubung, kualitas audio akan turun karena mode Bluetooth SCO diaktifkan. | Tinggi. Kedua belah pihak harus dapat mengirim musik dan mendengarnya dengan jelas di sisi lain.<br />Saat headset Bluetooth terhubung, kualitas audio mungkin turun karena mode Bluetooth SCO diaktifkan, tergantung pada headset.  | 

## Kasus Penggunaan Tingkat Lanjut
<a name="broadcast-mobile-audio-modes-advanced-use-cases"></a>

Di luar preset, baik siaran streaming real-time iOS dan Android SDKs memungkinkan konfigurasi mode audio platform yang mendasarinya:
+ Di Android, atur [AudioSource](https://developer.android.com/reference/android/media/MediaRecorder.AudioSource), [Penggunaan](https://developer.android.com/reference/android/media/AudioAttributes#USAGE_ALARM), dan [ContentType](https://developer.android.com/reference/android/media/AudioAttributes#CONTENT_TYPE_MOVIE).
+ [Di iOS, gunakan [AVAudioSession.Category, Session.](https://developer.apple.com/documentation/avfaudio/avaudiosession/category) AVAudio CategoryOptions](https://developer.apple.com/documentation/avfaudio/avaudiosession/categoryoptions), [AVAudioSession.Mode](https://developer.apple.com/documentation/avfaudio/avaudiosession/mode), dan kemampuan untuk beralih jika [pemrosesan suara](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc) diaktifkan atau tidak saat penerbitan.

Catatan: Saat menggunakan metode SDK audio ini, dimungkinkan untuk salah mengonfigurasi sesi audio yang mendasarinya. Misalnya, menggunakan `.allowBluetooth` opsi di iOS dalam kombinasi dengan `.playback` kategori membuat konfigurasi audio yang tidak valid dan SDK tidak dapat merekam atau memutar audio. Metode ini dirancang untuk digunakan hanya ketika aplikasi memiliki persyaratan sesi audio tertentu yang telah divalidasi.

------
#### [ 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
```

------

### Pembatalan Echo iOS
<a name="advanced-use-cases-ios_echo_cancellation"></a>

Pembatalan gema di iOS dapat dikontrol secara independen melalui `IVSStageAudioManager` juga menggunakan metodenya`echoCancellationEnabled`. Metode ini mengontrol apakah [pemrosesan suara](https://developer.apple.com/documentation/avfaudio/avaudioionode/3152101-voiceprocessingenabled?language=objc) diaktifkan pada node input dan output yang mendasari yang `AVAudioEngine` digunakan oleh SDK. Penting untuk memahami efek mengubah properti ini secara manual:
+ `AVAudioEngine`Properti hanya dihormati jika mikrofon SDK aktif; ini diperlukan karena persyaratan iOS bahwa pemrosesan suara diaktifkan pada node input dan output secara bersamaan. Biasanya ini dilakukan dengan menggunakan mikrofon yang dikembalikan `IVSDeviceDiscovery` untuk membuat `IVSLocalStageStream` untuk menerbitkan. Sebagai alternatif, mikrofon dapat diaktifkan, tanpa digunakan untuk mempublikasikan, dengan melampirkan `IVSAudioDeviceStatsCallback` ke mikrofon itu sendiri. Pendekatan alternatif ini berguna jika pembatalan gema diperlukan saat menggunakan mikrofon khusus alih-alih audio-source-based mikrofon IVS SDK.
+ Mengaktifkan `AVAudioEngine` properti membutuhkan mode `.videoChat` atau`.voiceChat`. Meminta mode yang berbeda menyebabkan kerangka audio dasar iOS melawan SDK, menyebabkan kehilangan audio.
+ Mengaktifkan `AVAudioEngine` secara otomatis mengaktifkan `.allowBluetooth ` opsi.

Perilaku dapat berbeda tergantung pada perangkat dan versi iOS.

### Sumber Audio Kustom iOS
<a name="advanced-use-cases-ios_custom_audio_sources"></a>

Sumber audio khusus dapat digunakan dengan SDK dengan menggunakan`IVSDeviceDiscovery.createAudioSource`. Saat menghubungkan ke Stage, SDK siaran streaming real-time IVS masih mengelola `AVAudioEngine` instans internal untuk pemutaran audio, bahkan jika mikrofon SDK tidak digunakan. Akibatnya, nilai yang diberikan `IVSStageAudioManager` harus kompatibel dengan audio yang disediakan oleh sumber audio khusus.

Jika sumber audio kustom yang digunakan untuk mempublikasikan merekam dari mikrofon tetapi dikelola oleh aplikasi host, SDK pembatalan gema di atas tidak akan berfungsi kecuali mikrofon yang dikelola SDK diaktifkan. Untuk mengatasi persyaratan tersebut, lihat [Pembatalan Gema iOS](#advanced-use-cases-ios_echo_cancellation).

### Menerbitkan dengan Bluetooth di Android
<a name="advanced-use-cases-bluetooth-android"></a>

SDK secara otomatis kembali ke `VIDEO_CHAT` preset di Android jika kondisi berikut terpenuhi:
+ Konfigurasi yang ditetapkan tidak menggunakan nilai `VOICE_COMMUNICATION` penggunaan.
+ Mikrofon Bluetooth terhubung ke perangkat.
+ Peserta lokal menerbitkan ke Panggung.

Ini adalah batasan sistem operasi Android dalam hal bagaimana headset Bluetooth digunakan untuk merekam audio.

## Integrasi dengan Lainnya SDKs
<a name="broadcast-mobile-audio-modes-integrating-other-sdks"></a>

Karena iOS dan Android hanya mendukung satu mode audio aktif per aplikasi, biasanya terjadi konflik jika aplikasi Anda menggunakan beberapa SDKs yang memerlukan kontrol mode audio. Ketika Anda mengalami konflik ini, ada beberapa strategi resolusi umum untuk dicoba, dijelaskan di bawah ini.

### Cocokkan Nilai Mode Audio
<a name="integrating-other-sdks-match-values"></a>

Dengan menggunakan opsi konfigurasi audio lanjutan IVS SDK atau fungsionalitas SDK lainnya, keduanya SDKs sejajar dengan nilai yang mendasarinya.

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

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

Di iOS, memberi tahu Agora SDK untuk tetap `AVAudioSession` aktif akan mencegahnya menonaktifkan saat SDK siaran streaming real-time IVS menggunakannya.

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

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

Hindari `setEnableSpeakerphone` menelepon`RtcEngine`, dan menelepon `enableLocalAudio(false)` saat menerbitkan dengan SDK siaran streaming real-time IVS. Anda dapat menelepon `enableLocalAudio(true)` lagi saat IVS SDK tidak dipublikasikan.