Fitur audio spasial di Jetpack SceneCore memungkinkan Anda membuat pengalaman audio imersif dalam aplikasi Android XR.
Audio spasial mensimulasikan cara pengguna merasakan suara di lingkungan 3D. Audio spasial menciptakan sensasi suara yang berasal dari segala arah, termasuk di atas dan di bawah pengguna. Sistem melakukan hal ini dengan mensimulasikan satu atau beberapa "speaker virtual" di lokasi tertentu dalam ruang 3D.
Aplikasi yang ada yang belum didesain atau diubah untuk Android XR akan memiliki audio yang secara otomatis di-spasialkan di Android XR. Saat pengguna bergerak di sekitar 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 memengaruhi volume audio secara halus 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 secara 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 posisi, stereo, suara surround, dan ambisonik.
Audio posisi
Audio posisi 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 masing-masing posisinya. Untuk merender audio posisi, file harus mono atau stereo.
Suara stereo dan surround yang di-spasialkan
Semua format media Android didukung untuk suara posisi, stereo, dan surround. Selain format ini, perangkat Android XR dapat mendukung format audio Dolby Atmos, Dolby Digital, dan Dolby Digital+.
Audio stereo mengacu pada format audio dengan dua saluran dan suara surround mengacu pada format audio dengan lebih dari dua saluran, seperti suara surround 5.1 atau suara surround 7.1 konfigurasi. Data suara setiap saluran dikaitkan dengan satu speaker. Misalnya, saat memutar musik dalam stereo, saluran speaker kiri dapat memancarkan trek instrumen yang berbeda dari saluran speaker 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, sedangkan suara helikopter yang terbang dapat menggunakan saluran yang berbeda secara berurutan untuk memberikan kesan bahwa helikopter terbang di sekitar ruang 3D Anda.
Audio ambisonik
Audio Ambisonik (atau ambisonik) seperti skybox untuk audio,
yang memberikan soundscape imersif bagi pengguna Anda. Gunakan ambisonik untuk suara lingkungan latar belakang atau skenario lain saat Anda ingin mereplikasi bidang suara sferis 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 memilih 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-spasialkan.
Memuat audio spasial
Anda dapat menggunakan salah satu API berikut untuk memuat audio spasial yang akan digunakan di Jetpack SceneCore.
SoundPool: Ideal untuk efek suara singkat yang berukuran kurang dari 1 MB, dimuat lebih awal dan suara dapat digunakan berulang kali. Ini adalah cara yang bagus untuk memuat audio untuk audio posisi.ExoPlayer: Ideal untuk memuat konten suara stereo dan surround seperti musik dan video. Juga memungkinkan pemutaran media di latar belakang.MediaPlayer: Menyediakan cara termudah untuk memuat audio ambisonik.AudioTrack: Memberikan kontrol paling besar atas cara memuat data audio. Memungkinkan penulisan buffer audio secara langsung atau jika Anda mensintesis atau mendekode file audio Anda sendiri.
Memeriksa dukungan format media
Beberapa format media didukung oleh platform Android. Namun, perangkat Android XR tertentu mungkin mendukung format tambahan, seperti
Dolby Atmos. Untuk membuat kueri dukungan format media, gunakan
AudioCapabilities ExoPlayer:
val audioCapabilities = AudioCapabilities.getCapabilities(context, androidx.media3.common.AudioAttributes.DEFAULT, null) if (audioCapabilities.supportsEncoding(C.ENCODING_AC3)) { // Device supports playback of the Dolby Digital media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3)) { // Device supports playback of the Dolby Digital Plus media format. } if (audioCapabilities.supportsEncoding(C.ENCODING_E_AC3_JOC)) { // Device supports playback of the Dolby Digital Plus with Dolby Atmos media format. }
Memeriksa kemampuan ini berpotensi melibatkan panggilan pemblokiran, dan tidak boleh dipanggil di thread utama.
Menambahkan audio posisi ke aplikasi Anda
Sumber suara posisi ditentukan oleh PointSourceParams dan
terkait Entity. Posisi dan orientasi Entity menentukan tempat PointSourceParams dirender dalam ruang 3D. Panggil
setPointSourceParams di
SpatialMediaPlayer untuk menetapkan PointSourceParams dan
terkait entity pada instance MediaPlayer.
Contoh audio posisi
Contoh berikut memuat file audio efek suara ke dalam sound pool dan memutarnya kembali di posisi Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.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-poin penting tentang kode
- Langkah pertama adalah memeriksa apakah kemampuan Audio Spasial tersedia
menggunakan
spatialCapabilities. - Menetapkan contentType ke
CONTENT_TYPE_SONIFICATIONdan penggunaan keUSAGE_ASSISTANCE_SONIFICATIONmemungkinkan sistem memperlakukan file audio ini sebagai efek suara. - Contoh sebelumnya memuat file audio ke dalam pool segera sebelum menggunakannya agar kode tetap bersama untuk memudahkan. Idealnya, Anda harus memuat semua efek suara secara asinkron saat memuat aplikasi sehingga semua file audio tersedia di pool 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 suara stereo dan surround
Dengan penempatan speaker suara surround, speaker suara surround virtual di posisikan dan diorientasikan relatif terhadap speaker tengah, di sekitar pengguna dalam konfigurasi ITU standar.
Secara default, speaker saluran tengah ditempatkan di aplikasi
mainPanelEntity. Hal ini mencakup aplikasi seluler yang audionya di-spasialkan 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 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 ruangnya, speaker virtual suara stereo dan surround akan bergerak dan menyesuaikan untuk memastikan speaker selalu berada di 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 menambatkan 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 sebagai Entity.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.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-poin penting tentang kode
- Seperti dalam contoh audio posisi , langkah pertama adalah memeriksa apakah
kemampuan audio spasial tersedia menggunakan
spatialCapabilities. - Menetapkan
contentTypekeAudioAttributes.CONTENT_TYPE_MUSICdan penggunaan keAudioAttributes.USAGE_MEDIAmemungkinkan sistem memperlakukan file audio ini sebagai suara surround.
Menambahkan bidang suara ambisonik ke aplikasi Anda
Cara termudah untuk memutar kembali bidang suara ambisonik adalah dengan memuat file menggunakan MediaPlayer. Karena suara ambisonik berlaku untuk seluruh soundscape, Anda tidak perlu menentukan Entity untuk memberikan posisi. Sebagai gantinya, Anda membuat instance SoundFieldAttributes dengan urutan ambisonik yang sesuai yang menentukan jumlah saluran.
Contoh ambisonik
Contoh berikut memutar bidang suara ambisonik menggunakan MediaPlayer.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AmbisonicsOrder.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-poin penting tentang kode
- Seperti cuplikan sebelumnya, langkah pertama adalah memeriksa apakah kemampuan Audio Spasial
tersedia menggunakan
hasCapability(). contentTypedan penggunaan bersifat informatif.- The
AMBISONICS_ORDER_FIRST_ORDERmemberi sinyal ke SceneCore bahwa file bidang suara menentukan empat saluran.