Fitur audio spasial di Jetpack SceneCore memungkinkan Anda membuat pengalaman audio yang imersif dalam aplikasi Android XR.
Audio spasial menyimulasikan cara pengguna merasakan suara di lingkungan 3D. Hal ini menciptakan sensasi suara yang berasal dari semua arah, termasuk di atas dan di bawah pengguna. Sistem ini melakukannya dengan menyimulasikan satu atau beberapa "speaker virtual" di lokasi tertentu dalam ruang 3D.
Aplikasi yang sudah ada dan belum didesain untuk atau dimodifikasi untuk Android XR akan memiliki audio yang otomatis di-spatialisasi di Android XR. Saat pengguna berpindah 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 otomatis mengubah suara untuk realisme posisi. Misalnya, jarak yang dirasakan antara panel aplikasi dan pengguna akan secara halus memengaruhi volume audio untuk memberikan kesan 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 lanjutan. Anda dapat memosisikan suara dengan tepat di lingkungan 3D, menggunakan audio ambisonik untuk bidang suara yang realistis, dan memanfaatkan integrasi suara surround bawaan.
Jenis audio spasial yang tersedia di Android XR
Android XR mendukung audio posisional, stereo, suara surround, dan ambisonik.
Audio posisional
Audio posisional dapat diposisikan untuk diputar dari titik tertentu dalam ruang 3D. Misalnya, Anda dapat memiliki model 3D anjing yang menggonggong di sudut lingkungan virtual Anda. Anda dapat memiliki beberapa entity yang memancarkan suara dari setiap posisinya. Untuk merender audio posisional, file harus mono atau stereo.
Suara stereo dan surround yang di-spatialisasi
Semua format media Android didukung untuk suara posisional, stereo, dan surround.
Audio stereo mengacu pada format audio dengan dua saluran dan suara surround mengacu pada format audio dengan lebih dari dua saluran, seperti konfigurasi suara surround 5.1 atau suara surround 7.1. Data suara setiap saluran dikaitkan dengan satu pembicara. Misalnya, saat memutar musik dalam stereo, saluran speaker kiri dapat memunculkan trek instrumen yang berbeda dengan saluran kanan.
Suara surround sering digunakan dalam film dan acara televisi untuk meningkatkan realisme dan pengalaman imersif melalui penggunaan beberapa saluran speaker. Misalnya, dialog sering diputar dari saluran speaker tengah, sedangkan suara helicopter yang terbang dapat menggunakan saluran yang berbeda secara berurutan untuk memberikan kesan bahwa helicopter terbang di sekitar ruang 3D Anda.
Audio Ambisonic
Audio Ambisonic (atau ambisonic) seperti skybox untuk audio,
yang memberikan lanskap suara imersif bagi pengguna Anda. Gunakan ambisonics untuk suara lingkungan
latar belakang atau skenario lain saat Anda ingin mereplikasi
kolom suara sferis penuh yang mengelilingi pendengar. Android XR mendukung
format audio ambisonic AmbiX dalam ambisonics
urutan pertama, kedua, dan ketiga. Sebaiknya gunakan jenis file Opus (.ogg
) dan
PCM/Wave (.wav
).
Menggunakan audio spasial dengan Jetpack SceneCore
Mengimplementasikan audio spasial dengan Jetpack SceneCore melibatkan pemeriksaan kemampuan spasial dan pemilihan API untuk memuat audio spasial.
Memeriksa kemampuan spasial
Sebelum menggunakan fitur audio spasial, pastikan Session
mendukung
audio spasial. Di semua cuplikan kode di bagian berikut,
kemampuan diperiksa sebelum mencoba memutar audio yang di-spatialisasi.
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 dengan ukuran kurang dari 1 MB. Efek suara ini dimuat terlebih dahulu dan suaranya dapat digunakan berulang kali. Ini adalah cara yang bagus untuk memuat audio untuk audio posisional.ExoPlayer
: Ideal untuk memuat konten suara stereo dan surround seperti musik dan video. Juga memungkinkan pemutaran media di latar belakang.MediaPlayer
: Memberikan 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 posisional ke aplikasi
Sumber suara posisional ditentukan oleh
PointSourceAttributes
dan
Entity
terkait. Posisi dan orientasi Entity
menentukan tempat PointSourceAttribute
dirender dalam ruang 3D.
Contoh audio posisional
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 (xrSession.getSpatialCapabilities().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 = PointSourceAttributes(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 = xrSession,
soundPool = soundPool,
soundID = pointSoundId,
attributes = 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
getSpatialCapabilities()
. - 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 kumpulan segera sebelum menggunakannya untuk menjaga kode tetap bersama agar lebih sederhana. 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
Cara yang direkomendasikan untuk menambahkan suara stereo dan surround ke aplikasi Anda adalah dengan menggunakan
Exoplayer
. Untuk informasi selengkapnya tentang cara menggunakan Audio Spasial dengan Exoplayer
,
lihat panduan Audio Spasial.
Pemosisi speaker stereo dan suara surround
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
memiliki audio yang di-spatialisasi secara otomatis oleh Android XR.
Untuk stereo, penempatan speaker mirip dengan suara surround, kecuali hanya saluran kiri dan kanan yang diposisikan di sisi kiri dan kanan panel.
Jika memiliki beberapa panel dan ingin memilih panel mana yang memunculkan 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 berpindah-pindah di ruang, speaker virtual stereo dan suara surround akan bergerak dan menyesuaikan 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 diubah saat aplikasi berada di latar belakang. Karena tidak ada
panel atau titik lain di ruang untuk mengaitkan suara, audio spasial akan bergerak
bersama pengguna (dengan kata lain, "terkunci ke 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 (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) {
// The session has spatial audio capabilities
val pointSourceAttributes = PointSourceAttributes(xrSession.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.setPointSourceAttributes(
xrSession,
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 posisional saat ini tersedia dengan
menggunakan
getSpatialCapabilities()
. - Menetapkan contentType ke CONTENT_TYPE_MUSIC dan penggunaan ke USAGE_MEDIA memungkinkan sistem memperlakukan file audio ini sebagai suara surround.
Menambahkan kolom suara ambisonik ke aplikasi
Cara termudah untuk memutar medan suara ambisonic adalah dengan memuat file dengan
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 ambisonic yang sesuai yang menentukan jumlah saluran.
Contoh Ambionics
Contoh berikut memutar medan suara ambisonik menggunakan MediaPlayer
.
// Check spatial capabilities before using spatial audio
if (xrSession.getSpatialCapabilities().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(
xrSession,
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 saat ini tersedia dengan menggunakan
getSpatialCapabilities()
. - contentType dan usage bersifat informatif semata.
AMBISONICS_ORDER_FIRST_ORDER
memberi sinyal ke SceneCore bahwa file bidang suara menentukan empat saluran.