В моей игре у меня есть очень длинные файлы ogg (от 8 до 20 мб), а некоторые другие машины не могут читать ее прямо в память. Поэтому я читал, что в некоторых играх используется метод stream и play. Есть ли какой-нибудь пример lib/code для загрузки и воспроизведения файлов ogg (с LWJGL) в режиме реального времени? Спасибо за помощь :)
@Joehot200 Итак, у меня есть два музыкальных движка - java-клип и 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;
}
Вам особенно нужно играть в файлы 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.