Докуметация Cтарт Статьи Форум Лента Вход
Не официальное русскоязычное сообщество

Аудио в jME3

Опубликованно: 14.05.2017, 15:33
Последняя редакция, Andry: 15.05.2017 18:04

Размещайте аудио файлы в директорию assets/Sound/ вашего проекта. JME3 поддерживает сжатие аудио Ogg Vorbis (.ogg) и несжатый формат PCM Wave (.wav). Вы можете использовать, например, Audacity для конвертирования из других форматов.

Аудио-терминология

  • Потоковая передача(Streaming): Существует два способа загрузки аудиоданных: короткие аудиофайлы должны храниться полностью в памяти (предварительно загруженные), а длинные аудиофайлы, такие как музыка, передаются с жесткого диска во время воспроизведения.
  • Зацикливание(Looping): Вы можете воспроизводить звук один раз, а затем останавливать, или многократно (непрерывно) в цикле.
    Вы не можете зацикливать потоковые звуки.
  • Экземпляр(Instance): Если вы дважды воспроизводите один и тот же звук, проигрывающийся по очереди, jME — проиграет один за другим. Если вы воспроизводите экземпляры звуков одновременно, то тогда могут воспроизводиться несколько экземпляров одного и того же звука.

Создание аудио узлов: Потоковое или Буферизированное

Основной класс audio в jME это — com.jme3.audio.AudioNode. При создании нового аудио узла вам необходимо указать, как вы хотите загрузить этот звук:

  • Буферизация(Buffered): по умолчанию каждый новый аудио узел буферизуется. Это означает, что jME3 загружает весь файл в память перед воспроизведением. Используйте это для коротких звуков. Вы создаете буферизованный звук, устанавливая DataType.Buffer или вообще не используя DataType:
  • AudioNode boom = new AudioNode(assetManager, "Sound/boom.wav");
    AudioNode boom = new AudioNode(assetManager, "Sound/boom.wav", DataType.Buffer);
  • Потоковые(Streamed): если вы используете длинный файл, такой как музыка или диалог, то вы передаете аудио. Потоковая передача означает, что вы загружаетесь и играете параллельно, звук пока он не будет завершен. Вы не можете перехватывать потоки. Вы создаете потоковый звук, устанавливая значение boolean равным true:
  • AudioNode music = new AudioNode(assetManager, "Sound/music.wav", DataType.Stream);

Получение свойств AudioNode

Методы AudioNode  Применение
getStatus()  Возвращает либо AudioSource.Status.Playing, AudioSource.Status.Stopped, либо AudioSource.Status.Paused.
getVolume()  Возвращает громкость.
getPitch()  Возвращает высоту тона.
Есть и другие очевидные геттеры для опроса статуса всех соответствующих установщиков, перечисленных здесь.

Настройка свойств AudioNode

Метод AudioNode  Применение
setTimeOffset(0.5f)  Воспроизведите звук, начиная с 0,5 с. От начала. По умолчанию используется 0.
setPitch(1)  Делает воспроизведение звука более высоким или более низким шагом. Значение по умолчанию — 1. 2 раза в два раза, .5f вдвое меньше.
setVolume(1)  Устанавливает коэффициент усиления громкости. 1 — это громкость по умолчанию, 2 — в два раза громче, и.т.д. 0 — тихий/без звука.
setRefDistance(50f)  Эталонное расстояние определяет, насколько далеко звук может быть слышен на 50% от его первоначальной громкости (это предполагает экспоненциальный спад!). Звук с высоким значением RefDist можно слышать громко на больших расстояниях; Звук с низким refDist может быть слышен только когда слушатель находится рядом. По умолчанию 10 мировых единиц.
setMaxDistance(100f)  «Максимальное расстояние затухания» определяет, как далеко от источника звук перестает становиться более тихим (звуки в природе не делают этого). Установите это на меньшее значение, чтобы звук был громким даже на расстоянии; Установите это значение выше, чтобы звук быстро исчезал. По умолчанию 20 мировых единиц.
setLooping(false)  Настраивает звук так, что, если он воспроизводится, он воспроизводится один раз и останавливается. По умолчанию цикл не используется.

Повторяющиеся и Звуки Окружения(Looping & Ambient Sounds)

Методы AudioNode  Применение
setPositional(false)
setDirectional(false) 
Все 3D-эффекты отключены. Этот звук является глобальным и проигрывается в свободном пространстве (он, кажется, приходит отовсюду). Хорошо для окружающих звуков, окружающей среды и фоновой музыки.
setLooping(true)  Настраивает звук на повторение: после воспроизведения звука он повторяется с начала, пока вы не вызываете stop() или pause(). Хорошо для музыки и окружающих фоновых шумов.
До версии 3.1-alpha2 Повторение не работает с потоковыми звуками.

Позиционные 3D-звуки

