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