El audio espacial es una experiencia de audio envolvente que ubica a los usuarios en el central de la acción, lo que hace que el contenido suene más realista. El sonido es "espaciado" para crear un efecto de múltiples bocinas, similar a un sonido envolvente configuración, pero con auriculares.
Por ejemplo, en una película, el sonido de un automóvil puede empezar detrás del usuario, moverse hacia adelante y se marchó a lo lejos. En un videochat, las voces se pueden separados y colocados alrededor del usuario, lo que facilita la identificación de interlocutores.
Si tu contenido usa un formato de audio compatible, puedes agregar sonido espacial a tu a partir de Android 13 (nivel de API 33).
Consulta sobre las funciones
Usa la clase Spatializer
para lo siguiente:
consultar las capacidades
y el comportamiento de espacialización del dispositivo. Comenzar por recuperar
una instancia de Spatializer
de la
AudioManager
:
Kotlin
val spatializer = audioManager.spatializer
Java
Spatializer spatializer = AudioManager.getSpatializer();
Después de obtener la Spatializer
, comprueba las cuatro condiciones que deben contener
true para que el dispositivo emita audio espacial:
Criterios | Marcar |
---|---|
¿El dispositivo admite espacialización? |
getImmersiveAudioLevel() no es SPATIALIZER_IMMERSIVE_LEVEL_NONE
|
¿Está disponible la espacialización? La disponibilidad depende de la compatibilidad con el enrutamiento de salida de audio actual. |
isAvailable() es true |
¿La espacialización está habilitada? | isEnabled() es true |
¿Se puede espacializar una pista de audio con los parámetros especificados? | canBeSpatialized() es true |
Es posible que no se cumplan estas condiciones, por ejemplo, si la espacialización no está disponible para la pista de audio actual o que esté inhabilitado por completo en el dispositivo de salida de audio.
Seguimiento de cabeza
Con auriculares compatibles, la plataforma puede ajustar la transmisión
espacialización basada en la posición
de la cabeza del usuario. Para comprobar si un dispositivo de rastreo de cabeza está
disponibles para el enrutamiento de salida de audio actual, llamar
isHeadTrackerAvailable()
Contenido compatible
Spatializer.canBeSpatialized()
indica si un audio con las propiedades determinadas se puede espacializar con el
enrutamiento actual del dispositivo de salida. Este método toma un elemento AudioAttributes
y un AudioFormat
, que son
se describen con más detalle a continuación.
AudioAttributes
Un objeto AudioAttributes
describe el uso de un
reproducción de audio (por ejemplo, audio de juego)
o contenido multimedia estándar),
junto con sus comportamientos de reproducción y el tipo de contenido.
Cuando llames a canBeSpatialized()
, usa el mismo
AudioAttributes
como se configuró para tu Player
. Por ejemplo,
que usas la biblioteca de Jetpack Media3 y no personalizaste la
AudioAttributes
, usa AudioAttributes.DEFAULT
.
Inhabilitando el audio espacial
Para indicar que tu contenido ya se espacializó, llama a
setIsContentSpatialized(true)
para que el audio no se procese dos veces. También puedes ajustar el
comportamiento de espacialización para inhabilitar la función por completo llamando
setSpatializationBehavior(AudioAttributes.SPATIALIZATION_BEHAVIOR_NEVER)
AudioFormat
Un objeto AudioFormat
describe
son los detalles sobre el formato y la configuración del canal de una pista de audio.
Cuando crees una instancia de AudioFormat
para pasar a canBeSpatialized()
, haz lo siguiente:
configura el campo de codificación
al mismo formato de salida que se espera del decodificador. También debes establecer
una máscara de canal
que coincida con la configuración
del canal del contenido. Consulta las
Sección Comportamiento de espacialización predeterminado para obtener orientación sobre
valores específicos para usar.
Escucha los cambios en Spatializer
Para detectar cambios en el estado de Spatializer
, puedes agregar un objeto de escucha
con Spatializer.addOnSpatializerStateChangedListener()
.
Del mismo modo, para detectar cambios en la disponibilidad de un dispositivo de rastreo de cabeza,
llamar a Spatializer.addOnHeadTrackerAvailableListener()
Esto puede ser útil si quieres ajustar la selección de pistas durante la reproducción.
a través de las devoluciones de llamada del objeto de escucha. Por ejemplo, cuando un usuario conecta o desconecta su
del dispositivo, el onSpatializerAvailableChanged
La devolución de llamada indica si el efecto espacializador está disponible para la nueva
enrutamiento de salida de audio. En este punto, puedes considerar actualizar la configuración de tu reproductor
y seguir la lógica de selección para que coincida con las nuevas capacidades del dispositivo. Para obtener detalles
Comportamiento de selección de pistas de ExoPlayer; consulta ExoPlayer y audio espacial
sección.
ExoPlayer y audio espacial
Las versiones recientes de ExoPlayer facilitan la adopción del audio espacial. Si usas
la biblioteca independiente de ExoPlayer (nombre del paquete com.google.android.exoplayer2
),
La versión 2.17 configura la plataforma para que emita audio espacial, y la versión
2.18 presenta las restricciones de recuento de canales de audio.
Si usas el módulo ExoPlayer de la biblioteca Media3, (nombre del paquete)
androidx.media3
), versiones 1.0.0-beta01
y las más recientes incluyen estas mismas actualizaciones.
Después de actualizar tu dependencia de ExoPlayer a la versión más reciente, tu app solo debe incluir contenido que se pueda espacializar.
Restricciones del recuento de canales de audio
Cuando se cumplen las cuatro condiciones del audio espacial, ExoPlayer elige
una pista de audio multicanal. De lo contrario, ExoPlayer elige una pista estéreo.
Si las propiedades de Spatializer
cambian, ExoPlayer
activará una selección nueva de pistas para elegir una que coincida con el
propiedades actuales. Ten en cuenta que esta nueva selección de pistas puede generar una breve
de almacenamiento en búfer.
Para inhabilitar las restricciones del recuento de canales de audio, establece los parámetros de selección de pistas en el reproductor, como se muestra a continuación:
Kotlin
exoPlayer.trackSelectionParameters = DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build()
Java
exoPlayer.setTrackSelectionParameters( new DefaultTrackSelector.Parameters.Builder(context) .setConstrainAudioChannelCountToDeviceCapabilities(false) .build() );
También puedes actualizar los parámetros de un selector de pistas existente para inhabilitar de recuento de canales de audio de la siguiente manera:
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() );
Con las restricciones de recuento de canales de audio inhabilitadas, si el contenido tiene varios audios ExoPlayer inicialmente selecciona la que tiene el mayor número de canales y se puede reproducir en el dispositivo. Por ejemplo, si el contenido incluye un una pista de audio multicanal y una pista de audio estéreo, y el dispositivo admite reproducción de ambos, ExoPlayer selecciona la pista multicanal. Consulta la Selección de pista de audio para obtener información detallada para personalizar este comportamiento.
Selección de pista de audio
Cuando las restricciones de recuento de canales de audio de ExoPlayer el comportamiento está inhabilitado, ExoPlayer no selecciona automáticamente una pista de audio. que coincida con las propiedades del espacializador del dispositivo. En cambio, puedes personaliza la lógica de selección de pistas de ExoPlayer estableciendo la selección de pistas parámetros antes de la reproducción o durante ella. De forma predeterminada, ExoPlayer selecciona el audio pistas que son iguales a la pista inicial en cuanto al tipo de MIME (codificación), recuento de canales y tasa de muestreo.
Cómo cambiar los parámetros de selección de pistas
Para cambiar los parámetros de selección de pistas de ExoPlayer, usa
Player.setTrackSelectionParameters()
Del mismo modo, puedes obtener los parámetros actuales de ExoPlayer con
Player.getTrackSelectionParameters()
Por ejemplo, para seleccionar una pista de audio estéreo durante la reproducción, haz lo siguiente:
Kotlin
exoPlayer.trackSelectionParameters = exoPlayer.trackSelectionParameters .buildUpon() .setMaxAudioChannelCount(2) .build()
Java
exoPlayer.setTrackSelectionParameters( exoPlayer.getTrackSelectionParameters() .buildUpon() .setMaxAudioChannelCount(2) .build() );
Ten en cuenta que si cambias los parámetros de selección de pistas durante la reproducción, es posible que una interrupción en la reproducción. Más información para ajustar la pista del jugador de selección está disponible en la selección de pistas de los documentos de ExoPlayer.
Comportamiento de espacialización predeterminado
El comportamiento de espacialización predeterminado en Android incluye los siguientes comportamientos: que los OEM pueden personalizar:
Solo el contenido multicanal es espacial, no estéreo. Si no usas ExoPlayer, según el formato de tu contenido de audio, quizás debas configurar la cantidad máxima de canales que puede emitir un decodificador de audio a un número alto. Esto garantiza que el decodificador de audio genera PCM multicanal para que la plataforma espacialice.
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);
Para ver un ejemplo en acción, consulta
MediaCodecAudioRenderer.java
de ExoPlayer. Para desactivar la espacialización por tu cuenta, independientemente del OEM personalización, consulta Cómo inhabilitar el audio espacial.AudioAttributes
: El audio es apto para la espacialización. si elusage
se estableció enUSAGE_MEDIA
oUSAGE_GAME
.AudioFormat
: Usa una máscara de canal que contenga, al menos, lasAudioFormat.CHANNEL_OUT_QUAD
canales (frontal izquierda, delantera derecha, trasera izquierda y trasera derecha) para que el audio ser apto para la espacialización. En el siguiente ejemplo, usamosAudioFormat.CHANNEL_OUT_5POINT1
para una pista de audio 5.1. Para una pista de audio estéreo, usaAudioFormat.CHANNEL_OUT_STEREO
.Si usas Media3, puedes usar
Util.getAudioTrackChannelConfig(int channelCount)
. para convertir un recuento de canales en una máscara de canal.Además, establece la codificación en
AudioFormat.ENCODING_PCM_16BIT
si configuraste el decodificador para que emita PCM multicanalKotlin
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();
Cómo probar el audio espacial
Asegúrate de que el audio espacial esté habilitado en tu dispositivo de prueba:
- Para auriculares con cable, ve a Configuración del sistema > Sonido y vibración > Espacial audio.
- Para auriculares inalámbricos, ve a Configuración del sistema > Dispositivos conectados > Ícono de ajustes para tu dispositivo inalámbrico > Audio espacial.
Para comprobar la disponibilidad del audio espacial para el enrutamiento actual, ejecuta el comando
adb shell dumpsys audio
en tu dispositivo. Deberías ver lo siguiente:
en el resultado mientras la reproducción está activa:
Spatial audio:
mHasSpatializerEffect:true (effect present)
isSpatializerEnabled:true (routing dependent)