私はゲームで自分のサウンドを再生するためにJLayerを使用しています。私は自分の音楽(常に演奏)と効果音(散発的)のための独立した音量レベルを設定しようとしています。今すぐ私のコードは、マスターボリュームレベルを変更して、期待どおりに両方のボリュームを変更します。ここでは、私がやりたいことを実証するためのサンプルコードをいくつか紹介します(私はSSCCEのようなものをたくさんカットし、いくつかの "バグ"があることを認識しています)。異なる音量で同時にJava mp3を再生
ご協力いただければ幸いです。
public static void playSoundOrMusic(String filename, String type) {
String soundFilename = "";
if (type.equals("SFX")){
soundFilename = "res/sounds/sfx/" + filename;
} else if (type.equals("MUSIC")){
soundFilename = "res/sounds/music/" + filename;
}
FileInputStream fis = null;
try {
fis = new FileInputStream(soundFilename);
} catch (FileNotFoundException e) {
LOGGER.error("Sound file missing", e);
}
BufferedInputStream bis = new BufferedInputStream(fis);
try {
if (type.equals("SFX")){
sfxPlayer = new Player(bis);
} else if (type.equals("MUSIC")){
musicPlayer = new Player(bis);
}
} catch (JavaLayerException e) {
LOGGER.error("Sound file issue", e);
} catch (ArrayIndexOutOfBoundsException e) {
LOGGER.error("Sound file issue", e);
}
if (type.equals("SFX")){
Info source = Port.Info.SPEAKER;
if (AudioSystem.isLineSupported(source)){
try {
Port outline = (Port) AudioSystem.getLine(source);
outline.open();
FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);
volumeControl.setValue(OptionsJPanel.sfxVolume);
} catch (LineUnavailableException ex) {
LOGGER.error("Sound line issue", ex);
}
new Thread(new Runnable() {
@Override
public void run() {
try {
sfxPlayer.play();
} catch (Exception ex) {
LOGGER.error("Sound(sfx) playing issue", ex);
}
}
}).start();
}
}
if (type.equals("MUSIC")){
Info source = Port.Info.SPEAKER;
if (AudioSystem.isLineSupported(source)){
try {
Port outline = (Port) AudioSystem.getLine(source);
outline.open();
FloatControl volumeControl = (FloatControl) outline.getControl(FloatControl.Type.VOLUME);
volumeControl.setValue(OptionsJPanel.musicVolume);
} catch (LineUnavailableException ex) {
LOGGER.error("Sound line issue", ex);
}
new Thread(new Runnable() {
String threadFilename = filename;
@Override
public void run() {
try {
musicPlayer.play();
while(!musicPlayer.isComplete()){
Thread.currentThread();
Thread.sleep(1000);
}
playSoundOrMusic(threadFilename, type);
} catch (Exception ex) {
LOGGER.error("Sound(music) playing issue", ex);
}
}
}).start();
}
}
}
@gpasch答えはどこに行きましたか?私はちょうどそれを実装し、それは素晴らしい作品です。奨励金を割り当てることができませんでした:( – KisnardOnline