Le funzionalità di audio spaziale in Jetpack SceneCore ti consentono di creare esperienze audio immersive nelle 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 tutte le direzioni, inclusi sopra e sotto l'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. Man mano che l'utente si sposta nello spazio, tutto l'audio dell'app verrà emesso dal riquadro su cui viene eseguito il rendering dell'interfaccia utente dell'app. Ad esempio, se un timer si attiva da un'app orologio, l'audio sembrerà provenire dalla posizione del riquadro dell'app. Android XR modificherà automaticamente il suono per un realismo posizionale. Ad esempio, la distanza percepita tra il riquadro dell'app e l'utente influirà leggermente sul volume dell'audio per una maggiore sensazione di realismo.
Per ulteriori informazioni su come le app esistenti eseguono il rendering dell'audio spaziale, leggi Aggiungere audio stereo e surround all'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 all'angolo del tuo ambiente virtuale. Puoi avere più entità che emettono suoni dalle rispettive posizioni. Per eseguire il rendering dell'audio posizionale, i file devono essere 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 Dolby Atmos, Dolby Digital e Dolby Digital+ formati audio.
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, ad esempio le configurazioni audio surround 5.1 o 7.1. I dati audio di ogni canale sono associati a uno speaker. Ad esempio, quando si riproduce musica in stereo, il canale dello speaker sinistro potrebbe emettere tracce di strumenti diverse da quelle del canale dello speaker destro.
L'audio surround viene spesso utilizzato in film e programmi televisivi per migliorare il realismo e l'immersione tramite l'utilizzo di più canali di speaker. Ad esempio, i dialoghi vengono spesso riprodotti da un canale dello speaker centrale, mentre il suono di un elicottero che vola potrebbe utilizzare canali diversi in sequenza per dare la sensazione che l'elicottero stia volando intorno al tuo spazio 3D.
Audio ambisonico
L'audio ambisonico (o ambisonics) è come una skybox per l'audio,
che fornisce un paesaggio sonoro immersivo per gli utenti. Utilizza l'audio ambisonico per i suoni ambientali di sottofondo o in altri scenari in cui vuoi replicare un campo sonoro sferico completo che circonda l'ascoltatore. Android XR supporta il formato audio ambisonico
AmbiX negli ambisonics di primo, secondo e terzo ordine. Ti consigliamo i tipi di file Opus (.ogg) e
PCM/Wave (.wav).
Utilizzare l'audio spaziale con Jetpack SceneCore
L'implementazione dell'audio spaziale con Jetpack SceneCore prevede il controllo delle funzionalità spaziali e la scelta di un'API per il caricamento dell'audio spaziale.
Controllare le funzionalità spaziali
Prima di utilizzare le funzionalità di audio spaziale, verifica che il Session supporti
l'audio spaziale. In tutti gli snippet di codice nelle sezioni seguenti, le funzionalità vengono controllate prima di tentare di riprodurre l'audio spazializzato.
Caricare l'audio spaziale
Puoi utilizzare una delle seguenti API per caricare l'audio spaziale da utilizzare in Jetpack SceneCore.
SoundPool: ideale per effetti sonori brevi di dimensioni inferiori a 1 MB, vengono caricati in anticipo e i suoni possono essere utilizzati ripetutamente. È 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 anche la riproduzione di contenuti multimediali in background.MediaPlayer: fornisce il modo più semplice per caricare l'audio ambisonico.AudioTrack: fornisce il massimo controllo sulla modalità di caricamento dei dati audio. Consente di scrivere direttamente i buffer audio o se hai sintetizzato o decodificato i tuoi file audio.
Controllare il supporto del formato multimediale
Alcuni formati multimediali sono supportati dalla piattaforma Android. Tuttavia, un
determinato dispositivo Android XR potrebbe supportare formati aggiuntivi, come
Dolby Atmos. Per eseguire una query per il supporto del formato multimediale, utilizza
AudioCapabilities di 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. }
Il controllo di queste funzionalità potrebbe comportare chiamate di blocco e non deve essere eseguito sul thread principale.
Aggiungere audio posizionale all'app
Le sorgenti sonore posizionali sono definite da PointSourceParams e da un
associato Entity. La posizione e l'orientamento di Entity determinano la posizione in cui viene eseguito il rendering di PointSourceParams nello spazio 3D. Chiama
setPointSourceParams sul
SpatialMediaPlayer per impostare PointSourceParams e
la relativa entity su un'istanza di 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(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 }
Punti chiave del codice
- Il primo passaggio consiste nel verificare se le funzionalità di audio spaziale sono
disponibili utilizzando
spatialCapabilities. - L'impostazione di contentType su
CONTENT_TYPE_SONIFICATIONe l'utilizzo suUSAGE_ASSISTANCE_SONIFICATIONconsente al sistema di trattare questo file audio come un effetto sonoro. - L'esempio precedente carica il file audio nel pool immediatamente prima di utilizzarlo per mantenere il codice insieme per semplicità. Idealmente, dovresti caricare in modo asincrono tutti gli effetti sonori durante il caricamento dell'app, in modo che tutti i file audio siano disponibili nel pool quando ne hai bisogno.
Aggiungere audio stereo e surround all'app
Il modo consigliato per aggiungere audio stereo e surround all'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 speaker audio surround, gli speaker audio surround virtuali vengono posizionati e orientati rispetto a uno speaker centrale, intorno all'utente in una configurazione ITU standard.
Per impostazione predefinita, lo speaker del canale centrale viene 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 all'audio surround, tranne per il fatto che solo i canali sinistro e destro sono posizionati rispettivamente sul lato sinistro e destro del riquadro.
Se hai più riquadri e vuoi scegliere quale riquadro emette l'audio o se vuoi che l'audio stereo o surround venga eseguito il rendering rispetto a un'altra 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.
Man mano che l'utente si sposta nello spazio, gli speaker virtuali stereo e audio surround si sposteranno e si adatteranno per garantire che gli speaker siano sempre in una posizione ottimale.
Se hai configurato MediaPlayer o ExoPlayer per continuare
a riprodurre audio stereo o surround in background, il posizionamento degli speaker virtuali verrà modificato quando l'app viene eseguita in background. Poiché non esiste un riquadro o un altro punto nello spazio a cui ancorare l'audio, l'audio spaziale si sposta con l'utente (in altre parole, è "bloccato alla testa").
Esempio di audio surround
L'esempio seguente carica un file audio 5.1 utilizzando MediaPlayer e imposta il canale centrale del file come 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 }
Punti chiave del codice
- Come nell'esempio di audio posizionale , il primo passaggio consiste nel verificare se
le funzionalità di audio spaziale sono disponibili utilizzando
spatialCapabilities. - L'impostazione di
contentTypesuAudioAttributes.CONTENT_TYPE_MUSICe l'utilizzo suAudioAttributes.USAGE_MEDIAconsente al sistema di trattare questo file audio come audio surround.
Aggiungere campi sonori ambisonici all'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 una Entity per fornire una posizione. Crea invece un'
istanza di SoundFieldAttributes con l'ordine ambisonico
appropriato che specifica il numero di canali.
Esempio di ambisonics
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 del codice
- Come negli snippet precedenti, il primo passaggio consiste nel verificare se le funzionalità di audio spaziale
sono disponibili utilizzando
hasCapability(). contentTypee l'utilizzo sono puramente informativi.- Il
AMBISONICS_ORDER_FIRST_ORDERindica a SceneCore che il file del campo sonoro definisce quattro canali.