Fitur audio spasial di Jetpack SceneCore memungkinkan Anda membuat pengalaman audio yang imersif dalam aplikasi Android XR.
Audio spasial menyimulasikan cara pengguna mempersepsikan suara dalam lingkungan 3D. Teknologi ini menciptakan sensasi suara yang berasal dari segala arah, termasuk dari atas dan bawah pengguna. Sistem melakukan ini dengan menyimulasikan satu atau beberapa "speaker virtual" di lokasi tertentu dalam ruang 3D.
Aplikasi lama yang belum didesain atau diubah untuk Android XR akan memiliki audio yang otomatis di-spasialisasi di Android XR. Saat pengguna bergerak di ruangnya, semua audio aplikasi akan dipancarkan dari panel tempat UI aplikasi dirender. Misalnya, jika timer berbunyi dari aplikasi jam, audio akan terdengar seperti berasal dari posisi panel aplikasi. Android XR akan mengubah suara secara otomatis untuk realisme posisi. Misalnya, jarak yang dirasakan antara panel aplikasi dan pengguna akan memengaruhi volume audio secara halus untuk memberikan rasa realisme yang lebih besar.
Untuk mengetahui informasi selengkapnya tentang cara aplikasi yang ada merender audio spasial, baca Menambahkan suara stereo dan surround ke aplikasi Anda di halaman ini.
Jika Anda mengoptimalkan aplikasi untuk XR, Jetpack SceneCore menyediakan alat untuk penyesuaian audio spasial tingkat lanjut. Anda dapat memosisikan suara secara presisi di lingkungan 3D, menggunakan audio ambisonik untuk medan suara yang realistis, dan memanfaatkan integrasi suara surround bawaan.
Jenis audio spasial yang tersedia di Android XR
Android XR mendukung audio posisional, stereo, surround, dan ambisonik.
Audio posisional
Audio posisional dapat diposisikan untuk diputar dari titik tertentu dalam ruang 3D. Misalnya, Anda dapat memiliki model 3D seekor anjing yang menggonggong di sudut lingkungan virtual Anda. Anda dapat memiliki beberapa entitas yang memancarkan suara dari setiap posisinya masing-masing. Untuk merender audio posisional, file harus mono atau stereo.
Stereo spasial dan suara surround
Semua format media Android didukung untuk suara surround, stereo, dan posisional.
Audio stereo mengacu pada format audio dengan dua channel dan suara surround mengacu pada format audio dengan lebih dari dua channel, seperti konfigurasi suara surround 5.1 atau suara surround 7.1. Data suara setiap saluran dikaitkan dengan satu speaker. Misalnya, saat memutar musik dalam stereo, saluran speaker kiri dapat memancarkan trek instrumen yang berbeda dengan saluran kanan.
Suara surround sering digunakan dalam film dan acara televisi untuk meningkatkan realisme dan imersi melalui penggunaan beberapa saluran speaker. Misalnya, dialog sering diputar dari saluran speaker tengah, sementara suara helikopter yang terbang dapat menggunakan saluran yang berbeda secara berurutan untuk memberikan kesan bahwa helikopter tersebut terbang di sekitar ruang 3D Anda.
Audio ambisonik
Audio Ambisonic (atau ambisonik) seperti skybox untuk audio, yang memberikan lanskap suara imersif bagi pengguna Anda. Gunakan ambisonik untuk suara lingkungan latar belakang atau skenario lain saat Anda ingin mereplikasi medan suara bola penuh yang mengelilingi pendengar. Android XR mendukung format audio ambisonik
AmbiX dalam ambisonik urutan pertama, kedua, dan ketiga. Sebaiknya gunakan jenis file Opus (.ogg
) dan
PCM/Wave (.wav
).
Menggunakan audio spasial dengan Jetpack SceneCore
Menerapkan audio spasial dengan Jetpack SceneCore melibatkan pemeriksaan kemampuan spasial dan pemilihan API untuk memuat audio spasial.
Memeriksa kemampuan spasial
Sebelum menggunakan fitur audio spasial, periksa apakah Session
mendukung audio spasial. Di semua cuplikan kode di bagian berikut, kemampuan diperiksa sebelum mencoba memutar audio spasial.
Memuat audio spasial
Anda dapat menggunakan salah satu API berikut untuk memuat audio spasial untuk digunakan di Jetpack SceneCore.
SoundPool
: Ideal untuk efek suara singkat yang berukuran kurang dari 1 MB, efek suara ini dimuat terlebih dahulu dan dapat digunakan berulang kali. Cara ini sangat bagus untuk memuat audio untuk audio spasial.ExoPlayer
: Ideal untuk memuat konten stereo dan surround sound seperti musik dan video. Juga memungkinkan pemutaran media di latar belakang.MediaPlayer
: Menyediakan cara paling sederhana untuk memuat audio ambisonik.AudioTrack
: Memberikan kontrol paling besar atas cara memuat data audio. Memungkinkan penulisan buffer audio secara langsung atau jika Anda menyintesis atau mendekode file audio Anda sendiri.
Menambahkan audio spasial ke aplikasi Anda
Sumber suara posisional ditentukan oleh PointSourceParams
dan
Entity
terkait. Posisi dan orientasi Entity
menentukan
tempat PointSourceParams
dirender dalam ruang 3D.
Contoh audio spasial
Contoh berikut memuat file audio efek suara ke dalam kumpulan suara dan
memutarnya kembali pada posisi Entity
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO) ) { // The session has spatial audio capabilities val maxVolume = 1F val lowPriority = 0 val infiniteLoop = -1 val normalSpeed = 1F val soundPool = SoundPool.Builder() .setAudioAttributes( AudioAttributes.Builder() .setContentType(CONTENT_TYPE_SONIFICATION) .setUsage(USAGE_ASSISTANCE_SONIFICATION) .build() ) .build() val pointSource = PointSourceParams(entity) val soundEffect = appContext.assets.openFd("sounds/tiger_16db.mp3") val pointSoundId = soundPool.load(soundEffect, lowPriority) soundPool.setOnLoadCompleteListener { soundPool, sampleId, status -> // wait for the sound file to be loaded into the soundPool if (status == 0) { SpatialSoundPool.play( session = session, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
Poin penting tentang kode
- Langkah pertama adalah memeriksa apakah kemampuan Audio Spasial saat ini tersedia dengan menggunakan
spatialCapabilities
. - Menetapkan contentType ke
CONTENT_TYPE_SONIFICATION
dan penggunaan keUSAGE_ASSISTANCE_SONIFICATION
memungkinkan sistem memperlakukan file audio ini sebagai efek suara. - Contoh sebelumnya memuat file audio ke dalam pool segera sebelum menggunakannya agar kode tetap bersama untuk mempermudah. Idealnya, Anda harus memuat semua efek suara secara asinkron saat memuat aplikasi sehingga semua file audio tersedia di kumpulan saat Anda membutuhkannya.
Menambahkan suara stereo dan surround ke aplikasi Anda
Cara yang direkomendasikan untuk menambahkan suara stereo dan surround ke aplikasi Anda adalah dengan menggunakan
Exoplayer
. Untuk mengetahui informasi selengkapnya tentang cara menggunakan Audio Spasial dengan Exoplayer
, lihat panduan Audio Spasial.
Penempatan speaker stereo dan surround sound
Dengan pemosisian speaker suara surround, speaker suara surround virtual diposisikan dan diorientasikan relatif terhadap speaker tengah, di sekitar pengguna dalam konfigurasi ITU standar.
Secara default, speaker saluran tengah ditempatkan di
mainPanelEntity
aplikasi. Hal ini mencakup aplikasi seluler yang audionya
dispatialisasi secara otomatis oleh Android XR.
Untuk stereo, penempatan speaker serupa dengan suara surround, kecuali hanya saluran kiri dan kanan yang diposisikan di sisi kiri dan kanan panel.
Jika Anda memiliki beberapa panel dan ingin memilih panel mana yang memancarkan audio, atau
jika Anda ingin audio stereo atau surround dirender relatif terhadap Entity
lain,
Anda dapat menggunakan PointSourceAttributes
untuk menentukan lokasi saluran
tengah. Saluran yang tersisa akan ditempatkan seperti yang disebutkan sebelumnya. Dalam situasi ini, Anda juga harus menggunakan MediaPlayer
.
Saat pengguna bergerak di sekitar ruang mereka, speaker virtual stereo dan surround sound akan bergerak dan menyesuaikan diri untuk memastikan speaker selalu berada dalam posisi yang optimal.
Jika Anda telah mengonfigurasi MediaPlayer
atau ExoPlayer
untuk terus memutar suara stereo atau surround dari latar belakang, posisi speaker virtual akan berubah saat aplikasi berada di latar belakang. Karena tidak ada panel atau titik lain di ruang untuk menyematkan suara, audio spasial bergerak bersama pengguna (dengan kata lain, "terkunci di kepala").
Contoh suara surround
Contoh berikut memuat file audio 5.1 menggunakan MediaPlayer
dan menetapkan
saluran tengah file menjadi Entity
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) { // The session has spatial audio capabilities val pointSourceAttributes = PointSourceParams(session.scene.mainPanelEntity) val mediaPlayer = MediaPlayer() val fivePointOneAudio = appContext.assets.openFd("sounds/aac_51.ogg") mediaPlayer.reset() mediaPlayer.setDataSource(fivePointOneAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setPointSourceParams( session, mediaPlayer, pointSourceAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
Poin penting tentang kode
- Seperti dalam contoh audio posisional, langkah pertama adalah memeriksa apakah kemampuan audio spasial tersedia dengan menggunakan
spatialCapabilities
. - Menetapkan
contentType
keAudioAttributes.CONTENT_TYPE_MUSIC
dan penggunaan keAudioAttributes.USAGE_MEDIA
memungkinkan sistem memperlakukan file audio ini sebagai suara surround.
Menambahkan medan suara ambisonik ke aplikasi Anda
Cara paling sederhana untuk memutar kembali medan suara ambisonik adalah dengan memuat file menggunakan
MediaPlayer
. Karena suara ambisonik berlaku untuk seluruh lanskap suara, Anda tidak perlu menentukan Entity
untuk memberikan posisi. Sebagai gantinya, Anda membuat
instance SoundFieldAttributes
dengan urutan ambisonik yang sesuai
yang menentukan jumlah saluran.
Contoh Ambionics
Contoh berikut memutar medan suara ambisonik menggunakan MediaPlayer
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_FIRST_ORDER) val mediaPlayer = MediaPlayer() val soundFieldAudio = appContext.assets.openFd("sounds/foa_basketball_16bit.wav") mediaPlayer.reset() mediaPlayer.setDataSource(soundFieldAudio) val audioAttributes = AudioAttributes.Builder() .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC) .setUsage(AudioAttributes.USAGE_MEDIA) .build() SpatialMediaPlayer.setSoundFieldAttributes( session, mediaPlayer, soundFieldAttributes ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
Poin penting tentang kode
- Seperti cuplikan sebelumnya, langkah pertama adalah memeriksa apakah kemampuan Audio Spasial tersedia menggunakan
hasCapability()
. contentType
dan penggunaannya hanya untuk informasi.AMBISONICS_ORDER_FIRST_ORDER
memberi sinyal ke SceneCore bahwa file bidang suara menentukan empat saluran.