Как воспроизвести звук в JavaFX?

Я экспериментирую с 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


person Chobicus    schedule 27.10.2008    source источник


Ответы (6)


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

person GuyWithDogs    schedule 29.10.2008
comment
Нет, имя файла в порядке. Кто-нибудь играл со звуком в JavaFX? - person Chobicus; 06.11.2008

var player = javafx.scene.media.MediaPlayer { RepeatCount: javafx.scene.media.MediaPlayer.REPEAT_FOREVER media: Media { source: "{__DIR__}clip.wav" }; }; игрок.играть();

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

person Community    schedule 15.12.2008

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

person lindelof    schedule 02.06.2010

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

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

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

person MKA    schedule 19.06.2010

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

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

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

person daevon    schedule 02.01.2014

Хорошо, воспользовавшись этим вопросом, чтобы заставить звук 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.

person ivanivan    schedule 28.09.2016