Les fonctionnalités audio spatial de Jetpack SceneCore vous permettent de créer des expériences audio immersives dans vos applications Android XR.
L'audio spatial simule la façon dont les utilisateurs perçoivent le son dans un environnement 3D. Il crée la sensation que le son émane de toutes les directions, y compris au-dessus et en dessous de l'utilisateur. Pour ce faire, le système simule un ou plusieurs "haut-parleurs virtuels" à des emplacements spécifiques dans l'espace 3D.
L'audio des applications existantes qui n'ont pas été conçues ni modifiées pour Android XR est automatiquement spatialisé dans Android XR. Lorsque l'utilisateur se déplace dans son espace, tout l'audio de l'application est émis par le panneau sur lequel l'interface utilisateur de l'application est affichée. Par exemple, si un minuteur se déclenche dans une application d'horloge, le son semble provenir de la position du panneau de l'application. Android XR modifie automatiquement le son pour un réalisme positionnel. Par exemple, la distance perçue entre le panneau de l'application et l'utilisateur a un impact subtil sur le volume audio pour un plus grand réalisme.
Pour en savoir plus sur la façon dont les applications existantes rendent l'audio spatial, consultez la section Ajouter un son stéréo et surround à votre application sur cette page.
Si vous optimisez votre application pour la XR, Jetpack SceneCore fournit des outils pour une personnalisation avancée de l'audio spatial. Vous pouvez positionner précisément les sons dans l'environnement 3D, utiliser l'audio ambisonique pour des champs sonores réalistes et profiter de l'intégration du son surround.
Types d'audio spatial disponibles dans Android XR
Android XR est compatible avec l'audio positionnel, stéréo, surround et ambisonique.
Audio positionnel
Un audio positionnel peut être positionné pour être lu à partir d'un point spécifique dans l'espace 3D. Par exemple, vous pouvez avoir un modèle 3D d'un chien qui aboie au coin de votre environnement virtuel. Vous pouvez avoir plusieurs entités émettant du son à partir de leurs positions respectives. Pour rendre l'audio positionnel, les fichiers doivent être mono ou stéréo.
Stéréo et son surround spatialisés
Tous les formats multimédias Android sont compatibles avec l'audio positionnel, stéréo et son surround. En plus de ces formats, les appareils Android XR peuvent être compatibles avec les formats audio Dolby Atmos, Dolby Digital et Dolby Digital+.
L'audio stéréo fait référence aux formats audio à deux canaux, et le son surround fait référence aux formats audio à plus de deux canaux, tels que les configurations de son surround 5.1ou 7.1. Les données sonores de chaque canal sont associées à un haut-parleur. Par exemple, lorsque vous écoutez de la musique en stéréo, le canal du haut-parleur gauche peut émettre des pistes d'instruments différentes de celles du haut-parleur droit.
Le son surround est souvent utilisé dans les films et les émissions de télévision pour améliorer le réalisme et l'immersion grâce à l'utilisation de plusieurs canaux de haut-parleurs. Par exemple, les dialogues sont souvent diffusés par un canal de haut-parleur central, tandis que le son d'un hélicoptère peut utiliser différents canaux dans une séquence pour donner l'impression que l'hélicoptère vole autour de votre espace 3D.
Audio ambisonique
L'audio ambisonique (ou ambisonique) est comme une skybox pour l'audio,
offrant un paysage sonore immersif à vos utilisateurs. Utilisez l'ambisonique pour les sons ambiants en arrière-plan ou d'autres scénarios dans lesquels vous souhaitez reproduire un champ sonore sphérique complet qui entoure l'auditeur. Android XR est compatible avec le format audio ambisonique
AmbiX dans les ambisoniques de premier, deuxième et troisième ordre. Nous vous recommandons les Opus (.ogg) et
PCM/Wave (.wav) types de fichiers.
Utiliser l'audio spatial avec Jetpack SceneCore
L'implémentation de l'audio spatial avec Jetpack SceneCore implique de vérifier les fonctionnalités spatiales et de choisir une API pour charger l'audio spatial.
Vérifier les fonctionnalités spatiales
Avant d'utiliser les fonctionnalités audio spatial, vérifiez que le Session prend en charge
l'audio spatial. Dans tous les extraits de code des sections suivantes, les fonctionnalités sont vérifiées avant de tenter de lire l'audio spatialisé.
Charger l'audio spatial
Vous pouvez utiliser l'une des API suivantes pour charger l'audio spatial à utiliser dans Jetpack SceneCore.
SoundPool: idéal pour les effets sonores courts de moins de 1 Mo, ils sont chargés à l'avance et peuvent être utilisés à plusieurs reprises. Il s'agit d'un excellent moyen de charger l'audio pour l'audio positionnel.ExoPlayer: idéal pour charger du contenu stéréo et son surround tel que de la musique et des vidéos. Permet également la lecture de contenus multimédias en arrière-plan.MediaPlayer: fournit le moyen le plus simple de charger l'audio ambisonique.AudioTrack: offre le plus de contrôle sur la façon de charger les données audio. Permet d'écrire directement des tampons audio ou si vous avez synthétisé ou décodé vos propres fichiers audio.
Vérifier la compatibilité des formats multimédias
Certains formats multimédias sont compatibles avec la plate-forme Android. Toutefois, un
appareil Android XR particulier peut être compatible avec des formats supplémentaires, tels que
Dolby Atmos. Pour interroger la compatibilité des formats multimédias, utilisez
AudioCapabilities d'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. }
La vérification de ces fonctionnalités peut impliquer le blocage des appels et ne doit pas être appelée sur le thread principal.
Ajouter un audio positionnel à votre application
Les sources sonores positionnelles sont définies par PointSourceParams et un
associé Entity. La position et l'orientation de l'Entity déterminent l'emplacement où PointSourceParams est rendu dans l'espace 3D. Appelez
setPointSourceParams sur le
SpatialMediaPlayer pour définir le PointSourceParams et
son entity associé sur une instance MediaPlayer.
Exemple d'audio positionnel
L'exemple suivant charge un fichier audio d'effet sonore dans un pool de sons et le lit à la position de l'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 }
Points clés concernant le code
- La première étape consiste à vérifier si les fonctionnalités audio spatial sont
disponibles à l'aide de
spatialCapabilities. - La définition de contentType sur
CONTENT_TYPE_SONIFICATIONet de l'utilisation surUSAGE_ASSISTANCE_SONIFICATIONpermet au système de traiter ce fichier audio comme un effet sonore. - L'exemple précédent charge le fichier audio dans le pool immédiatement avant de l'utiliser pour simplifier le code. Idéalement, vous devez charger tous vos effets sonores de manière asynchrone lorsque vous chargez votre application afin que tous les fichiers audio soient disponibles dans le pool lorsque vous en avez besoin.
Ajouter un son stéréo et surround à votre application
La méthode recommandée pour ajouter un son stéréo et surround à votre application consiste à utiliser Exoplayer. Pour en savoir plus sur l'utilisation de l'audio spatial avec Exoplayer,
consultez le guide Audio spatial.
Positionnement des haut-parleurs stéréo et son surround
Avec le positionnement des haut-parleurs surround, les haut-parleurs surround virtuels sont positionnés et orientés par rapport à un haut-parleur central, autour de l'utilisateur dans une configuration ITU standard.
Par défaut, le haut-parleur du canal central est placé sur le
mainPanelEntity de l'application. Cela inclut les applications mobiles dont l'audio est spatialisé automatiquement par Android XR.
Pour la stéréo, le placement des haut-parleurs est semblable à celui du son surround, à l'exception des canaux gauche et droit qui sont positionnés respectivement sur les côtés gauche et droit du panneau.
Si vous avez plusieurs panneaux et que vous souhaitez choisir celui qui émet de l'audio, ou si vous souhaitez que l'audio stéréo ou surround soit rendu par rapport à une autre Entity, vous pouvez utiliser PointSourceAttributes pour définir l'emplacement du canal central. Les canaux restants seront placés comme indiqué précédemment. Dans ces
cas, vous devez également utiliser MediaPlayer.
Lorsque l'utilisateur se déplace dans son espace, les haut-parleurs virtuels stéréo et son surround se déplacent et s'ajustent pour s'assurer qu'ils sont toujours dans une position optimale.
Si vous avez configuré MediaPlayer ou ExoPlayer pour continuer
à lire le son stéréo ou surround en arrière-plan, le positionnement des haut-parleurs virtuels sera modifié lorsque l'application sera en arrière-plan. Comme il n'y a pas de panneau ni d'autre point dans l'espace pour ancrer le son, l'audio spatial se déplace avec l'utilisateur (en d'autres termes, il est "verrouillé sur la tête").
Exemple de son surround
L'exemple suivant charge un fichier audio 5.1 à l'aide de MediaPlayer et définit le canal central du fichier comme 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 }
Points clés concernant le code
- Comme dans l'exemple d'audio positionnel, la première étape consiste à vérifier si les fonctionnalités audio
spatial sont disponibles à l'aide de
spatialCapabilities. - La définition de
contentTypesurAudioAttributes.CONTENT_TYPE_MUSICet de l'utilisation surAudioAttributes.USAGE_MEDIApermet au système de traiter ce fichier audio comme un son surround.
Ajouter des champs sonores ambisoniques à votre application
Le moyen le plus simple de lire des champs sonores ambisoniques consiste à charger le fichier avec un MediaPlayer. Étant donné que le son ambisonique s'applique à l'ensemble du paysage sonore, vous n'avez pas besoin de spécifier d'Entity pour fournir une position. Au lieu de cela, vous créez une
instance de SoundFieldAttributes avec l'ordre ambisonique
approprié spécifiant le nombre de canaux.
Exemple d'ambisonique
L'exemple suivant lit un champ sonore ambisonique à l'aide de 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 }
Points clés concernant le code
- Comme pour les extraits précédents, la première étape consiste à vérifier si les fonctionnalités audio spatial
sont disponibles à l'aide de
hasCapability(). - Le
contentTypeet l'utilisation sont purement informatifs. - The
AMBISONICS_ORDER_FIRST_ORDERsignale à SceneCore que le fichier de champ sonore définit quatre canaux.