Os recursos de áudio espacial no Jetpack SceneCore permitem criar experiências de áudio imersivas nos seus aplicativos Android XR.
O áudio espacial simula como os usuários percebem o som em um ambiente 3D. Ele cria a sensação de que o som vem de todas as direções, incluindo de cima e de baixo do usuário. O sistema faz isso simulando um ou mais "alto-falantes virtuais" em locais específicos no espaço 3D.
Os apps que não foram projetados ou modificados para o Android XR têm o áudio espacializado automaticamente no Android XR. Conforme o usuário se move pelo espaço, todo o áudio do app é emitido pelo painel em que a interface do app é renderizada. Por exemplo, se um timer for acionado em um app de relógio, o áudio vai parecer vir da posição do painel do app. O Android XR vai alterar automaticamente o som para dar realismo posicional. Por exemplo, a distância percebida entre o painel do app e o usuário vai afetar sutilmente o volume do áudio para uma maior sensação de realismo.
Para mais informações sobre como os apps renderizam áudio espacial, leia Adicionar som estéreo e surround ao app nesta página.
Se você estiver otimizando seu app para XR, o Jetpack SceneCore oferece ferramentas para personalização avançada de áudio espacial. É possível posicionar sons com precisão no ambiente 3D, usar áudio ambisônico para campos sonoros realistas e aproveitar a integração de som surround integrada.
Tipos de áudio espacial disponíveis no Android XR
O Android XR é compatível com áudio posicional, estéreo, som surround e ambisônico.
Áudio posicional
Um áudio posicional pode ser configurado para tocar em um ponto específico no espaço 3D. Por exemplo, é possível ter um modelo 3D de um cachorro latindo no canto do seu ambiente virtual. É possível ter várias entidades emitindo som de cada uma das respectivas posições. Para renderizar áudio posicional, os arquivos precisam ser mono ou estéreo.
Som surround e estéreo espacializado
Todos os formatos de mídia do Android são compatíveis com som posicional, estéreo e surround. Além desses formatos, os dispositivos Android XR podem oferecer suporte aos formatos de áudio Dolby Atmos, Dolby Digital e Dolby Digital+.
O áudio estéreo se refere a formatos de áudio com dois canais, e o som surround se refere a formatos de áudio com mais de dois canais, como as configurações de som surround 5.1 ou som surround 7.1. Os dados de som de cada canal são associados a um locutor. Por exemplo, ao tocar música em estéreo, o canal do alto-falante esquerdo pode emitir faixas de instrumentos diferentes do direito.
O som surround é frequentemente usado em filmes e programas de televisão para aumentar o realismo e a imersão usando vários canais de alto-falantes. Por exemplo, o diálogo geralmente é reproduzido em um canal de alto-falante central, enquanto o som de um helicóptero voando pode usar canais diferentes em sequência para dar a sensação de que o helicóptero está voando pelo espaço 3D.
Áudio ambisônico
O áudio ambisônico (ou ambisônica) é como um skybox para áudio,
proporcionando uma paisagem sonora imersiva para os usuários. Use ambisonics para sons ambientes de fundo ou outros cenários em que você queira replicar um campo sonoro esférico completo que envolva o ouvinte. O Android XR é compatível com o formato de áudio ambisônico
AmbiX em ambisônicos de primeira, segunda e terceira
ordem. Recomendamos os tipos de arquivo Opus (.ogg) e PCM/Wave (.wav).
Usar áudio espacial com o Jetpack SceneCore
A implementação do áudio espacial com o Jetpack SceneCore envolve verificar os recursos espaciais e escolher uma API para carregar o áudio espacial.
Verificar recursos espaciais
Antes de usar os recursos de áudio espacial, verifique se o Session é compatível com
esse tipo de áudio. Em todos os snippets de código nas seções a seguir,
as capacidades são verificadas antes de tentar tocar áudio espacializado.
Carregar áudio espacial
É possível usar qualquer uma das APIs a seguir para carregar áudio espacial para uso no Jetpack SceneCore.
SoundPool: ideal para efeitos sonoros curtos com menos de 1 MB, que são carregados com antecedência e podem ser usados repetidamente. Essa é uma ótima maneira de carregar áudio para áudio posicional.ExoPlayer: ideal para carregar conteúdo de som estéreo e surround, como músicas e vídeos. Também permite a reprodução de mídia em segundo plano.MediaPlayer: fornece a maneira mais simples de carregar áudio ambisônico.AudioTrack: oferece o maior controle sobre como carregar dados de áudio. Permite gravar diretamente buffers de áudio ou se você sintetizou ou decodificou seus próprios arquivos de áudio.
Verificar se há suporte para o formato de mídia
Alguns formatos de mídia são compatíveis com a plataforma Android. No entanto, um
dispositivo Android XR específico pode ser compatível com outros formatos, como
Dolby Atmos. Para consultar o suporte ao formato de mídia, use o
AudioCapabilities do 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. }
A verificação desses recursos pode envolver chamadas de bloqueio e não deve ser chamada na linha de execução principal.
Adicionar áudio posicional ao app
As fontes de som posicionais são definidas por PointSourceParams e um
Entity associado. A posição e a orientação do Entity determinam
onde o PointSourceParams é renderizado no espaço 3D. Chame
setPointSourceParams no
SpatialMediaPlayer para definir o PointSourceParams e
o entity associado em uma instância MediaPlayer.
Exemplo de áudio posicional
O exemplo a seguir carrega um arquivo de áudio de efeito sonoro em um pool de som e
o reproduz na posição do 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 }
Pontos principais sobre o código
- A primeira etapa é verificar se os recursos de áudio espacial estão
disponíveis usando
spatialCapabilities. - Definir contentType como
CONTENT_TYPE_SONIFICATIONe usage comoUSAGE_ASSISTANCE_SONIFICATIONpermite que o sistema trate esse arquivo de áudio como um efeito sonoro. - O exemplo anterior carrega o arquivo de áudio no pool imediatamente antes de usá-lo para manter o código unido, para simplificar. O ideal é carregar todos os efeitos sonoros de forma assíncrona ao carregar o app para que todos os arquivos de áudio estejam disponíveis no pool quando você precisar deles.
Adicionar som estéreo e surround ao app
A maneira recomendada de adicionar som estéreo e surround ao app é usando
Exoplayer. Para mais informações sobre como usar o Áudio Espacial com o Exoplayer,
consulte o guia de Áudio Espacial.
Posicionamento de alto-falantes estéreo e de som surround
Com o posicionamento de alto-falantes de som surround, os alto-falantes virtuais são posicionados e orientados em relação a um alto-falante central, ao redor do usuário em uma configuração padrão da ITU.
Por padrão, o alto-falante do canal central é colocado no
mainPanelEntity do app. Isso inclui apps para dispositivos móveis que têm o áudio
espacializado automaticamente pelo Android XR.
Para estéreo, o posicionamento dos alto-falantes é semelhante ao som surround, mas apenas com os canais esquerdo e direito posicionados no lado esquerdo e direito do painel, respectivamente.
Se você tiver vários painéis e quiser escolher qual deles emite áudio ou
se quiser que o áudio estéreo ou surround seja renderizado em relação a outro Entity,
use o PointSourceAttributes para definir o local do canal
central. Os canais restantes serão colocados conforme mencionado anteriormente. Nessas
situações, você também precisa usar MediaPlayer.
Conforme o usuário se move pelo espaço, os alto-falantes virtuais estéreo e de som surround se movem e se ajustam para garantir que estejam sempre em uma posição ideal.
Se você tiver configurado o MediaPlayer ou o ExoPlayer para continuar
reproduzindo som estéreo ou som surround em segundo plano, o posicionamento do alto-falante virtual
será alterado quando o app estiver em segundo plano. Como não há
painel ou outro ponto no espaço para ancorar o som, o áudio espacial se move
com o usuário (ou seja, ele fica "preso à cabeça").
Exemplo de som surround
O exemplo a seguir carrega um arquivo de áudio 5.1 usando MediaPlayer e define o
canal central do arquivo como 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 }
Pontos principais sobre o código
- Como no exemplo de áudio posicional, a primeira etapa é verificar se
os recursos de áudio espacial estão disponíveis usando
spatialCapabilities. - Definir o
contentTypecomoAudioAttributes.CONTENT_TYPE_MUSICe o uso comoAudioAttributes.USAGE_MEDIApermite que o sistema trate esse arquivo de áudio como som surround.
Adicionar campos de som ambisônico ao app
A maneira mais simples de reproduzir campos de som ambisônicos é carregar o arquivo com
um MediaPlayer. Como o som ambisônico se aplica a toda a paisagem sonora, não é necessário especificar um Entity para fornecer uma posição. Em vez disso, crie uma
instância de SoundFieldAttributes com a ordem ambisônica
adequada especificando o número de canais.
Exemplo da Ambionics
O exemplo a seguir reproduz um campo de som ambisônico usando 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 }
Pontos principais sobre o código
- Assim como nos snippets anteriores, a primeira etapa é verificar se os recursos de áudio espacial
estão disponíveis usando
spatialCapabilities. - O
contentTypee o uso são puramente informativos. - O
SpatializerConstants.AmbisonicsOrder.FIRST_ORDERsinaliza ao SceneCore que o arquivo de campo de som define quatro canais.