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