Как воспроизвести звук в JavaFX? - PullRequest
0 голосов
/ 28 октября 2008

Я экспериментирую с JavaFX, создавая маленькую игру.

Я хочу добавить звук. Как?

Я пытался MediaPlayer с media, определенным с относительным атрибутом source, например:

attribute media = Media{
    source: "{__FILE__}/sound/hormpipe.mp3"        
}
attribute player = MediaPlayer{
    autoPlay:true
    media:media
}

Это не играет. Я получаю

FX Media Object caught Exception com.sun.media.jmc.MediaUnavailableException: Media unavailable: file: ... Sound.class/sound/hormpipe.mp3

Ответы [ 6 ]

1 голос
/ 15 декабря 2008

var player = javafx.scene.media.MediaPlayer { repeatCount: javafx.scene.media.MediaPlayer.REPEAT_FOREVER media: Media {источник: "{__DIR __} clip.wav" }; }; player.play ();

Вы должны включить аудиофайл в каталог build / compiled, чтобы Netbeans мог упаковать его в файл jar.

1 голос
/ 29 октября 2008

Просто предположение, но это файл "hornpipe.mp3", а не "hormpipe.mp3" (с меткой m)?

0 голосов
/ 28 сентября 2016

ОК, используя этот вопрос, чтобы заставить работать звук MP3 (вроде), я узнал следующее (не очень).

1) Аудио для сжатых форматов очень зависит от платформы. Моя постоянно обновляемая машина Mint 17.1-> 18 прекрасно воспроизводит mp3, используя Media и MediaPlayer. Новые установки Mint 18 не будут (с инструментами разработки).

Так что используйте .wav файлы.

Media sound=new Media(new File("noises/roll.wav").toURI().toString());
MediaPlayer mediaPlayer=new MediaPlayer(sound);
mediaPlayer.play();

2) Одна из вещей, о которых вам необходимо знать с помощью Media / MediaPlayer, заключается в том, что для того, чтобы играть несколько раз (многократно или все сразу, т. Е. При нажатии кнопки / что угодно в игре), вы должны породить N количество объектов MediaPlayer, каждый из которых будет воспроизведен один раз, а затем остановлен.

Так что используйте javafx.scene.media.AudioClip

AudioClip soundMyNoise = new AudioClip(new File("noises/roll.wav").toURI().toString());
soundMyNoise.play();

AudioClip также имеет свои проблемы, которые включают в себя хранение необработанных аудиоданных в ОЗУ одновременно, вместо буферизации. Так что есть вероятность чрезмерного использования памяти.

Независимо от того, какой метод вы используете, одна вещь, о которой следует помнить, была упомянута daevon ранее - проблема пути. В NetBeans у вас есть NetBeansProjects / yourproject / src / yourproject / foo.java. Звуки в приведенном выше примере идут в NetBeansProjects / yourproject / noises / roll.wav

0 голосов
/ 02 января 2014

Это сработало для меня:

MediaPlayer audio = new MediaPlayer(
    new Media(
        new File("file.mp3").toURI().toString()));

Исходный файл должен находиться в корневом каталоге проекта (не src, не dist).

0 голосов
/ 19 июня 2010

Также обратите внимание, что {__DIR__} включает в себя трейлинг /, поэтому попробуйте это вместо:

attribute media = Media{
source: "{__DIR__}sound/hormpipe.mp3"}

РЕДАКТИРОВАТЬ: я немного покопался, и, очевидно, источником медиа-объекта должен быть либо удаленный URL-адрес, либо абсолютный путь к файлу, поскольку медиа-файлы не допускаются в JAR-файлах (что, я надеюсь, изменится в будущем релизы, так как я действительно люблю JavaFX и хочу иметь возможность создавать приложения для настольных компьютеров с ним). См .: Часто задаваемые вопросы по JavaFX .

0 голосов
/ 02 июня 2010

Просто предположение, но я думаю, что ваш {__FILE__} расширится до имени вашего файла. Попробуйте заменить его на {__DIR__}.

...