Audio Spasial adalah pengalaman audio imersif yang menempatkan pengguna di game, membuat konten Anda terdengar lebih realistis. Suaranya "dispasialisasi" untuk membuat efek multi-speaker, mirip dengan suara surround pengaturan, tetapi melalui headphone.
Misalnya, di film, suara dari mobil mungkin dimulai dari belakang pengguna, bergerak maju, dan pergi ke kejauhan. Di obrolan video, suara dapat dipisahkan dan ditempatkan di sekitar pengguna, sehingga memudahkan mengidentifikasi pembicara.
Jika konten Anda menggunakan format audio yang didukung, Anda dapat menambahkan audio spasial ke aplikasi mulai dari Android 13 (API level 33).
Mengkueri kemampuan
Gunakan class Spatializer
untuk
mengkueri kemampuan dan perilaku spasial perangkat. Mulai dengan mengambil
instance Spatializer
dari
AudioManager
:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Setelah Anda mendapatkan Spatializer
, periksa empat kondisi yang harus berlaku
agar perangkat dapat menghasilkan audio yang di-spatialisasi:
Kriteria | Cek |
---|---|
Apakah perangkat mendukung spasialisasi? |
getImmersiveAudioLevel() bukan SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
Apakah spasial tersedia? Ketersediaan bergantung pada kompatibilitas dengan pemilihan rute output audio saat ini. |
isAvailable() adalah true |
Apakah spasiisasi diaktifkan? | isEnabled() adalah true |
Dapatkah trek audio dengan parameter yang diberikan di-spasialisasi? | canBeSpatialized() adalah true |
Kondisi ini mungkin tidak terpenuhi, misalnya, jika spasialisasi tidak tersedia untuk trek audio saat ini atau dinonaktifkan di perangkat output audio secara keseluruhan.
Pelacakan gerak kepala
Dengan headset yang didukung, platform dapat menyesuaikan
spasial berdasarkan posisi kepala pengguna. Untuk memeriksa apakah
pelacak kepala
yang tersedia untuk perutean output audio saat ini, panggil
isHeadTrackerAvailable()
Konten yang kompatibel
Spatializer.canBeSpatialized()
menunjukkan apakah audio dengan properti yang diberikan dapat dispasialisasi dengan
{i>routing<i} perangkat {i>output<i} saat ini. Metode ini memerlukan AudioAttributes
dan AudioFormat
, yang keduanya
yang dijelaskan secara lebih detail di bawah ini.
AudioAttributes
Objek AudioAttributes
mendeskripsikan penggunaan
streaming audio (misalnya, audio game
atau media standar),
beserta 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-spatialisasi, 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()
,
setel encoding
sama dengan format output yang diharapkan dari decoder. Anda juga harus mengatur
masker channel
yang cocok dengan konfigurasi channel konten Anda. Lihat bagian
Perilaku spasialisasi default untuk mendapatkan panduan tentang
nilai tertentu yang akan digunakan.
Memproses perubahan pada Spatializer
Untuk memproses perubahan status Spatializer
, Anda dapat menambahkan pemroses
dengan Spatializer.addOnSpatializerStateChangedListener()
.
Demikian pula, untuk mendengarkan
perubahan ketersediaan {i>head tracker<i},
panggil Spatializer.addOnHeadTrackerAvailableListener()
.
Hal ini dapat berguna jika Anda ingin menyesuaikan pemilihan trek selama pemutaran
menggunakan callback pemroses. Misalnya, saat pengguna menghubungkan atau memutuskan koneksi
headset dari perangkat, onSpatializerAvailableChanged
menunjukkan apakah efek spatializer tersedia untuk
pemilihan rute output audio. 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 terbaru ExoPlayer mempermudah penggunaan audio spasial. Jika Anda menggunakan
library ExoPlayer mandiri (nama paket com.google.android.exoplayer2
),
versi 2.17 mengonfigurasi platform untuk menghasilkan audio yang di-spatialisasi, 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.
Setelah memperbarui dependensi ExoPlayer ke rilis terbaru, aplikasi Anda cukup perlu menyertakan konten yang dapat dispasialisasi.
Batasan jumlah saluran audio
Jika keempat kondisi untuk audio spasial terpenuhi, ExoPlayer akan memilih
jalur audio multisaluran. 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 buffer ulang.
Untuk menonaktifkan batasan jumlah saluran audio, tetapkan parameter pemilihan trek di pemutar seperti yang ditunjukkan di bawah ini:
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() );
Dengan batasan jumlah channel audio dinonaktifkan, jika konten memiliki beberapa audio ExoPlayer, ExoPlayer awalnya memilih trek yang memiliki jumlah saluran tertinggi dan dapat diputar dari perangkat. Misalnya, jika konten berisi trek audio multisaluran dan trek audio stereo, serta perangkat mendukung pemutaran keduanya, ExoPlayer memilih jalur multi-saluran. Lihat Pemilihan trek audio untuk mengetahui detail tentang cara menyesuaikan perilaku ini.
Pilihan trek audio
Jika perilaku batasan jumlah saluran audio ExoPlayer dinonaktifkan, ExoPlayer tidak otomatis memilih trek audio yang cocok dengan properti spatializer perangkat. Sebagai gantinya, Anda dapat menyesuaikan logika pemilihan trek ExoPlayer dengan mengatur pemilihan trek sebelum atau selama pemutaran. Secara default, ExoPlayer memilih trek audio yang sama dengan trek awal sehubungan dengan 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 dalam pemutaran. Informasi selengkapnya tentang cara menyesuaikan parameter pemilihan jalur pemutar tersedia di bagian pemilihan jalur pada dokumentasi ExoPlayer.
Perilaku spasial default
Perilaku spasial default di Android menyertakan perilaku berikut yang dapat disesuaikan oleh OEM:
Hanya konten multisaluran yang dispasialisasi, bukan konten stereo. Jika Anda tidak menggunakan ExoPlayer, bergantung pada format multi-saluran Anda konten audio, Anda mungkin perlu mengonfigurasi jumlah maksimum channel yang dapat dihasilkan oleh decoder audio ke jumlah besar. Hal ini memastikan bahwa dekoder audio menghasilkan PCM multisaluran untuk di-spatialisasi 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 cara kerjanya, lihat
MediaCodecAudioRenderer.java
ExoPlayer. Untuk menonaktifkan spasialisasi sendiri, terlepas dari penyesuaian OEM, lihat Menonaktifkan audio spasial.AudioAttributes
: Audio memenuhi syarat untuk spasial jikausage
ditetapkan keUSAGE_MEDIA
atauUSAGE_GAME
.AudioFormat
: Gunakan mask channel yang berisi setidaknyaAudioFormat.CHANNEL_OUT_QUAD
saluran (kiri depan, kanan depan, kiri belakang, dan kanan belakang) untuk audio memenuhi syarat untuk spasialisasi. Pada contoh di bawah, kita menggunakanAudioFormat.CHANNEL_OUT_5POINT1
untuk 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, setel encoding ke
AudioFormat.ENCODING_PCM_16BIT
jika Anda telah mengonfigurasi decoder untuk menghasilkan output 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 > Spasial audio.
- 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 tampilan berikut
parameter dalam output saat pemutaran aktif:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)