Методы AudioNode  Применение
setPositional(true)
setLocalTranslation(…) 
Активирует 3D-звук: звук появляется из определенного места, там он громче всего. Можете поместите AudioNode в 3D-сцену или перемещать его с помощью перемещений игрока или NPC.
setReverbEnabled(true)  Реверберация — это эффект 3D-эхо, который имеет смысл только с позиционными AudioNodes. Используйте Audio Environments, чтобы сцены звучали так, как если бы они находились «на открытом воздухе» или «в помещении в большой или маленькой комнате» и.т.д. Эффект реверберации определяется com.jme3.audio.Environment, в котором находится audioRenderer. См. «Настройка аудио Свойства среды ниже.
Для позиционных 3D-звуков требуется объект AudioListener в сцене (представляющий уши игрока).

Направленные(Directional) 3D-звуки

Методы AudioNode  Применение
setDirectional(true)
setDirection(…) 
Активирует 3D-звук: этот звук можно слышать только с определенного направления. Укажите направление и угол в 3D-сцене, если вы используете setDirectional() true. Используйте его, чтобы ограничить шум, который не следует слышать, например, через стену.
setInnerAngle()
setOuterAngle() 
Установите угол в градусах для направленного звука. Угол относительно направления. Примечание: По умолчанию оба угла равны 360 °, и звук можно слышать со всех сторон!
Направленные 3D-звуки требуют наличия объекта AudioListener в сцене (представляющей уши игрока).

Воспроизведение, Пауза, Стоп

Вы воспроизводите, приостанавливаете и останавливаете узел с именем myAudioNode, используя эти три метода:

myAudioNode.play();
myAudioNode.pause();
myAudioNode.stop();
Воспроизводится ли аудио узел непрерывно или только один раз, это зависит от свойств Loop, которые вы установили выше!

Вы также можете начать воспроизведение экземпляров AudioNode. Используйте метод playInstance(), если вам нужно воспроизводить один и тот же AudioNode несколько раз, возможно даже в одно и то же время. Обратите внимание, что изменения параметров исходного AudioNode не влияют на экземпляры, которые уже воспроизводятся!

myAudioNode.playInstance();

Audio Listener

Слушатель объектов AudioListener по умолчанию в SimpleApplication является ухом пользователя в сцене. Если вы используете 3D-звук (позиционные или направленные звуки), вы должны переместить AudioListener с проигрывателем: например, для игрока от первого лица вы перемещаете слушателя с помощью камеры. Для игрока от третьего лица вы перемещаете слушателя с Геометрией аватара игрока.

  @Override
  public void simpleUpdate(float tpf) {
    // От первого лица: удерживает audio listener, движущимся вместе с камерой
    listener.setLocation(cam.getLocation());
    listener.setRotation(cam.getRotation());
  }

Настройка свойств аудио-среды(Setting Audio Environment Properties)

При желании вы можете выбрать следующие предварительные настройки среды из среды com.jme3.audio.Environment. Эти пресеты влияют на тонкие эхо-эффекты (реверберация), которые вызывают ассоциации пользователей с разными средами. То есть, это заставляет вас слышать сцену «в помещении или на улице» и.т.д. Вы используете Audio Environments вместе с setReverbEnabled(true) для позиционных AudioNodes (см. Выше).

Окружение  density diffusion gain gainHf decayTime decayHf reflGain reflDelay lateGain lateDelay
Гараж  1.00f 1.0f 1.0f 1.00f 0.90f 0.5f 0.751f 0.0039f 0.661f 0.0137f
Подземелье  0.75f 1.0f 1.0f 0.75f 1.60f 1.0f 0.950f 0.0026f 0.930f 0.0103f
Пещера  0.50f 1.0f 1.0f 0.50f 2.25f 1.0f 0.908f 0.0103f 0.930f 0.0410f
Акустическая лаборатория  0.50f 1.0f 1.0f 1.00f 0.28f 1.0f 0.870f 0.0020f 0.810f 0.0080f
Уборная  1.00f 1.0f 1.0f 1.00f 0.15f 1.0f 0.600f 0.0025f 0.500f 0.0006f
  1. Активировать предустановки среды
    • Или используйте значение по умолчанию, например. это заставит звучать как в подземелье:
      audioRenderer.setEnvironment(new Environment(Environment.Dungeon));
    • Или активируйте пользовательские настройки звуковой среды в конструкторе среды:
      audioRenderer.setEnvironment(
              new Environment( density, diffusion, gain, gainHf, decayTime, decayHf,
                      reflGain, reflDelay, lateGain, lateDelay ) );
  2. Активируйте 3D-звук для определенных звуков:
    footstepsAudio.setPositional(true);
    footstepsAudio.setReverbEnabled(true);
Звукорежиссер может создать пользовательский объект com.​jme3.​audio.Environment и указать пользовательские значения окружения, такие как плотность, диффузия, усиление, затухание, задержка … Здесь можно найти множество примеров пользовательских пресетов звуковой среды.

Продвинутые пользователи могут найти дополнительную информацию о OpenAL и его возможностях здесь: Спецификация OpenAL 1.1.

Это зависит от того, поддерживаются ли аудио эффекты (в противном случае вы получите сообщение, что OpenAL EFX недоступен! Звуковые эффекты не будут работать.)

Переведено для jmonkeyengine.ru, оригинал
Автор перевода: Andry

Добавить комментарий

jMonkeyEngine.ru © 2017. Все права сохранены.