Записвам аудио с помощта на класа Android Audio Record. Записът е PCM 16bit, така че (чух) е най-добре да оставите Audio Record да запише данните в кратък масив. Но за това, което се опитвам да направя, трябва да преобразувам краткия масив в байтов масив. Опитах няколко метода, но всички те влошават качеството на звука по различни начини.
Първо опитах:
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, но резултатът е ускорен и висок звук, като оригиналното аудио беше превъртяно напред с 2x скорост. Силата на звука обаче е по-висока от първата и не е накъсана.
Има ли външни библиотеки, които мога да използвам, или някакви специфични за аудио методи за конвертиране, които не влошават качеството на аудиото?
Всяка помощ ще бъде оценена!