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 donne l'impression 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.
Le son 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, tous les sons de l'application sont é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, l'audio 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 aura 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 Ajouter le 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 personnaliser l'audio spatial de manière avancée. 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 de son spatial disponibles dans Android XR
Android XR est compatible avec l'audio positionnel, stéréo, surround et ambisonique.
Audio positionnel
Un son positionnel peut être configuré pour être diffusé à 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 que l'audio positionnel soit rendu, les fichiers doivent être mono ou stéréo.
Stéréo spatialisée et son surround
Tous les formats multimédias Android sont acceptés pour le son positionnel, stéréo et surround.
L'audio stéréo fait référence aux formats audio à deux canaux, tandis que le son surround fait référence aux formats audio à plus de deux canaux, tels que les configurations son surround 5.1 ou son surround 7.1. Les données audio de chaque canal sont associées à un locuteur. Par exemple, lorsque vous écoutez de la musique en stéréo, le canal de l'enceinte de gauche peut émettre des pistes d'instruments différentes de celles de l'enceinte de droite.
Le son surround est souvent utilisé dans les films et les séries télévisées 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 le canal du haut-parleur central, tandis que le son d'un hélicoptère en vol peut utiliser différents canaux de manière séquentielle pour donner l'impression que l'hélicoptère vole dans votre espace 3D.
Audio ambisonique
L'audio ambisonique (ou ambisonics) est comme une skybox pour l'audio. Il offre un paysage sonore immersif à vos utilisateurs. Utilisez l'ambisonics pour les sons ambiants en arrière-plan ou dans d'autres scénarios où vous souhaitez reproduire un champ sonore sphérique complet qui entoure l'auditeur. Android XR est compatible avec le format audio ambisonique AmbiX pour les sons ambisoniques de premier, deuxième et troisième ordre. Nous vous recommandons les types de fichiers Opus (.ogg
) et PCM/Wave (.wav
).
Utiliser le son spatial avec Jetpack SceneCore
L'implémentation du son spatial avec Jetpack SceneCore implique de vérifier les capacités spatiales et de choisir une API pour charger le son spatial.
Vérifier les capacités spatiales
Avant d'utiliser les fonctionnalités audio spatial, vérifiez que Session
est compatible avec l'audio spatial. Dans tous les extraits de code des sections suivantes, les fonctionnalités sont vérifiées avant toute tentative de lecture audio spatialisé.
Charger le son 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 les sons peuvent être utilisés à plusieurs reprises. C'est un excellent moyen de charger l'audio pour l'audio positionnel.ExoPlayer
: idéal pour charger des contenus stéréo et surround, comme 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.
Ajouter de l'audio positionnel à votre application
Les sources sonores positionnelles sont définies par PointSourceParams
et un Entity
associé. La position et l'orientation de Entity
déterminent où PointSourceParams
est rendu dans l'espace 3D.
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 Entity
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities .hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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 }
Points clés concernant le code
- La première étape consiste à vérifier si les fonctionnalités audio spatial sont actuellement disponibles à l'aide de
spatialCapabilities
. - Définir contentType sur
CONTENT_TYPE_SONIFICATION
et usage surUSAGE_ASSISTANCE_SONIFICATION
permet 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. Ainsi, tous les fichiers audio sont disponibles dans le pool lorsque vous en avez besoin.
Ajouter le son stéréo et surround à votre application
La méthode recommandée pour ajouter le son stéréo et surround à votre application consiste à utiliser Exoplayer
. Pour en savoir plus sur l'utilisation du son spatial avec Exoplayer
, consultez le guide sur le son spatial.
Positionnement des enceintes stéréo et de son surround
Avec le positionnement des enceintes surround, les enceintes surround virtuelles sont positionnées et orientées par rapport à une enceinte centrale, 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 enceintes est similaire à celui du son surround, sauf qu'il n'y a que les canaux gauche et droit, respectivement positionnés sur les côtés gauche et droit de l'écran.
Si vous avez plusieurs panneaux et que vous souhaitez choisir celui qui émet du son, ou si vous souhaitez que le son stéréo ou surround soit rendu par rapport à un autre Entity
, vous pouvez utiliser PointSourceAttributes
pour définir l'emplacement du canal central. Les autres chaînes seront placées comme indiqué précédemment. Dans ces situations, vous devez également utiliser MediaPlayer
.
Lorsque l'utilisateur se déplace dans l'espace, les enceintes virtuelles stéréo et à son surround se déplacent et s'ajustent pour s'assurer qu'elles sont toujours dans une position optimale.
Si vous avez configuré MediaPlayer
ou ExoPlayer
pour continuer à lire du son stéréo ou surround en arrière-plan, le positionnement des enceintes virtuelles 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 auquel ancrer le son, l'audio spatial se déplace avec l'utilisateur (en d'autres termes, il est "verrouillé à 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 sur Entity
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_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 }
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
. - Si vous définissez
contentType
surAudioAttributes.CONTENT_TYPE_MUSIC
et l'utilisation surAudioAttributes.USAGE_MEDIA
, le système traitera 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 de 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'Ambionics
L'exemple suivant lit un champ sonore ambisonique à l'aide de MediaPlayer
.
// Check spatial capabilities before using spatial audio if (session.scene.spatialCapabilities.hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_SPATIAL_AUDIO)) { // The session has spatial audio capabilities val soundFieldAttributes = SoundFieldAttributes(SpatializerConstants.AMBISONICS_ORDER_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
contentType
et l'utilisation sont fournis à titre informatif uniquement. AMBISONICS_ORDER_FIRST_ORDER
indique à SceneCore que le fichier de champ audio définit quatre canaux.