我目前正在开发一个Android应用程序,该应用程序必须将麦克风输入记录为PCM流.
每当我录制一些东西时,我都会遇到一些奇怪的断断续续的情况,而我找不到解决方案.
这是我的代码:
在我的MainActivity中,我有一个用于麦克风输入的ASyncTask:
ArrayList<byte[]> mBufferList;
@Override
protected String doInBackground(String... params) {
Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
mMicrophone = new Microphone();
mMicrophone.init();
byte[] buffer;
while (mRecord) {
try {
mMicrophone.record();
buffer = mMicrophone.getBuffer();
mBufferList.add(buffer);
}
catch
{
}
}
}
在我的Microphone类中,我初始化AudioRecorder:
public void init() {
Log.d("DEBUG", "Microphone: Recording started");
mBufferSize = AudioRecord.getMinBufferSize(44100,
AudioFormat.CHANNEL_IN_STEREO,
AudioFormat.ENCODING_PCM_16BIT);
mRecorder = new AudioRecord(AudioSource.MIC, 44100,
AudioFormat.CHANNEL_CONFIGURATION_MONO,
AudioFormat.ENCODING_PCM_16BIT, mBufferSize);
mRecorder.startRecording();
mBuffer = new short[mBufferSize];
}
记录方法:
public void record() throws IOException {
mRecorder.read(mBuffer, 0, mBufferSize);
}
Short []到Byte []:
public byte[] shortToBytes(short[] sData) {
int shortArrsize = sData.length;
byte[] bytes = new byte[shortArrsize * 2];
for (int i = 0; i < shortArrsize; i++) {
bytes[i * 2] = (byte) (sData[i] & 0x00FF);
bytes[(i * 2) + 1] = (byte) (sData[i] >> 8);
sData[i] = 0;
}
return bytes;
}
检索缓冲区的方法:
public byte[] getBuffer() {
byte[] buffer = shortToBytes(mBuffer);
return buffer;
}
我上传了一个演示口吃效果的wav文件.我说的是“一个”:
Wav-File
我已经尝试过更改采样率,buffersizes等,但无济于事.
任何帮助都非常感谢!如果有人可以帮助我,那就太好了!
请注意:此错误不是由我重播pcm流的方式引起的,因为我已经在android设备上对其进行了测试,甚至将原始数据发送到服务器以将文件转换为WAV.
解决方法:
经过数小时的拼命寻找解决方案,我终于找到了错误.
我偶然在Microphone类中创建了我的短缓冲区,如下所示:
mBuffer = new short[mBufferSize];
虽然缓冲区大小以字节为单位,所以我当然必须使用mBuffersize / 2
mBuffer = new short[mBufferSize/2];
如果有人对代码感兴趣和/或有类似问题,我将在线上提问.