android-PCM流/麦克风卡死

我目前正在开发一个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];

如果有人对代码感兴趣和/或有类似问题,我将在线上提问.

上一篇:在Android中将16位pcm音频下采样为8位


下一篇:java-带符号的16位PCM转换不起作用.为什么?