我正在尝试在 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
隔江千里
相关分类