gpt4 book ai didi

java - 如何将字节拆分/合并为音频?

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:03 24 4
gpt4 key购买 nike

我正在用 Java 处理音频。我发现常用的 AudioFormat 使用两个字节。但是,我不知道如何将字节组合成一个 int。所以我尝试反过来做:

public class SineWave {

public static void main(String[] args) throws LineUnavailableException {
int hz = 440;
int samplerate = 16384;
int amplitude = 127;

AudioFormat format = new AudioFormat((float) samplerate, 16, 1, true, true);
SourceDataLine sdl = AudioSystem.getSourceDataLine(format);

sdl.open(format, samplerate * 2);
sdl.start();

while (true) {
byte[] toWrite = new byte[samplerate * 2];
for (int x = 0; x < samplerate; x++) {
int y = (int) Math.round(amplitude * Math.sin(2 * Math.PI * x * hz / samplerate));
byte b1 = (byte) (y & 0xFF);
byte b2 = (byte) ((y >> 8) & 0xFF);
toWrite[2 * x] = b1;
toWrite[2 * x + 1] = b2;
// System.out.printf("%d %d%n", b1, b2);
}
sdl.write(toWrite, 0, toWrite.length);
}
}
}

但是,这仅适用于 127 的幅度。当 System.out.printf 被取消注释时,很明显这个幅度仅使用 1 个字节。当我达到 128 时,我得到这样的输出(以及丑陋的声音):

0 0
21 0
42 0
62 0
80 0
96 0
109 0
118 0
125 0
-128 0
127 0
123 0
115 0
104 0
90 0
73 0
55 0
35 0
13 0

负值类似,符号不变,第二个字节始终为-1

我推断这是因为有符号字节和二进制补码,但我仍然不知道如何解决这个问题。

Java 如何编写音频?

最佳答案

尽管您的字节顺序可能会向后,但您的方向是正确的(尝试在 toWrite 赋值中交换 b1 和 b2,看看这是否会让事情听起来更好)。这可以解释为什么事情听起来很糟糕。此外,127 的幅度非常小,因此您应该尝试将其增加到最大值 (32767)。

打印字节的方式可能会增加困惑。将一个带符号的 16 位数字拆分为 2 个带符号的 8 位数字实际上没有任何意义。考虑当 16 位数字为 -1 (0xffff) 时,打印出两个有符号字节,得到 -1 (0xff) 和 -1 (0xff)。您最好将字节打印为十六进制值并在头脑中处理符号。

关于java - 如何将字节拆分/合并为音频?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24921642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com