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

Read OGG as stream of samples for LWJGL 3 OpenAL

我正在使用 LWJGL 3 制作游戏,这是我第一次了解 OpenAL 库。我将不得不包括长音频文件,我决定将 OGG 用于音频,否则音乐会占用很多 space.

不过,我不知道如何从 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;
}

STBVorbis class 可以读取 Ogg Vorbis 文件。对于流式传输,您可能想使用

STBVorbis.stb_vorbis_open_filename
STBVorbis.stb_vorbis_get_info 
STBVorbis.stb_vorbis_get_samples_short_interleaved