В моята игра имам много дълги ogg файлове (около 8 до 20 mb) и някои други машини не могат да ги четат директно в паметта. Така че прочетох, че някои игри използват метода на поток и игра. Има ли пример за библиотека/код за зареждане и възпроизвеждане на ogg файлове (с LWJGL) в реално време? Благодаря за помощта :)
Java LWJGL OGG фонова музика
Отговори (2)
Трябва ли конкретно да възпроизвеждате OGG файлове? Ако не, има много онлайн конвертори, които могат да го конвертират в MP3, WAV и т.н.
Също така, трябва ли конкретно да го играете с LWJGL? Това е много възможно с java по подразбиране, така:
static String randomName = "TreasureQuest";
public static Clip clip = null;
public static void playSound(String name) throws Exception{
if (clip != null && clip.isOpen()) clip.close();
AudioInputStream audioInputStream = AudioSystem.getAudioInputStream(new File("music/" + name + ".wav").getAbsoluteFile());
clip = AudioSystem.getClip();
clip.open(audioInputStream);
FloatControl gainControl =
(FloatControl) clip.getControl(FloatControl.Type.MASTER_GAIN);
gainControl.setValue(0f);
System.out.println(clip.getFrameLength() + " | " + clip.getFramePosition());
clip.start();
}
Лично аз използвам това за моята LWJGL игра и работи перфектно.
Ако трябва да възпроизведете OGG файл и конкретно трябва да го възпроизведете с LWJGL, предлагам ви да използвате OpenAL. Можете да намерите документацията за възпроизвеждане на OGG файлове тук.
@Joehot200 Имам два музикални енджина - java clip и lwjgl, така че няма значение кой ще използвам :)
Имам много подобен код на вашия (но включва ogg декомпресия) и времето за зареждане е все още много дълго - искам да прочета звуковия си файл и да възпроизвеждам прочетеното едновременно (като YOUTUBE). Ето моето парче код:
public static Clip DecodeOgg(String filename)
{
try
{
File file = new File(filename);
// Get AudioInputStream from given file.
AudioInputStream in= AudioSystem.getAudioInputStream(file);
AudioInputStream din = null;
if (in != null)
{
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
// Get AudioInputStream that will be decoded by underlying VorbisSPI
din = AudioSystem.getAudioInputStream(decodedFormat, in);
Clip clip = AudioSystem.getClip();
clip.open(din);
return clip;
}
}
catch (Exception e)
{
e.printStackTrace();
}
return null;
}