我一直在寻找这个,但似乎没有人回答我的问题。 我一直试图通过这个绘制/绘制一个wav文件:
int result = 0;
try {
result = audioInputStream.read(bytes);
} catch (Exception e) {
e.printStackTrace();
}
然后使用结果作为图表的变量。我一直在想是否首先将结果更改为分贝是正确的。另外,我是否正确使用结果作为变量在图表中使用?或者有什么方法可以用来绘制wav文件吗?
答案 0 :(得分:4)
您需要做的第一件事是读取文件的样本,这将为您提供波形的最小/最大范围(声波)......
File file = new File("...");
AudioInputStream ais = null;
try {
ais = AudioSystem.getAudioInputStream(file);
int frameLength = (int) ais.getFrameLength();
int frameSize = (int) ais.getFormat().getFrameSize();
byte[] eightBitByteArray = new byte[frameLength * frameSize];
int result = ais.read(eightBitByteArray);
int channels = ais.getFormat().getChannels();
int[][] samples = new int[channels][frameLength];
int sampleIndex = 0;
for (int t = 0; t < eightBitByteArray.length;) {
for (int channel = 0; channel < channels; channel++) {
int low = (int) eightBitByteArray[t];
t++;
int high = (int) eightBitByteArray[t];
t++;
int sample = getSixteenBitSample(high, low);
samples[channel][sampleIndex] = sample;
}
sampleIndex++;
}
} catch (Exception exp) {
exp.printStackTrace();
} finally {
try {
ais.close();
} catch (Exception e) {
}
}
//...
protected int getSixteenBitSample(int high, int low) {
return (high << 8) + (low & 0x00ff);
}
然后你需要确定最小/最大值,下一个例子只是检查通道0,但是你可以使用相同的概念来检查所有可用的通道......
int min = 0;
int max = 0;
for (int sample : samples[0]) {
max = Math.max(max, sample);
min = Math.min(min, sample);
}
仅供参考:阅读文件
时填充此信息会更有效一旦你有了这个,你就可以对样本进行建模......但这取决于你打算使用的框架......