Android的AudioRecord与Java的SE AudioFormat的兼容性

时间:2015-06-02 12:05:25

标签: java android audio-recording

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

1 个答案:

答案 0 :(得分:0)

您可以AudioRecord直接录制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);

然后使用read(byte[], int, int)方法从audioRecord中提取数据:

byte[] myBuf = new byte[bufferSize];
audioRecord.startRecording();
while (audioRecord.getRecordingState() == AudioRecord.RECORDSTATE_RECORDING) {
    int l = audioRecord.read(myBuf, 0, myBuf.length);
    if (l > 0) {
        // process data
    }
}

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

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
    }

使用相同的方法,您可以将任何PCM格式重新采样为任何其他格式;