Java LWJGL OGG фонова музика

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


person Dragomirus    schedule 13.04.2015    source източник
comment
Като обща бележка, вие искате да компресирате файлове колкото можете повече във вашата игра. 20MB за една музикална песен е просто неприемливо от гледна точка на това колко време ще отнеме да изтеглите играта си.   -  person Joehot200    schedule 15.04.2015
comment
Моя грешка, фоновият ми звук е около 5 минути (~9 mb) :)   -  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 Имам два музикални енджина - 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 файла - за деня и нощта) и разликата между 8mb и 80mb е огромна. Проблемът е, че зареждам своя декомпресиран ogg файл в паметта и след това го възпроизвеждам. Това е истинският проблем... - person Dragomirus; 20.04.2015