当前位置: 首页 > 面试题库 >

直接从字节数组播放声音-Java

宓和同
2023-03-14
问题内容

我正在尝试使用以下方法播放存储为字节数组的声音:

byte[] clickSamples = getAudioFileData("sound.wav");
ByteBuffer buffer = ByteBuffer.allocate(bufferSize*2);
int tick = 0;

for (int i = 0; i < clickSamples.length; i++) {
    buffer.putShort((short) clickSamples[i]);
    tick++;
    if (tick >= bufferSize/SAMPLE_SIZE) {
        line.write(buffer.array(), 0, buffer.position());
        buffer.clear();
        tick = 0;
    }
}

很难解释出了什么问题。我听到声音了,但只不过是一种“旋风”式的声音。

我想将此方法与字节缓冲区一起使用,以此类推,因为我的整个应用程序都是围绕它构建的。使用Clip或AudioInputStream并不是真正的选择。

所以我想我的问题是:

如何使用字节缓冲区直接从字节数组播放声音?

谢谢您的帮助!


问题答案:

我设法使它起作用。这是我的新代码:

    int tick = 0;
    for (int i = 0; i < clickSamples.length; i++) {
        tick++;
        if (tick >= bufferSize/SAMPLE_SIZE) {
            line.write(clickSamples, i-tick+1, tick);
            buffer.clear();
            tick = 0;
        }
    }

就像使用AudioInputStream一样,这似乎是一种播放声音的复杂方法,但是现在我可以对每个tick ++进行计算,并且可以根据需要干预确切的时间。

如果这听起来很愚蠢,并且有更简便的方法,请告诉我。

同样,它听起来如此失真的原因是,它看起来像是ByteBuffer大大改变了我的采样值。由于什么原因,我不知道。如果有人知道,请告诉我!

谢谢。:)



 类似资料:
  • 播放(播放音效/播放录音)

  • 1面: 分片上传原理(计算文件标识如何优化,只取头尾和中间的分片内容计算hash),整个过程中还有什么可优化的点(http2 cdn)说一下http2有什么特点,服务器主动推送可以用在什么场景(聊天室,股票,公众号消息推送?),hpack算法说一下。 service worker和webworker说一下,有没有了解过pwm,还有没有了解什么最新的前端技术(说了一下rust) vite和webpa

  • 问题内容: 我正在尝试使用pygame播放声音文件(.wav),但是当我启动它时却听不到任何声音。 这是代码: 我也尝试使用频道,但结果是一样的 问题答案: 您的代码在我的机器上可以正常运行(Mac OSX 10.5,Python 2.6.4,pygame 1.9.1)。您正在使用哪些OS,Python和pygame版本?您是否可以通过其他方式(例如,在Mac的终端上或在Windows控制台上,然

  • 问题内容: 以下代码为什么不播放声音?它为play()返回“ true”,但我听不到任何声音。 如果我改用以下代码,则可以听到声音。 OS X优胜美地10.10.3 Xcode 6.2 问题答案: 问题是,您的AVAudioPlayer是一个 局部变量 。因此,它会立即不复存在-在开始播放之前,更不用说完成播放了。 解决方案:改为将其设置为 属性 ,以使其 持久存在 。

  • 问题内容: 我想用Java制作一个实时的语音聊天程序,但是我对用Java录制/播放声音一无所知,因此,在Google的帮助下,我认为我能够使用以下内容将麦克风录制到字节数组中: 因此,据我所知,如果我调用out.toByteArray();,我应该已经从麦克风上录制了一个字节数组的声音。(运行上述命令没有错误,但是由于我不希望将其输出到文件中并且没有这样做,所以没有办法证明它是否实际记录了) 现在