gpt4 book ai didi

java - AudioInputStream.read 方法到底返回什么?

转载 作者:行者123 更新时间:2023-11-30 04:19:48 25 4
gpt4 key购买 nike

我在找出我使用 AudioInputStream 实际读取的内容时遇到了一些问题。下面的程序只是打印我得到的字节数组,但实际上我什至不知道这些字节是否实际上是样本,因此字节数组是音频wave

File fileIn;
AudioInputStream audio_in;
byte[] audioBytes;
int numBytesRead;
int numFramesRead;
int numBytes;
int totalFramesRead;
int bytesPerFrame;

try {
audio_in = AudioSystem.getAudioInputStream(fileIn);
bytesPerFrame = audio_in.getFormat().getFrameSize();


if (bytesPerFrame == AudioSystem.NOT_SPECIFIED) {
bytesPerFrame = 1;
}

numBytes = 1024 * bytesPerFrame;
audioBytes = new byte[numBytes];
try {
numBytesRead = 0;
numFramesRead = 0;
} catch (Exception ex) {
System.out.println("Something went completely wrong");
}
} catch (Exception e) {
System.out.println("Something went completely wrong");
}

在其他部分,我用这个读取了一些字节:

try {
if ((numBytesRead = audio_in.read(audioBytes)) != -1) {
numFramesRead = numBytesRead / bytesPerFrame;
totalFramesRead += numFramesRead;
}
} catch (Exception e) {
System.out.println("Had problems reading new content");
}

首先,这段代码不是我写的。这是我第一次阅读音频文件,因此我从互联网上获得了一些帮助。 (找到链接: Java - reading, manipulating and writing WAV filesstackoverflow,谁会知道。

问题是,audioBytes 中的字节代表什么?由于源是 44kHz 立体声,所以一定有 2 个波隐藏在某个地方,对吗?那么如何从这些字节中过滤出重要信息呢?

//编辑

所以我添加的是这个功能:

public short[] Get_Sample() {
if(samplesRead == 1024) {
Read_Buffer();
samplesRead = 4;
} else {
samplesRead = samplesRead + 4;
}
short sample[] = new short[2];
sample[0] = (short)(audioBytes[samplesRead-4] + 256*audioBytes[samplesRead-3]);
sample[1] = (short)(audioBytes[samplesRead-2] + 256*audioBytes[samplesRead-1]);
return sample;
}

其中 Read_Buffer() 读取接下来的 1024 个(或更少)字节并将它们加载到 audioBytes 中。 Sample[0] 用于左侧,sample[1] 用于右侧。但我仍然不确定,因为我从中得到的波浪看起来相当“吵闹”。 (编辑:使用的 WAV 实际上使用了小端字节顺序,所以我必须更改计算。)

最佳答案

AudioInputStream read() 方法返回原始音频数据。在使用返回 AudioFormat 的 getFormat() 读取音频格式之前,您不知道数据的“构造”是什么。从 AudioFormat 中,您可以 getChannels() 和 getSampleSizeInBits() 等等...这是因为 AudioInputStream 是针对已知格式制作的。

如果您计算样本值,则符号和符号有不同的可能性数据的字节顺序(在 16 位样本的情况下)。制作更通用的代码使用从 AudioInputStream 返回的 AudioFormat 对象来获取更多信息关于数据缓冲区:

  • 编码():PCM_SIGNED、PCM_UNSIGNED ...
  • bigEndian():真或假

正如您已经发现的那样,不正确的示例构建可能会导致一些干扰声音。如果您使用各种文件,将来可能会出现问题。如果您不提供对某些格式的支持,只需检查 AudioFormat 并抛出异常(例如 javax.sound.sampled.UnsupportedAudioFileException)。这会节省您的时间。

关于java - AudioInputStream.read 方法到底返回什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17370661/

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