Android的兼容性';使用Java';s SE音频格式

Android的兼容性';使用Java';s SE音频格式,java,android,audio-recording,Java,Android,Audio Recording,我正在编写一个Android应用程序,它将录制的声音发送到服务器,我需要将其格式调整为所需的格式。我被告知服务器的音频格式由javax.sound.sampled.AudioFormat类构造函数指定,并带有以下参数:AudioFormat(44100,8,1,true,true),这意味着所需的声音应具有44100采样率、8位采样大小、单声道,并以大端字节顺序进行签名和编码。我的问题是如何将录制的声音转换为我想要的声音?我认为最大的问题可能是Android的16b限制,就最小的样本量而言您可以

我正在编写一个Android应用程序,它将录制的声音发送到服务器,我需要将其格式调整为所需的格式。我被告知服务器的音频格式由javax.sound.sampled.AudioFormat类构造函数指定,并带有以下参数:AudioFormat(44100,8,1,true,true),这意味着所需的声音应具有44100采样率、8位采样大小、单声道,并以大端字节顺序进行签名和编码。我的问题是如何将录制的声音转换为我想要的声音?我认为最大的问题可能是Android的16b限制,就最小的样本量而言

您可以通过在构造函数中指定格式直接记录44100个8bit

int bufferSize = Math.max(
    AudioRecord.getMinBufferSize(44100, 
        AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT),
    ENOUGH_SIZE_FOR_BUFFER);
AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, 
    44100, AudioFormat.CHANNEL_IN_MONO, AudioFormat.ENCODING_PCM_8BIT, bufferSize);
然后使用以下方法从音频记录中提取数据:

在这种情况下,缓冲区中的数据将是您想要的:8位,单声道,44100。
但是,有些设备可能不支持8位记录。在这种情况下,您可以以16位格式记录数据,并使用方法获取数据。在这种情况下,您需要自己重新采样数据:

short[] recordBuf = new short[bufferSize];
byte[] myBuf = new byte[bufferSize];

...

    int l = audioRecord.read(recordBuf, 0, recordBuf.length);
    if (l > 0) {
        for (int i = 0; i < l; i++) {
           myBuf[i] = (byte)(recordBuffer[I] >> 8);
        }
        // process data
    }
short[]recordBuf=新的short[bufferSize];
字节[]myBuf=新字节[bufferSize];
...
int l=音频记录读取(recordBuf,0,recordBuf.length);
如果(l>0){
对于(int i=0;i>8);
}
//过程数据
}
使用相同的方法,您可以将任何PCM格式重新采样为任何其他格式

short[] recordBuf = new short[bufferSize];
byte[] myBuf = new byte[bufferSize];

...

    int l = audioRecord.read(recordBuf, 0, recordBuf.length);
    if (l > 0) {
        for (int i = 0; i < l; i++) {
           myBuf[i] = (byte)(recordBuffer[I] >> 8);
        }
        // process data
    }