Функции пространственного звука в Jetpack SceneCore позволяют вам создавать захватывающие звуковые эффекты в приложениях Android XR.
Пространственный звук имитирует то, как пользователи воспринимают звук в трехмерной среде. Он создает ощущение звука, исходящего со всех направлений, в том числе сверху и снизу от пользователя. Система делает это, имитируя один или несколько «виртуальных динамиков» в определенных местах трехмерного пространства.
Существующие приложения, которые не были разработаны или модифицированы для Android XR, автоматически пространственно распределяют звук в Android XR. Когда пользователь перемещается по своему пространству, весь звук приложения будет воспроизводиться с панели, на которой отображается пользовательский интерфейс приложения. Например, если срабатывает таймер в приложении часов, звук будет звучать так, как будто он исходит из положения панели приложения. Android XR автоматически изменит звук для позиционного реализма. Например, воспринимаемое расстояние между панелью приложения и пользователем будет слегка влиять на громкость звука для большего ощущения реализма.
Дополнительную информацию о том, как существующие приложения воспроизводят пространственный звук, можно найти в статье «Добавьте стерео и объемный звук в свое приложение» на этой странице.
Если вы оптимизируете свое приложение для XR, Jetpack SceneCore предоставляет инструменты для расширенной настройки пространственного звука. Вы можете точно позиционировать звуки в 3D-среде, использовать амбисонический звук для реалистичных звуковых полей и воспользоваться встроенной интеграцией объемного звука.
Типы пространственного звука, доступные в Android XR
Android XR поддерживает позиционный, стерео, объемный и объемный звук.
Позиционный звук
Позиционный звук может быть позиционирован для воспроизведения из определенной точки в трехмерном пространстве. Например, у вас может быть 3D-модель лающей собаки в углу вашей виртуальной среды. У вас может быть несколько сущностей, издающих звук из каждой из своих соответствующих позиций. Для рендеринга позиционного звука файлы должны быть моно или стерео.
Пространственный стереозвук и объемный звук
Поддерживаются все форматы медиафайлов Android для позиционного, стерео и объемного звука.
Стереозвук относится к аудиоформатам с двумя каналами, а объемный звук относится к аудиоформатам с более чем двумя каналами, например, конфигурации объемного звука 5.1 или объемного звука 7.1 . Звуковые данные каждого канала связаны с одним динамиком. Например, при воспроизведении музыки в стерео левый канал динамика может воспроизводить разные инструментальные дорожки, чем правый.
Объемный звук часто используется в фильмах и телешоу для повышения реализма и погружения за счет использования нескольких каналов динамиков. Например, диалог часто воспроизводится из центрального канала динамика, в то время как звук летящего вертолета может использовать различные каналы последовательно, чтобы создать ощущение, что вертолет летит в вашем трехмерном пространстве.
Звуковая амбиция
Ambisonic audio (или амбисоника) — это своего рода skybox для аудио, обеспечивающий захватывающий звуковой ландшафт для ваших пользователей. Используйте амбисонику для фоновых звуков окружающей среды или других сценариев, где вы хотите воспроизвести полное сферическое звуковое поле, окружающее слушателя. Android XR поддерживает формат амбисоники AmbiX в амбисонике первого, второго и третьего порядка. Мы рекомендуем типы файлов Opus ( .ogg
) и PCM/Wave ( .wav
).
Используйте пространственный звук с Jetpack SceneCore
Реализация пространственного звука с помощью Jetpack SceneCore включает проверку пространственных возможностей и выбор API для загрузки пространственного звука.
Проверка пространственных возможностей
Перед использованием пространственных аудиофункций проверьте, поддерживает ли Session
пространственное аудио. Во всех фрагментах кода в следующих разделах возможности проверяются перед попыткой воспроизведения пространственного аудио.
Загрузить пространственный звук
Для загрузки пространственного звука для использования в Jetpack SceneCore можно использовать любой из следующих API.
-
SoundPool
: Идеально подходит для коротких звуковых эффектов размером менее 1 МБ, они загружаются заранее, и звуки могут использоваться повторно. Это отличный способ загрузки аудио для позиционного аудио. -
ExoPlayer
: Идеально подходит для загрузки стерео и объемного звучания, такого как музыка и видео. Также позволяет воспроизводить медиа в фоновом режиме. -
MediaPlayer
: обеспечивает самый простой способ загрузки объемного звука. -
AudioTrack
: обеспечивает максимальный контроль над загрузкой аудиоданных. Позволяет напрямую записывать буферы аудио или синтезировать или декодировать собственные аудиофайлы.
Добавьте позиционное аудио в свое приложение
Позиционные источники звука определяются PointSourceParams
и связанной с Entity
. Положение и ориентация Entity
определяют, где PointSourceParams
отображается в трехмерном пространстве.
Пример позиционного звука
В следующем примере аудиофайл звукового эффекта загружается в звуковой пул и воспроизводится в позиции 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 }
Ключевые моменты кодекса
- Первый шаг — проверить, доступны ли в данный момент возможности пространственного звука, используя
spatialCapabilities
. - Установка contentType на
CONTENT_TYPE_SONIFICATION
и usage наUSAGE_ASSISTANCE_SONIFICATION
позволяет системе обрабатывать этот аудиофайл как звуковой эффект. - Предыдущий пример загружает аудиофайл в пул непосредственно перед его использованием, чтобы сохранить код целостным для простоты. В идеале вы должны загружать все ваши звуковые эффекты асинхронно, когда вы загружаете свое приложение, чтобы все аудиофайлы были доступны в пуле, когда вам это нужно.
Добавьте стерео и объемный звук в свое приложение
Рекомендуемый способ добавления стерео и объемного звука в ваше приложение — использование Exoplayer
. Для получения дополнительной информации о том, как использовать Spatial Audio с Exoplayer
, обратитесь к руководству Spatial Audio .
Расположение динамиков стерео и объемного звука
При позиционировании динамиков объемного звучания виртуальные динамики объемного звучания располагаются и ориентируются относительно центрального динамика вокруг пользователя в стандартной конфигурации ITU .
По умолчанию динамик центрального канала размещается на mainPanelEntity
приложения. Это включает в себя мобильные приложения, в которых звук автоматически пространственно распределяется Android XR.
Для стереосистемы размещение динамиков аналогично размещению динамиков в системах объемного звучания, за исключением того, что левый и правый каналы располагаются на левой и правой стороне панели соответственно.
Если у вас несколько панелей и вы хотите выбрать, какая из них будет издавать звук, или если вы хотите, чтобы стерео или объемный звук отображались относительно другого Entity
, вы можете использовать PointSourceAttributes
для определения местоположения центрального канала. Остальные каналы будут размещены, как упоминалось ранее. В этих ситуациях вы также должны использовать MediaPlayer
.
По мере того, как пользователь перемещается по помещению, виртуальные стереодинамики и динамики объемного звука будут перемещаться и подстраиваться, чтобы динамики всегда находились в оптимальном положении.
Если вы настроили MediaPlayer
или ExoPlayer
на продолжение воспроизведения стерео или объемного звука в фоновом режиме, виртуальное позиционирование динамиков будет изменено, когда приложение перейдет в фоновый режим. Поскольку нет панели или другой точки в пространстве, к которой можно было бы привязать звук, пространственный звук перемещается вместе с пользователем (другими словами, он «зафиксирован в голове»).
Пример объемного звука
В следующем примере загружается аудиофайл 5.1 с помощью MediaPlayer
и центральный канал файла устанавливается как 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 }
Ключевые моменты кодекса
- Как и в примере с позиционным звуком , первым шагом является проверка доступности возможностей пространственного звука с помощью
spatialCapabilities
. - Установка
contentType
на (/reference/android/media/AudioAttributes#CONTENT_TYPE_MUSIC) 18 и usage на (/reference/android/media/AudioAttributes#USAGE_MEDIA) 16 позволяет системе обрабатывать этот аудиофайл как объемный звук.
Добавьте в свое приложение объемные звуковые поля
Самый простой способ воспроизвести амбисонические звуковые поля — загрузить файл с помощью MediaPlayer
. Поскольку амбисонический звук применяется ко всему звуковому ландшафту, вам не нужно указывать Entity
для указания позиции. Вместо этого вы создаете экземпляр SoundFieldAttributes
с соответствующим амбисоническим порядком, указывающим количество каналов.
Пример амбионики
В следующем примере воспроизводится объемное звуковое поле с помощью 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 }
Ключевые моменты кодекса
- Как и в предыдущих фрагментах, первым шагом является проверка доступности возможностей пространственного звука с помощью
hasCapability()
. -
contentType
и использование носят исключительно информационный характер. -
AMBISONICS_ORDER_FIRST_ORDER
сигнализирует SceneCore о том, что файл звукового поля определяет четыре канала.