Le son spatial est une expérience audio immersive qui permet à vos utilisateurs centre de l'action, ce qui rend votre contenu plus réaliste. Le son est "spatialisée" pour créer un effet multi-enceintes semblable à un son surround mais via un casque à la place.
Par exemple, dans un film, le son d'une voiture peut démarrer derrière l'utilisateur, se déplacer vers l'avant et s'éloigner au loin. Dans un chat vidéo, les voix peuvent être séparés et placés autour de l'utilisateur, ce qui facilite l'identification des locuteurs.
Si votre contenu utilise un format audio compatible, vous pouvez ajouter un son spatialisé à votre à partir d'Android 13 (niveau d'API 33).
Requête pour des fonctionnalités
Utilisez la classe Spatializer
pour
interroger les capacités et le comportement de spatialisation de l'appareil ; Commencez par récupérer
Une instance de Spatializer
à partir de
AudioManager
:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Après avoir obtenu le Spatializer
, vérifiez les quatre conditions qui doivent être remplies
"true" pour que l'appareil diffuse du son spatialisé:
Critères | Vérifier |
---|---|
L'appareil prend-il en charge la spatialisation ? |
getImmersiveAudioLevel() n'est pas SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
La spatialisation est-elle disponible ? La disponibilité dépend de la compatibilité avec le routage actuel de la sortie audio. |
isAvailable() est true |
La spatialisation est-elle activée ? | isEnabled() est true |
Est-il possible de spatialiser une piste audio avec les paramètres fournis ? | canBeSpatialized() est true |
Ces conditions peuvent ne pas être remplies, par exemple si la spatialisation n'est pas disponible pour la piste audio en cours ou complètement désactivé sur le périphérique de sortie audio.
Suivi de la tête
Avec les casques compatibles, la plate-forme peut ajuster le son
en fonction de la position de la tête de l'utilisateur. Pour vérifier si un appareil de suivi des mouvements de la tête est
disponible pour le routage de la sortie audio actuel, appelez
isHeadTrackerAvailable()
Contenus compatibles
Spatializer.canBeSpatialized()
indique si l'audio avec les propriétés données peut être spatialisé avec le
le routage actuel du périphérique de sortie. Cette méthode utilise un objet AudioAttributes
et AudioFormat
, qui sont tous deux
décrits plus en détail ci-dessous.
AudioAttributes
Un objet AudioAttributes
décrit l'utilisation d'un
flux audio (par exemple, l'audio d'un jeu)
ou support standard),
ainsi que ses comportements de lecture et son type de contenu.
Lorsque vous appelez canBeSpatialized()
, utilisez la même
Instance AudioAttributes
définie pour votre Player
. Par exemple, si
vous utilisez la bibliothèque Jetpack Media3 et vous n'avez pas personnalisé
AudioAttributes
, utilisez AudioAttributes.DEFAULT
.
Désactiver le son spatial
Pour indiquer que votre contenu a déjà été spatialisé, appelez
setIsContentSpatialized(true)
afin que l'audio ne soit pas
deux fois traité. Vous pouvez aussi ajuster le paramètre
le comportement de spatialisation pour désactiver complètement la spatialisation en appelant
setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)
AudioFormat
Un objet AudioFormat
décrit
des détails sur le format et la configuration
des canaux d'une piste audio.
Lors de l'instanciation de AudioFormat
à transmettre à canBeSpatialized()
,
définissez le paramètre encoding
au même format de sortie que celui attendu du décodeur. Vous devez également définir
Un masque de chaîne
qui correspond à la configuration
de la chaîne de votre contenu. Consultez le
Consultez la section Comportement de spatialisation par défaut pour en savoir plus sur
des valeurs spécifiques à utiliser.
Écouter les modifications apportées à Spatializer
Pour écouter les changements d'état de Spatializer
, vous pouvez ajouter un écouteur.
avec Spatializer.addOnSpatializerStateChangedListener()
.
De même, pour écouter les changements dans
la disponibilité d'un coach électronique,
appelez Spatializer.addOnHeadTrackerAvailableListener()
.
Cela peut être utile si vous souhaitez ajuster la sélection de pistes pendant la lecture
à l'aide des rappels de l'écouteur. Par exemple, lorsqu'un utilisateur connecte ou déconnecte son
casque de l'appareil, le onSpatializerAvailableChanged
indique si l'effet spatialisant est disponible pour
le routage de la sortie audio. À ce stade, vous pouvez envisager de mettre à jour les paramètres
logique de sélection de piste pour correspondre
aux nouvelles fonctionnalités de l'appareil. Pour en savoir plus sur
Comportement d'ExoPlayer lors de la sélection de pistes (reportez-vous à ExoPlayer et au son spatialisé)
.
ExoPlayer et son spatial
Les dernières versions d'ExoPlayer facilitent l'adoption du son spatial. Si vous utilisez
la bibliothèque ExoPlayer autonome (nom du package com.google.android.exoplayer2
) ;
la version 2.17 configure la plate-forme de manière à diffuser le son spatialisé ;
La version 2.18 introduit des contraintes liées au nombre de canaux audio.
Si vous utilisez le module ExoPlayer de la bibliothèque Media3, (nom du package
androidx.media3
), versions 1.0.0-beta01
et les plus récents incluent
ces mêmes mises à jour.
Après la mise à jour de votre dépendance ExoPlayer vers la dernière version, votre application juste doit inclure du contenu qui peut être spatialisé.
Contraintes liées au nombre de canaux audio
Lorsque les quatre conditions pour le son spatial sont remplies, ExoPlayer choisit
une piste audio multicanal. Si ce n'est pas le cas, ExoPlayer choisit une piste stéréo à la place.
Si les propriétés Spatializer
changent, ExoPlayer
déclenche une nouvelle sélection de pistes audio correspondant au
propriétés actuelles. Notez que cette nouvelle sélection de titre peut entraîner une courte
de mise en mémoire tampon.
Pour désactiver les contraintes de nombre de canaux audio, définissez les paramètres de sélection des pistes sur le lecteur, comme illustré ci-dessous:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
De même, vous pouvez modifier les paramètres d'un sélecteur de titre existant pour désactiver Les contraintes liées au nombre de canaux audio sont les suivantes:
Kotlin
val trackSelector = DefaultTrackSelector(context) ... trackSelector.parameters = trackSelector.buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
DefaultTrackSelector trackSelector = new DefaultTrackSelector(context); ... trackSelector.setParameters( trackSelector .buildUponParameters() .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
Lorsque les contraintes de nombre de canaux audio sont désactivées, si le contenu comporte plusieurs pistes audio des titres, ExoPlayer sélectionne initialement celui qui comporte le plus grand nombre de canaux et peut être lu depuis l'appareil. Par exemple, si le contenu comporte un piste audio multicanal et une piste audio stéréo. De plus, l'appareil prend en charge lors de la lecture des deux, ExoPlayer sélectionne la piste multicanal. Consultez le Sélection de pistes audio pour savoir comment personnaliser ce comportement.
Sélection de la piste audio
Lorsque les contraintes de nombre de canaux audio d'ExoPlayer est désactivé, ExoPlayer ne sélectionne pas automatiquement une piste audio qui correspond aux propriétés du spatialisateur de l'appareil. À la place, vous pouvez personnaliser la logique de sélection des pistes d'ExoPlayer en paramétrant la sélection de pistes ; avant ou pendant la lecture. Par défaut, ExoPlayer sélectionne l'audio Pistes identiques à la piste initiale en ce qui concerne le type MIME (codage), le nombre de canaux et le taux d'échantillonnage.
Modifier les paramètres de sélection de la piste
Pour modifier les paramètres de sélection des pistes d'ExoPlayer, utilisez
Player.setTrackSelectionParameters()
De même, vous pouvez obtenir les paramètres actuels d'ExoPlayer
Player.getTrackSelectionParameters()
Par exemple, pour sélectionner une piste audio stéréo en cours de lecture:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
Notez que la modification des paramètres de sélection des pistes en cours de lecture peut entraîner une interruption de la lecture. En savoir plus sur le réglage du titre du joueur paramètres de sélection sont disponibles sélection de titres de la documentation ExoPlayer.
Comportement de spatialisation par défaut
Le comportement de spatialisation par défaut sous Android inclut les comportements suivants pouvant être personnalisés par les OEM:
Seuls les contenus multicanaux sont spatialisés, pas les contenus stéréo. Si vous n'utilisez pas ExoPlayer, selon le format de votre stratégie multicanal contenu audio, vous devrez peut-être configurer le nombre maximal de canaux qui peut être sortie par un décodeur audio en grand nombre. Cela garantit que le décodeur audio produit une PCM multicanal pour que la plate-forme puisse la spatialiser.
Kotlin
val mediaFormat = MediaFormat() mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99)
Java
MediaFormat mediaFormat = new MediaFormat(); mediaFormat.setInteger(MediaFormat.KEY_MAX_OUTPUT_CHANNEL_COUNT, 99);
Pour voir un exemple concret, consultez le
MediaCodecAudioRenderer.java
d'ExoPlayer. Pour désactiver vous-même la spatialisation, quel que soit l'OEM personnalisation, consultez la section Désactiver le son spatial.AudioAttributes
: le son est éligible à la spatialisation. si leusage
est défini surUSAGE_MEDIA
ouUSAGE_GAME
.AudioFormat
: utilisez un masque de canal contenant au moins lesAudioFormat.CHANNEL_OUT_QUAD
(avant gauche, avant droit, arrière gauche et arrière droit) pour l'audio. être éligible à la spatialisation. Dans l'exemple ci-dessous, nous utilisonsAudioFormat.CHANNEL_OUT_5POINT1
. pour une piste audio en 5.1. Pour obtenir une piste audio stéréo, utilisezAudioFormat.CHANNEL_OUT_STEREO
.Si vous utilisez Media3, vous pouvez utiliser
Util.getAudioTrackChannelConfig(int channelCount)
pour convertir un nombre de canaux en masque de canal.Définissez également l'encodage sur
AudioFormat.ENCODING_PCM_16BIT
. si vous avez configuré le décodeur pour une sortie PCM multicanale.Kotlin
val audioFormat = AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build()
Java
AudioFormat audioFormat = new AudioFormat.Builder() .setEncoding(AudioFormat.ENCODING_PCM_16BIT) .setChannelMask(AudioFormat.CHANNEL_OUT_5POINT1) .build();
Tester le son spatial
Assurez-vous que le son spatial est activé sur votre appareil de test:
- Pour les casques filaires, accédez à Paramètres système > Son et vibreur > Capteur spatial audio.
- Pour les casques sans fil, accédez à Paramètres système > Appareils connectés > Icône en forme de roue dentée pour votre appareil sans fil > Son spatial
Pour vérifier si le son spatial est disponible pour le routage actuel, exécutez la
adb shell dumpsys audio
sur votre appareil. Le résultat suivant doit s'afficher :
paramètres dans la sortie lorsque la lecture est active:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)