我正在尝试在 OpenAL 中制作一个简单的声音播放器作为学习练习。我浏览了几个示例和教程,但总是得到相同的结果:没有声音,也没有错误。我已经阅读了OpenAL 文档,但它从未提到过类似的内容。我最终认为我可能没有安装 OpenAL,这很有趣,我没有。所以我安装之后也是没有声音也没有报错。然后我认为我的缓冲区填充不正确,所以我尝试只使用 Java 库来播放它。事实证明它完全没问题![经过大量测试,编辑]现在我有了音频,但它只是在调用 alSourcePlay 之后以及有时在应用程序结束时出现的一个“颠簸”。如果我使用 AL_FORMAT_STEREO8 或 AL_FORMAT_MONO8 而不是 16 位格式,就会发生这种情况。我想这是格式的问题,但在其他方面正确的格式没有任何反应;甚至没有“颠簸”。我只是不知道出了什么问题。我必须承认,这是我第一次使用 OpenAL。关于 OpenAL 故障排除的信息很少,似乎主要关注 OpenGL 和 Vulkan。这是我到目前为止编写的代码。我正在使用LWJGL访问 OpenAL 和 Java 8。自动字节缓冲区import java.io.InputStream;import java.nio.ByteBuffer;public class AutoByteBuffer { private byte[] array = new byte[0]; private int index; public void put(InputStream is) { int n; byte[] data = new byte[1024]; try { while ((n = is.read(data)) != -1) put(data, 0, n); } catch (Exception e) { e.printStackTrace(); } } public void put(byte[] src) { put(src, 0, src.length); } public void put(byte[] src, int off, int length) { resize(src.length); for (int i = 0; i < length; i++) { array[index++] = src[off + i]; } } protected void resize(int bytes) { Math.addExact(index, bytes); if (index + bytes >= array.length) { int newsize = (int) ((index + bytes) * 1.5 + 0.5); if (newsize < index + bytes) throw new RuntimeException("Could not store enough memory!"); byte[] copy = new byte[newsize]; System.arraycopy(array, 0, copy, 0, index); array = copy; } } public ByteBuffer flip() { ByteBuffer buffer = ByteBuffer.allocate(index); buffer.put(array, 0, index); buffer.flip(); return buffer; }}控制台输出 > Starting AudioMaster!AL lib: (EE) UpdateDeviceParams: Failed to set 44100hz, got 48000hz instead > ALC_NO_ERROR > AL_NO_ERROR > AL_NO_ERROR > Playing! > PLAYING
添加回答
举报
0/150
提交
取消