【问题标题】:Converting Short array from Audio Record to Byte array without degrading audio quality?将短数组从音频记录转换为字节数组而不降低音频质量?
【发布时间】:2014-07-10 03:20:49
【问题描述】:

我正在使用 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 倍速度快进一样。但是音量比第一个高,而且不波涛汹涌。

是否有任何我可以使用的外部库或任何不会降低音频质量的特定于音频的转换方法?

任何帮助将不胜感激!

【问题讨论】:

    标签: android audio byte record short


    【解决方案1】:

    你为什么不试试这个,从 AudioRecord 对象读取数据时,将其读入 byte[] 数组而不是短数组

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

    【讨论】:

    • 如果您包括如何获得_bufferSize,您的答案可能会更有用
    【解决方案2】:

    首先,您无法在不降低质量的情况下更改音频的位深度。我真的不确定您是如何进行缩放的。请查看以下指示性代码以了解如何进行位减少.

    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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2019-12-27
      • 1970-01-01
      • 2013-05-04
      • 2011-09-08
      • 1970-01-01
      • 2020-12-05
      相关资源
      最近更新 更多