将OGG读取为LWJGL 3 OpenAL的样本流

问题描述 投票:1回答:1

我正在使用LWJGL 3进行游戏,这是我第一次学习OpenAL库。我将不得不包含较长的音频文件,并且我决定将OGG用作音频,因为否则音乐会占用很多空间。

但是,我不知道如何从OGG中获取音频数据并将其放入OpenAL缓冲区,这需要ShortBuffer带符号的短PCM样本。

我已经在尝试寻找答案,但是我发现的所有内容似乎都已过时或与我的情况无关。

总结:我有OGG文件,我需要能够将它们加载到OpenAL缓冲区。同样,从文件中流式传输的功能显然是必须的(在这种情况下,由于涉及音乐,因此一次将一个块读取一个文件到双缓冲区中)。

示例:

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;
}
java audio lwjgl openal ogg
1个回答
2
投票

STBVorbis类可以读取Ogg Vorbis文件。对于流媒体,您可能想要使用

STBVorbis.stb_vorbis_open_filename
STBVorbis.stb_vorbis_get_info 
STBVorbis.stb_vorbis_get_samples_short_interleaved
© www.soinside.com 2019 - 2024. All rights reserved.