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

Я записываю звук с помощью класса Android Audio Record. Запись 16-битная PCM, поэтому (как я слышал) лучше всего позволить 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, но результат ускорен и пронзительный звук, как будто исходный звук был перемотан вперед с удвоенной скоростью. Однако объем выше, чем у первого, и он не прерывистый.

Существуют ли какие-либо внешние библиотеки, которые я могу использовать, или какие-либо специальные методы преобразования звука, которые не ухудшают качество звука?

Любая помощь будет оценена по достоинству!


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