Java LWJGL OGG Фоновая музыка

В моей игре у меня есть очень длинные файлы ogg (от 8 до 20 МБ), и некоторые другие машины не могут прочитать их прямо в память. Итак, я читал, что в некоторых играх используется метод потоковой передачи и воспроизведения. Есть ли пример библиотеки/кода для загрузки и воспроизведения файлов ogg (с LWJGL) в режиме реального времени? Спасибо за помощь :)


person Dragomirus    schedule 13.04.2015    source источник
comment
В качестве общего примечания, вы должны максимально сжимать файлы в своей игре. 20 МБ для одной музыкальной дорожки просто неприемлемо с точки зрения того, как долго будет загружаться ваша игра.   -  person Joehot200    schedule 15.04.2015
comment
Моя ошибка, мой фоновый звук длится около 5 минут (~ 9 мб) :)   -  person Dragomirus    schedule 15.04.2015


Ответы (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 можно найти здесь.

person Joehot200    schedule 15.04.2015

@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;
}
person Dragomirus    schedule 15.04.2015
comment
Вам конкретно нужно загрузить OGG? У меня есть 5-минутная музыкальная дорожка в моей игре, загруженная тем же кодом, который я разместил выше, в формате WAV. Более того, он загружается практически мгновенно. - person Joehot200; 16.04.2015
comment
Мне нужен сжатый музыкальный файл (для одной локации в моей игре у меня есть два длинных файла ogg - для дня и ночи) и разница между 8мб и 80мб огромна. Проблема в том, что я загружаю свой распакованный файл ogg в память, а затем воспроизводю его. Вот это реальная проблема... - person Dragomirus; 20.04.2015