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

我正在尝试在 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


跃然一笑
浏览 130回答 1
1回答

隔江千里

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

相关分类

Java