【问题标题】:Read OGG as stream of samples for LWJGL 3 OpenAL将 OGG 读取为 LWJGL 3 OpenAL 的样本流
【发布时间】:2020-08-08 08:15:43
【问题描述】:

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

【问题讨论】:

  • 嗨 Zakru,您能否更明确地说明您遇到的问题。这个问题似乎太开放了,可能会被关闭。您拥有的任何代码都会在这里有所帮助。
  • @RossCradock 添加了使用示例

标签: java audio lwjgl openal ogg


【解决方案1】:

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

STBVorbis.stb_vorbis_open_filename
STBVorbis.stb_vorbis_get_info 
STBVorbis.stb_vorbis_get_samples_short_interleaved

【讨论】:

  • 感谢指向库的指针,我完全错过了它存在于 LWJGL 中并且在我的项目中没有它。我只是要浏览一下图书馆列表,看看我在愚蠢中错过了哪些其他重要的东西。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多