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