В моей игре у меня есть очень длинные файлы ogg (от 8 до 20 МБ), и некоторые другие машины не могут прочитать их прямо в память. Итак, я читал, что в некоторых играх используется метод потоковой передачи и воспроизведения. Есть ли пример библиотеки/кода для загрузки и воспроизведения файлов 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 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;
}