我使用Android Audio Record类录制音频。录音是PCM 16bit所以(我听说)最好让Audio Record将数据写入Short阵列。但是,对于我尝试做的事情,我需要将Short数组转换为字节数组。我尝试了一些方法,但所有这些方法都以不同的方式降低了音频的质量。
我试过了:
byte[] bytes2 = new byte[shortsA.length * 2];
ByteBuffer.wrap(bytes2).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().put(shortsA);
但结果是非常安静和不连贯的音频。
我尝试的第二种方法是:
byte[] MyShortToByte(short[] buffer) {
int N = buffer.length;
float f[] = new float[N];
float min = 0.0f;
float max = 0.0f;
for (int i=0; i<N; i++) {
f[i] = (float)(buffer[i]);
if (f[i] > max) max = f[i];
if (f[i] < min) min = f[i];
}
float scaling = 1.0f+(max-min)/256.0f; // +1 ensures we stay within range and guarantee no divide by zero if sequence is pure silence ...
ByteBuffer byteBuf = ByteBuffer.allocate(N);
for (int i=0; i<N; i++) {
byte b = (byte)(f[i]/scaling); /*convert to byte. */
byteBuf.put(b);
}
return byteBuf.array();
}
来自https://stackoverflow.com/a/15188181/902631的但结果是加速和高音调音频,就像原始音频以2倍速度快进。然而,音量高于第一个并且它不会波动。
我是否可以使用任何外部库或任何不会降低音频质量的音频专用转换方法?
任何帮助将不胜感激!
答案 0 :(得分:1)
为什么不试试这个,在从AudioRecord对象读取数据时,将其读入byte []数组而不是短数组
audioRecord.startRecording();
byte[] buffer = new byte[_bufferSize]; //recorded data is stored in this byte array
audioRecord.read(buffer, 0, _bufferSize);
答案 1 :(得分:0)
首先,你不能在不降低质量的情况下改变音频的位深度。我真的不确定你是如何进行缩放的。看看下面的指示性代码,以了解减少位数的方法完成。
float byteNorm = Absolute(Byte.MaxValue); //255
float shortNorm = Absolute(Short.MinValue); //32768
for (int audioSample = 0; audioSample < numShorts; audioSample++)
{
myActualSample = (float)myShorts[audioSample] / shortNorm;
myBytes[audioSample] = (byte)(mySample * byteNorm);
}