为了账号安全,请及时绑定邮箱和手机立即绑定

OpenAL 只呈现一个“凹凸”,但没有错误。到底是怎么回事?

OpenAL 只呈现一个“凹凸”,但没有错误。到底是怎么回事?

跃然一笑 2023-03-23 16:31:34
我正在尝试在 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
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

我仍然不知道发生了什么,但我是如何按照教程进行操作的。伙计告诉我们使用这段代码来加载 wav 文件,它似乎工作得很好!我的理论是它运作良好,因为它使用 LWJGL 缓冲区而不是 Java 缓冲区。查看 LWJGL 的源代码,它似乎很重要,因为它试图获取缓冲区的内存地址。而且,当然,如果 LWJGL 是创建缓冲区的那个,它会确切地知道它在哪里。



查看完整回答
反对 回复 2023-03-23
  • 1 回答
  • 0 关注
  • 129 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号