Прочитайте OGG как поток примеров для LWJGL 3 OpenAL - PullRequest
1 голос
/ 24 апреля 2020

Я делаю игру с LWJGL 3 и впервые изучаю библиотеку OpenAL. Я собираюсь включить длинные аудиофайлы, и я решил, что OGG будет использоваться для аудио, так как в противном случае musi c занял бы много места.

Что я не делаю знаю, однако, что-нибудь о том, как извлечь аудиоданные из OGG и поместить их в буферы OpenAL, которым требуется ShortBuffer подписанных коротких сэмплов PCM.

Я уже пытался ищите ответы, но все, что я нахожу, кажется устаревшим или неуместным для моего случая.

Итак, подведем итог: у меня есть файлы OGG, и я должен иметь возможность загружать их в буферы OpenAL. Также необходима возможность потоковой передачи из файлов (в этом случае считывайте файлы по одному куску за раз в двойной буфер), так как задействован musi c.

Пример:

ShortBuffer samples = readOggSamplesToBuffer(someInputStream);

int bufferId = AL10.alGenBuffers();
// OpenAL wants the samples as signed short
AL10.alBufferData(bufferId, AL10.AL_FORMAT_MONO16, samples, 44100);

Где функция readOggSamplesToBuffer будет выглядеть примерно так:

private ShortBuffer readOggSamplesToBuffer(InputStream in) {
    // This theoretical class is what I need – something that
    // can read the data from the OGG file.
    OggReader reader = new OggReader(in);

    // Very simplified example
    ShortBuffer buffer = BufferUtils.createShortBuffer(reader.getSampleCount());
    buffer.put(reader.samplesAsShortArray());
    return buffer;
}

1 Ответ

2 голосов
/ 25 апреля 2020

Класс STBVorbis может читать файлы Ogg Vorbis. Для потоковой передачи вы, вероятно, хотите использовать

STBVorbis.stb_vorbis_open_filename
STBVorbis.stb_vorbis_get_info 
STBVorbis.stb_vorbis_get_samples_short_interleaved
...