我有二维整数数组。第一个索引表示通道数。第二个表示通道中的样本数。如何将此数组保存到音频文件中?我知道,我必须将它转换为字节数组,但我不知道该怎么做。
//编辑
更多信息。我已经有一个用于绘制波形的类。它在这里:
http://javafaq.nu/java-example-code-716.html
现在我想切割此波的一部分并将其保存到新文件中。所以我必须切割部分int [] [] samplesContainer,将其转换为字节数组(我不知道如何),然后将其保存到文件中,格式与audioInputStream相同。
//编辑
行。所以最大的问题是将倒置函数写入这个:
protected int[][] getSampleArray(byte[] eightBitByteArray) {
int[][] toReturn = new int[getNumberOfChannels()][eightBitByteArray.length / (2 * getNumberOfChannels())];
int index = 0;
//loop through the byte[]
for (int t = 0; t < eightBitByteArray.length;) {
//for each iteration, loop through the channels
for (int a = 0; a < getNumberOfChannels(); a++) {
//do the byte to sample conversion
//see AmplitudeEditor for more info
int low = (int) eightBitByteArray[t];
t++;
int high = (int) eightBitByteArray[t];
t++;
int sample = (high << 8) + (low & 0x00ff);
if (sample < sampleMin) {
sampleMin = sample;
} else if (sample > sampleMax) {
sampleMax = sample;
}
//set the value.
toReturn[a][index] = sample;
}
index++;
}
return toReturn;
}
我不明白为什么在高之后有t的第二次增量。我也不知道如何从样本中获得高低。
答案 0 :(得分:1)
您发布的代码将一个逐字节的样本流读入samples数组。该代码假设在流中,每两个8位字节构成一个16位样本,并且每个NumOfChannels通道都有一个样本。
因此,给定一个像该代码返回的样本数组
int[][] samples;
和一个用于流式传输的字节数组,
byte[] stream;
你可以用这种方式建立相反的字节流
for (int i=0; i<NumOfSamples; i++) {
for (int j=0; j<NumOfChannels; j++) {
int sample=samples[i][j];
byte low = (byte) (sample & 0xff) ;
byte high = (byte) ((sample & 0xff00 ) >> 8);
stream[((i*NumOfChannels)+j)*2] = low;
stream[(((i*NumOfChannels)+j)*2)+1] = high;
}
}