将 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
我正在使用 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