Audio Spasial adalah pengalaman audio imersif yang menempatkan pengguna Anda di pusat aksi, sehingga konten Anda terdengar lebih realistis. Suara "dispasialkan" untuk menciptakan efek multi-speaker, mirip dengan penyiapan suara surround, tetapi melalui headphone.
Misalnya, dalam film, suara mobil mungkin dimulai dari belakang pengguna, bergerak ke depan, dan menghilang di kejauhan. Dalam video chat, suara dapat dipisahkan dan ditempatkan di sekitar pengguna, sehingga memudahkan identifikasi pembicara.
Jika konten Anda menggunakan format audio yang didukung, Anda dapat menambahkan audio spasial ke aplikasi mulai dari Android 13 (level API 33).
Membuat kueri untuk kemampuan
Gunakan class Spatializer untuk
mengkueri kemampuan dan perilaku spasialisasi perangkat. Mulailah dengan mengambil
instance Spatializer dari
AudioManager:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Setelah mendapatkan Spatializer, periksa empat kondisi yang harus terpenuhi
agar perangkat dapat menghasilkan audio spasial:
| Kriteria | Cek |
|---|---|
| Apakah perangkat mendukung spasialisasi? |
getImmersiveAudioLevel() bukan SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
| Apakah spasialisasi tersedia? Ketersediaan bergantung pada kompatibilitas dengan pemilihan rute output audio saat ini. |
isAvailable() adalah true |
| Apakah spasialisasi diaktifkan? | isEnabled() adalah true |
| Dapatkah trek audio dengan parameter yang diberikan diubah menjadi spasial? | canBeSpatialized() adalah true |
Kondisi ini mungkin tidak terpenuhi, misalnya, jika spasialisasi tidak tersedia untuk trek audio saat ini atau dinonaktifkan sepenuhnya di perangkat output audio.
Pelacakan gerak kepala
Dengan headset yang didukung, platform dapat menyesuaikan spasialisasi audio
berdasarkan posisi kepala pengguna. Untuk memeriksa apakah pelacak gerakan kepala
tersedia untuk pemilihan rute output audio saat ini, panggil
isHeadTrackerAvailable().
Konten yang kompatibel
Spatializer.canBeSpatialized()
menunjukkan apakah audio dengan properti yang diberikan dapat di-spasialisasi dengan
perutean perangkat output saat ini. Metode ini memerlukan AudioAttributes
dan AudioFormat, yang keduanya
dijelaskan secara lebih mendetail di bawah.
AudioAttributes
Objek AudioAttributes
menjelaskan penggunaan
streaming audio (misalnya, audio game
atau media standar),
bersama dengan perilaku pemutaran dan jenis kontennya.
Saat memanggil canBeSpatialized(), gunakan instance AudioAttributes yang sama seperti yang ditetapkan untuk Player Anda. Misalnya, jika
Anda menggunakan library Jetpack Media3 dan belum menyesuaikan
AudioAttributes, gunakan AudioAttributes.DEFAULT.
Menonaktifkan audio spasial
Untuk menunjukkan bahwa konten Anda telah di-spasialisasi, panggil
setIsContentSpatialized(true)
agar audio tidak diproses dua kali. Atau, sesuaikan
perilaku spasialisasi untuk menonaktifkan spasialisasi sepenuhnya dengan memanggil
setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER).
AudioFormat
Objek AudioFormat menjelaskan
detail tentang format dan konfigurasi saluran trek audio.
Saat membuat instance AudioFormat untuk diteruskan ke canBeSpatialized(),
tetapkan encoding
ke format yang sama dengan format output yang diharapkan dari decoder. Anda juga harus menetapkan
masker saluran
yang cocok dengan konfigurasi saluran konten Anda. Lihat bagian
Perilaku spasialisasi default untuk panduan tentang
nilai spesifik yang akan digunakan.
Memantau perubahan pada Spatializer
Untuk memproses perubahan status Spatializer, Anda dapat menambahkan pemroses
dengan Spatializer.addOnSpatializerStateChangedListener().
Demikian pula, untuk memproses perubahan ketersediaan pelacak gerakan kepala,
panggil Spatializer.addOnHeadTrackerAvailableListener().
Hal ini dapat berguna jika Anda ingin menyesuaikan pilihan trek selama pemutaran
menggunakan callback pemroses. Misalnya, saat pengguna menghubungkan atau memutuskan koneksi
headset dari perangkat, callback onSpatializerAvailableChanged
akan menunjukkan apakah efek spasialisasi tersedia untuk perutean
output audio baru. Pada tahap ini, Anda dapat mempertimbangkan untuk memperbarui logika pemilihan trek
pemutar agar sesuai dengan kemampuan baru perangkat. Untuk mengetahui detail tentang
perilaku pemilihan trek ExoPlayer, lihat bagian ExoPlayer dan audio spasial.
ExoPlayer dan audio spasial
Rilis ExoPlayer terbaru memudahkan penerapan audio spasial. Jika Anda menggunakan
library ExoPlayer mandiri (nama paket com.google.android.exoplayer2),
versi 2.17 mengonfigurasi platform untuk menghasilkan audio spasial, dan versi
2.18 memperkenalkan batasan jumlah saluran audio.
Jika Anda menggunakan modul ExoPlayer dari library Media3, (nama paket
androidx.media3), versi 1.0.0-beta01
dan yang lebih baru menyertakan update yang sama ini.
Setelah mengupdate dependensi ExoPlayer ke rilis terbaru, aplikasi Anda hanya perlu menyertakan konten yang dapat dispatialisasikan.
Batasan jumlah saluran audio
Jika keempat kondisi untuk audio spasial terpenuhi, ExoPlayer akan memilih
trek audio multi-saluran. Jika tidak, ExoPlayer akan memilih trek stereo.
Jika properti Spatializer berubah, ExoPlayer
akan memicu pemilihan trek baru untuk memilih trek audio yang cocok dengan
properti saat ini. Perhatikan bahwa pemilihan trek baru ini dapat menyebabkan periode buffering ulang yang singkat.
Untuk menonaktifkan batasan jumlah saluran audio, tetapkan parameter pemilihan trek pada pemutar seperti yang ditunjukkan di bawah:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Demikian pula, Anda dapat memperbarui parameter pemilih trek yang ada untuk menonaktifkan batasan jumlah saluran audio sebagai berikut:
Kotlin
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Jika batasan jumlah saluran audio dinonaktifkan, dan konten memiliki beberapa trek audio, ExoPlayer akan memilih trek yang memiliki jumlah saluran tertinggi dan dapat diputar dari perangkat. Misalnya, jika konten berisi trek audio multi-saluran dan trek audio stereo, dan perangkat mendukung pemutaran keduanya, ExoPlayer akan memilih trek multi-saluran. Lihat Pemilihan trek audio untuk mengetahui detail tentang cara menyesuaikan perilaku ini.
Pemilihan trek audio
Jika perilaku batasan jumlah saluran audio ExoPlayer dinonaktifkan, ExoPlayer tidak akan otomatis memilih trek audio yang cocok dengan properti spatializer perangkat. Sebagai gantinya, Anda dapat menyesuaikan logika pemilihan trek ExoPlayer dengan menetapkan parameter pemilihan trek sebelum atau selama pemutaran. Secara default, ExoPlayer memilih trek audio yang sama dengan trek awal terkait jenis MIME (encoding), jumlah saluran, dan frekuensi sampel.
Mengubah parameter pemilihan trek
Untuk mengubah parameter pemilihan trek ExoPlayer, gunakan
Player.setTrackSelectionParameters().
Demikian pula, Anda bisa mendapatkan parameter ExoPlayer saat ini dengan
Player.getTrackSelectionParameters().
Misalnya, untuk memilih trek audio stereo di tengah pemutaran:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
Perhatikan bahwa mengubah parameter pemilihan trek di tengah pemutaran dapat menyebabkan gangguan pada pemutaran. Informasi selengkapnya tentang penyesuaian parameter pemilihan trek pemutar tersedia di bagian pemilihan trek dalam dokumen ExoPlayer.
Perilaku spasialisasi default
Perilaku spasialisasi default di Android mencakup perilaku berikut yang dapat disesuaikan oleh OEM:
Hanya konten multisaluran yang diubah menjadi spasial, bukan konten stereo. Jika Anda tidak menggunakan ExoPlayer, bergantung pada format konten audio multisaluran, Anda mungkin perlu mengonfigurasi jumlah maksimum saluran yang dapat dihasilkan oleh dekoder audio ke jumlah yang besar. Hal ini memastikan bahwa dekoder audio menghasilkan PCM multi-saluran untuk diproses secara spasial oleh platform.
Kotlin
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
Java
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
Untuk contoh penerapannya, lihat
MediaCodecAudioRenderer.javaExoPlayer. Untuk menonaktifkan sendiri pembuatan efek spasial, terlepas dari penyesuaian OEM, lihat Menonaktifkan audio spasial.AudioAttributes: Audio memenuhi syarat untuk spasialisasi jikausagedisetel keUSAGE_MEDIAatauUSAGE_GAME.AudioFormat: Gunakan mask saluran yang berisi setidaknya saluranAudioFormat.CHANNEL_OUT_QUAD(depan-kiri, depan-kanan, belakang-kiri, dan belakang-kanan) agar audio memenuhi syarat untuk spasialisasi. Pada contoh di bawah, kita menggunakanAudioFormat.CHANNEL_OUT_5POINT1untuk trek audio 5.1. Untuk trek audio stereo, gunakanAudioFormat.CHANNEL_OUT_STEREO.Jika menggunakan Media3, Anda dapat menggunakan
Util.getAudioTrackChannelConfig(int channelCount)untuk mengonversi jumlah saluran menjadi mask saluran.Selain itu, tetapkan encoding ke
AudioFormat.ENCODING_PCM_16BITjika Anda telah mengonfigurasi decoder untuk menghasilkan PCM multi-saluran.Kotlin
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
Java
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
Menguji audio spasial
Pastikan audio spasial diaktifkan di perangkat pengujian Anda:
- Untuk headset berkabel, buka Setelan sistem > Suara & getaran > Audio spasial.
- Untuk headset nirkabel, buka Setelan sistem > Perangkat terhubung > Ikon roda gigi untuk perangkat nirkabel Anda > Audio spasial.
Untuk memeriksa ketersediaan Audio Spasial untuk pemilihan rute saat ini, jalankan
perintah adb shell dumpsys audio di perangkat Anda. Anda akan melihat parameter berikut
dalam output saat pemutaran aktif:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)