Le funzionalità di audio spaziale di Jetpack SceneCore ti consentono di creare esperienze audio immersive all'interno delle tue applicazioni Android XR.
L'audio spaziale simula il modo in cui gli utenti percepiscono il suono in un ambiente 3D. Crea la sensazione che il suono provenga da ogni direzione, anche dall'alto e dal basso rispetto all'utente. Il sistema lo fa simulando uno o più "speaker virtuali" in posizioni specifiche nello spazio 3D.
L'audio delle app esistenti che non sono state progettate o modificate per Android XR viene spazializzato automaticamente in Android XR. Mentre l'utente si sposta nello spazio, tutto l'audio dell'app verrà emesso dal pannello su cui viene eseguito il rendering della UI dell'app. Ad esempio, se un timer si attiva da un'app di orologio, l'audio sembrerà provenire dalla posizione del riquadro dell'app. Android XR modificherà automaticamente l'audio per un realismo posizionale. Ad esempio, la distanza percepita tra il riquadro dell'app e l'utente influirà leggermente sul volume dell'audio per un maggiore senso di realismo.
Per ulteriori informazioni su come le app esistenti eseguono il rendering dell'audio spaziale, leggi Aggiungi l'audio stereo e surround alla tua app in questa pagina.
Se stai ottimizzando la tua app per XR, Jetpack SceneCore fornisce strumenti per la personalizzazione avanzata dell'audio spaziale. Puoi posizionare con precisione i suoni nell'ambiente 3D, utilizzare l'audio ambisonico per campi sonori realistici e sfruttare l'integrazione dell'audio surround integrato.
Tipi di audio spaziale disponibili in Android XR
Android XR supporta l'audio posizionale, stereo, surround e ambisonico.
Audio posizionale
Un audio posizionale può essere posizionato in modo da essere riprodotto da un punto specifico nello spazio 3D. Ad esempio, puoi avere un modello 3D di un cane che abbaia nell'angolo del tuo ambiente virtuale. Puoi avere più entità che emettono suoni da ciascuna delle rispettive posizioni. Per eseguire il rendering dell'audio posizionale, i file devono essere in formato mono o stereo.
Audio stereo e surround spazializzato
Tutti i formati multimediali Android sono supportati per l'audio posizionale, stereo e surround. Oltre a questi formati, i dispositivi Android XR potrebbero supportare i formati audio Dolby Atmos, Dolby Digital e Dolby Digital+.
L'audio stereo si riferisce ai formati audio con due canali, mentre l'audio surround si riferisce ai formati audio con più di due canali, come le configurazioni con audio surround 5.1 o audio surround 7.1. I dati audio di ogni canale sono associati a un altoparlante. Ad esempio, quando ascolti musica in stereo, il canale dello speaker sinistro potrebbe emettere tracce di strumenti diverse rispetto a quello destro.
L'audio surround viene spesso utilizzato nei film e nei programmi TV per migliorare il realismo e l'immersione attraverso l'uso di più canali di altoparlanti. Ad esempio, i dialoghi vengono spesso riprodotti da un canale dell'altoparlante centrale, mentre il suono di un elicottero in volo può utilizzare canali diversi in sequenza per dare l'impressione che l'elicottero stia volando nello spazio 3D.
Audio ambisonico
L'audio ambisonico (o ambisonics) è come uno skybox per l'audio,
che offre un'esperienza sonora immersiva per gli utenti. Utilizza l'audio ambisonico per i suoni ambientali di sottofondo o per altri scenari in cui vuoi replicare un campo sonoro sferico completo che circonda l'ascoltatore. Android XR supporta il formato audio ambisonico AmbiX in ambisonica di primo, secondo e terzo ordine. Consigliamo i tipi di file Opus (.ogg) e PCM/Wave (.wav).
Utilizza l'audio spaziale con Jetpack SceneCore
L'implementazione dell'audio spaziale con Jetpack SceneCore prevede la verifica delle funzionalità spaziali e la scelta di un'API per il caricamento dell'audio spaziale.
Verifica le funzionalità spaziali
Prima di utilizzare le funzionalità di audio spaziale, verifica che Session supporti
l'audio spaziale. In tutti gli snippet di codice delle sezioni seguenti,
le funzionalità vengono controllate prima di tentare di riprodurre l'audio spazializzato.
Carica l'audio spaziale
Puoi utilizzare una delle seguenti API per caricare l'audio spaziale da utilizzare in Jetpack SceneCore.
SoundPool: ideale per brevi effetti sonori di dimensioni inferiori a 1 MB, vengono caricati in anticipo e i suoni possono essere utilizzati ripetutamente. Questo è un ottimo modo per caricare l'audio per l'audio posizionale.ExoPlayer: ideale per caricare contenuti audio stereo e surround, come musica e video. Consente inoltre la riproduzione di contenuti multimediali in background.MediaPlayer: fornisce il modo più semplice per caricare l'audio ambisonico.AudioTrack: offre il massimo controllo sul modo in cui caricare i dati audio. Consente di scrivere direttamente i buffer dell'audio o se hai sintetizzato o decodificato i tuoi file audio.
Controlla il supporto del formato multimediale
Alcuni formati multimediali sono supportati dalla piattaforma Android. Tuttavia, un
particolare dispositivo Android XR potrebbe supportare formati aggiuntivi, come
Dolby Atmos. Per eseguire query sul supporto dei formati multimediali, utilizza AudioCapabilities di ExoPlayer:
val audioCapabilities = AudioCapabilities.getCapabilities( context, androidx.media3.common.AudioAttributes.DEFAULT, null, emptyList() ) 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. }
Il controllo di queste funzionalità potrebbe comportare il blocco delle chiamate e non deve essere chiamato nel thread principale.
Aggiungi l'audio posizionale alla tua app
Le sorgenti audio posizionali sono definite da PointSourceParams e da un Entity associato. La posizione e l'orientamento di Entity determinano dove viene eseguito il rendering di PointSourceParams nello spazio 3D. Chiama
setPointSourceParams su
SpatialMediaPlayer per impostare PointSourceParams e
il relativo entity su un'istanza MediaPlayer.
Esempio di audio posizionale
L'esempio seguente carica un file audio di effetti sonori in un pool di suoni e lo riproduce nella posizione di 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() 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, entity = entity, soundPool = soundPool, soundID = pointSoundId, params = pointSource, volume = maxVolume, priority = lowPriority, loop = infiniteLoop, rate = normalSpeed ) } } } else { // The session does not have spatial audio capabilities }
Punti chiave sul codice
- Il primo passaggio consiste nel verificare se le funzionalità di audio spaziale sono disponibili utilizzando
spatialCapabilities. - Se imposti contentType su
CONTENT_TYPE_SONIFICATIONe usage suUSAGE_ASSISTANCE_SONIFICATION, il sistema tratta questo file audio come un effetto sonoro. - L'esempio precedente carica il file audio nel pool immediatamente prima di utilizzarlo per mantenere il codice unito per semplicità. Idealmente, dovresti caricare tutti gli effetti sonori in modo asincrono durante il caricamento dell'app, in modo che tutti i file audio siano disponibili nel pool quando ne hai bisogno.
Aggiungi l'audio stereo e surround alla tua app
Il modo consigliato per aggiungere l'audio stereo e surround alla tua app è utilizzare
Exoplayer. Per ulteriori informazioni su come utilizzare l'audio spaziale con Exoplayer,
consulta la guida all'audio spaziale.
Posizionamento degli speaker stereo e audio surround
Con il posizionamento degli altoparlanti audio surround, gli altoparlanti audio surround virtuali sono posizionati e orientati rispetto a un altoparlante centrale, intorno all'utente in una configurazione ITU standard.
Per impostazione predefinita, l'altoparlante del canale centrale è posizionato su mainPanelEntity dell'app. Sono incluse le app mobile il cui audio viene spazializzato automaticamente da Android XR.
Per l'audio stereo, il posizionamento degli speaker è simile a quello dell'audio surround, con la differenza che solo i canali sinistro e destro sono posizionati rispettivamente sul lato sinistro e destro del pannello.
Se hai più pannelli e vuoi scegliere quale pannello emette l'audio o se vuoi che l'audio stereo o surround venga visualizzato in relazione a un altro Entity, puoi utilizzare PointSourceAttributes per definire la posizione del canale centrale. I canali rimanenti verranno posizionati come indicato in precedenza. In queste situazioni, devi utilizzare anche MediaPlayer.
Mentre l'utente si sposta nello spazio, gli speaker virtuali stereo e audio surround si spostano e si regolano per garantire che siano sempre in una posizione ottimale.
Se hai configurato MediaPlayer o ExoPlayer per continuare
a riprodurre l'audio stereo o audio surround in background, il posizionamento degli speaker virtuali
verrà modificato quando l'app viene eseguita in background. Poiché non esiste un pannello o un altro punto nello spazio a cui ancorare il suono, l'audio spaziale si sposta con l'utente (in altre parole, è "bloccato sulla testa").
Esempio di audio surround
L'esempio seguente carica un file audio 5.1 utilizzando MediaPlayer e imposta il canale centrale del file su 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() 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, entity = session.scene.mainPanelEntity, ) mediaPlayer.setAudioAttributes(audioAttributes) mediaPlayer.prepare() mediaPlayer.start() } else { // The session does not have spatial audio capabilities }
Punti chiave sul codice
- Come nell'esempio di audio posizionale, il primo passaggio consiste nel verificare se
le funzionalità di audio spaziale sono disponibili utilizzando
spatialCapabilities. - Impostando
contentTypesuAudioAttributes.CONTENT_TYPE_MUSICe l'utilizzo suAudioAttributes.USAGE_MEDIA, il sistema può trattare questo file audio come audio surround.
Aggiungi campi sonori ambisonici alla tua app
Il modo più semplice per riprodurre i campi sonori ambisonici è caricare il file con un MediaPlayer. Poiché l'audio ambisonico si applica all'intero paesaggio sonoro, non è necessario specificare un Entity per fornire una posizione. Devi invece creare un'istanza di SoundFieldAttributes con l'ordine ambisonico appropriato specificando il numero di canali.
Esempio di Ambionics
L'esempio seguente riproduce un campo sonoro ambisonico utilizzando 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 }
Punti chiave sul codice
- Come per gli snippet precedenti, il primo passaggio consiste nel verificare se le funzionalità di audio spaziale sono disponibili utilizzando
spatialCapabilities. - La
contentTypee l'utilizzo sono puramente informativi. SpatializerConstants.AmbisonicsOrder.FIRST_ORDERindica a SceneCore che il file del campo sonoro definisce quattro canali.