【问题标题】:Play sound directly from byte array - Java直接从字节数组播放声音 - Java
【发布时间】:2013-01-06 22:52:49
【问题描述】:

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

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 并不是一个真正的选择。

所以我想我的问题是:

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

感谢您的帮助!

【问题讨论】:

  • 万一:如果您将 ByteBuffer 顺序设置为小端序会发生什么?
  • 我还注意到,我得到的声音听起来有点像我的声音文件倒放,但失真并带有很多白噪声。通过将缓冲区顺序转换为小端,一切都会变得更响亮。
  • 我获取音频数据的方法是这样的:snippi.com/s/ndi3f4x
  • 1) 为了尽快获得更好的帮助,请发帖 SSCCE。 2) “我想将此方法与字节缓冲区等一起使用,因为我的整个应用程序都是围绕它构建的。” 有时需要对不起作用的核心功能采取严厉措施。
  • 嘿安德鲁。谢谢你的评论。 1)当然,我尽力了。如果您指出缺少哪些信息,我将很高兴添加它。 2)我同意。但是使用我尝试使用 (^^) 接缝的方法非常适合我的应用程序,所以我很乐意让它发挥作用。

标签: java audio io bytearray wav


【解决方案1】:

我已经成功了。这是我的新代码:

    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 一样,但现在我可以对每个滴答++进行计算,并且如果需要,我可以干预准确的时间。

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

此外,它听起来如此失真的原因是 ByteBuffer 似乎彻底改变了我的样本值。什么原因我不知道。如果有人知道,请告诉我!

谢谢。 :)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2020-01-04
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
  • 1970-01-01
  • 2011-09-04
  • 2020-12-19
  • 1970-01-01
相关资源
最近更新 更多