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

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

с /questions/6487781/audiotrack-korotkoe-iskazhenie-massiva-v-bajtovyij-massiv-s-ispolzovaniem-jlayerjava-mp3-decoder/6487798#6487798 но в результате получилось ускорение и высокий звук, как будто исходный звук был быстро продвинут с 2-кратной скоростью. Однако громкость выше, чем у первой, и она не прерывистая.

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

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

2 ответа

Почему бы вам не попробовать это, пока вы читаете данные из объекта AudioRecord, читайте их в массив byte[] вместо короткого массива

audioRecord.startRecording();
byte[] buffer = new byte[_bufferSize]; //recorded data is stored in this byte array
audioRecord.read(buffer, 0, _bufferSize);

Во-первых, вы не можете изменить битовую глубину вашего аудио без ухудшения качества. Я действительно не уверен, как вы делаете свое масштабирование. Посмотрите на следующий примерный код, чтобы получить представление о том, как можно уменьшить биты.

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);
}
Другие вопросы по тегам