Преобразуване на кратък масив от аудиозапис в байтов масив без влошаване на качеството на звука?

Записвам аудио с помощта на класа 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 скорост. Силата на звука обаче е по-висока от първата и не е накъсана.

Има ли външни библиотеки, които мога да използвам, или някакви специфични за аудио методи за конвертиране, които не влошават качеството на аудиото?

Всяка помощ ще бъде оценена!


person kevdliu    schedule 10.07.2014    source източник


Отговори (2)


Защо не опитате това, докато четете данни от обект AudioRecord, четете ги в масив byte[] вместо кратък масив

audioRecord.startRecording();
byte[] buffer = new byte[_bufferSize]; //recorded data is stored in this byte array
audioRecord.read(buffer, 0, _bufferSize);
person Venkat    schedule 02.11.2016
comment
Вашият отговор можеше да бъде много по-полезен, ако включихте как да получите _bufferSize - person Serj Sagan; 05.01.2019

Първо, не можете да промените битовата дълбочина на вашето аудио, без да влошите качеството. Наистина не съм сигурен как правите своето мащабиране. Погледнете следния примерен код, за да получите представа как може да се направи намаляване на битовете.

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);
}
person KillaKem    schedule 10.07.2014