gpt4 book ai didi

java - 获取 API Java 声音中的信号电平

转载 作者:行者123 更新时间:2023-12-03 01:52:13 25 4
gpt4 key购买 nike

我正在读取带有 API JAVA 声音的声音,我想恢复信号电平。我读取文件没有问题,这是我用来尝试获取信号电平的代码:

for (byte bit:bytes) {
if (i<2) {
signalLevelLeft=signalLevelLeft+Math.abs(bit);
System.out.println("Left : "+i+" - "+bit);
i++;
} else if (2<=i && i<3) {
signalLevelRight=signalLevelRight+Math.abs(bit);
//System.out.println("Right : "+i+" - "+bit);
i++;
} else if (i==3) {
signalLevelRight=signalLevelRight+Math.abs(bit);
//System.out.println("Right : "+i+" - "+bit);
i=0;
}


if (signalLevelLeft>maxLeft) {
maxLeft= signalLevelLeft;
System.out.println("Max left : " + maxLeft);
}

在我获得 audioInputStream、格式、行、打开行 (..) 之后,这是我用来读取声音并提供上面看到的方法的代码:
    try {
byte bytes[] = new byte[1024];
int bytesRead=0;
while (((bytesRead = audioInputStream.read(bytes, 0, bytes.length)) != -1) && !stop) {
line.write(bytes, 0, bytesRead);
}
} catch (IOException io) {
io.printStackTrace();
return;
}

为了测试信号电平,我大胆地只在左声道上生成了一个平方信号,并用我的代码读取了它(如果你这样做,请注意,这声音真的很难看)。以下是结果:
在正确的 channel 上它是完美的,信号处处为 0:

右:2 - 0

右:3 - 0

右:2 - 2

右:3 - 0 (...)

在左声道,我有这个奇怪的结果:

左:0 - 0

左:1 - -128

左:0 - 1

左:1 - -128 (...)

左:0 - -1

左:1 - 127

左:0 - -1

左:1 - 127

为什么我在左声道上有那些 0 ?由于我有一个平方信号,我想我会得出这样的结果:

左:0 - -128

左:1 - -128

左:0 - -128

左:1 - -128 (...)

左:0 - 127

左:1 - 127

左:0 - 127

左:1 - 127

当然,我对仅右信号甚至立体声信号也有同样的奇怪结果:似乎只有 2 上的 1 信息携带信号。我还检查了 Audacity 的最大缩放,它实际上是一个任何 0 的平方信号......

感谢您的回答,祝您有美好的一天。

最佳答案

好的,我终于得到了答案(菲尔的小费,谢谢......)。你是对的,每个 PCM 值有 2 个字节,在小端模式下。所以我必须捕获前两个字节,用那种符号将第二个字节移到左边的 8 位:“>>”,然后添加第二个字节。
2 个字节的这种加法(我应该说连接吗?)的结果是 PCM 值。

我用正弦信号和平方信号对其进行了测试,结果还可以:我得到了预期的值。

这是我使用的代码:

byte b1, b2, b3, b4;
for (byte octet : bytes) {
if (i==1) {
//Gauche
b1=octet;
//System.out.println(i+" *** "+bit);
i++;
} else if (i==2) {
b2=octet;
//Gauche
if (Math.abs((b2<<8)+b1)> signalLevelLeft) {
signalLevelLeft=Math.abs((b2<<8)+b1);
//c2=Math.abs((b2<<8)+b1);
//System.out.println("Gauche : "+c2);
}
i++;
} else if (i==3) {
//Droite
b3=octet;
//System.out.println(i+" *** "+bit);
i++;
} else if (i==4) {
//Droite
b4=octet;
if (Math.abs((b4<<8)+b3)>signalLevelRight) {
signalLevelRight=Math.abs((b4<<8)+b3);
//c4=Math.abs((b4<<8)+b3);
//System.out.println("Droite : "+c4);
}
i=1;
}
}

祝大家有个美好的一天...

关于java - 获取 API Java 声音中的信号电平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697205/

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