我想将音频文件转换为字节数组。我目前正在这样做,我想知道它是否有效:
private static AudioFormat getFormat() {
float sampleRate = 44100;
int sampleSizeInBits = 16;
int channels = 1;
boolean signed = true;
boolean bigEndian = true;
return new AudioFormat(sampleRate, sampleSizeInBits, channels, signed,
bigEndian);
}
public static byte[] listenSound(File f) {
AudioInputStream din = null;
AudioInputStream outDin = null;
PCM2PCMConversionProvider conversionProvider = new PCM2PCMConversionProvider();
try {
AudioInputStream in = AudioSystem.getAudioInputStream(f);
AudioFormat baseFormat = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(
AudioFormat.Encoding.PCM_SIGNED,
baseFormat.getSampleRate(),
16,
baseFormat.getChannels(),
baseFormat.getChannels() * 2,
baseFormat.getSampleRate(),
false);
din = AudioSystem.getAudioInputStream(decodedFormat, in);
if (!conversionProvider.isConversionSupported(getFormat(), decodedFormat)) {
System.out.println("Conversion Not Supported.");
System.exit(-1);
}
outDin = conversionProvider.getAudioInputStream(getFormat(), din);
ByteArrayOutputStream out = new ByteArrayOutputStream();
int n = 0;
byte[] buffer = new byte[1024];
while (true) {
n++;
if (n > 1000)
break;
int count = 0;
count = outDin.read(buffer, 0, 1024);
if (count > 0) {
out.write(buffer, 0, count);
}
}
in.close();
din.close();
outDin.close();
out.flush();
out.close();
//byte[] b=out.toByteArray();
//for(int i=0; i<b.length; i++)
//System.out.println("b = "+b[i]);
return out.toByteArray();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
该字节数组数据实际上称为时域,在使用离散傅立叶将该数据转换为频域之前,我需要确定它是否有效。
谢谢你的帮助 !
最佳答案
通常,实际的已处理字节数是从类似的调用返回的
count = outDin.read(buffer, 0, 1024);
因此,除了当前处理1000个块之后的硬中断(如果API实际上返回了字节数)之外,您还应该检查一下:
int size_chunk = 1024
byte[] buffer = new byte[size_chunk];
boolean keep_streaming = true;
while (keep_streaming) {
n++;
if (n > 1000) { // troubleshooting ONLY remove later
keep_streaming = false;
}
int count = 0;
count = outDin.read(buffer, 0, size_chunk);
if (count > 0) {
out.write(buffer, 0, count);
}
if (count < size_chunk) { // input stream has been consumed
keep_streaming = false;
}
}
您没有提供指向API文档的链接,所以我无法确认,但是假设outDin.read将输出实际处理的字节数,以上代码将仅正确输出与输入匹配的字节,因此如果输入少于1兆的数据(您的原始逻辑仅在看到1000个块之后才盲目生成1兆的输出...它还假设您打算按照行在1兆的数据后截断输入
if (n > 1000) { // troubleshooting ONLY remove later
keep_streaming = false;
}
关于java - 如何将音频文件转换为字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43034608/