我正在编写一个Android应用程序,它向服务器发送录制的声音,我需要调整它的格式以适应所需的格式。我被告知服务器的音频格式是由javax.sound.sampled.AudioFormat类构造函数指定的,其参数如下: AudioFormat(44100、8、1、true、true),这意味着所需的声音应该有44100采样率、8位样本大小、单通道,并使用大端字节顺序进行签名和编码。我的问题是如何将我录制的声音转换成我想要的声音?我认为最大的问题可能是Android对最小样本的16b限制
发布于 2015-06-02 23:54:14
您可以通过AudioRecord直接记录44100 8位,在构造函数中指定格式。
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);然后从audioRecord中提取数据,使用[read(byte[],int,int)](http://developer.android.com/reference/android/media/AudioRecord.html#read(byte[],%20int,%20int%29)方法:
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位,mono,44100。
但是,有些设备可能不支持8位录音。在这种情况下,您可以以16位格式记录数据,并使用[read(short[],int,int)](http://developer.android.com/reference/android/media/AudioRecord.html#read(short[],%20int,%20int%29)方法获取数据。在这种情况下,您需要自己重新整理数据:
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格式重采样到任何其他格式;
https://stackoverflow.com/questions/30595610
复制相似问题