Android:当 SAMPLERATE 设置为 44100 时,startRecording() 在未初始化的 AudioRecord 上调用

Android: startRecording() called on an uninitialized AudioRecord when SAMPLERATE set to 44100

当我将 AudioRecord 对象的采样率设置为 44100 时出现错误。当它是 22050 时它工作正常。

02-16 10:45:45.099 24021-24021/com.vlad.jackcomms E/AudioRecord:frameCount 1024 < minFrameCount 1792

02-16 10:45:45.099 24021-24021/com.vlad.jackcomms E/AudioRecord-JNI:创建AudioRecord实例时出错:初始化检查失败。

02-16 10:45:45.099 24021-24021/com.vlad.jackcomms E/android.media.AudioRecord:初始化原生AudioRecord对象时错误码-20.

02-16 10:45:45.109 24021-24021/com.vlad.jackcomms E/AndroidRuntime:致命的

例外:主要 进程:com.vlad.jackcomms,PID:24021 java.lang.IllegalStateException: 在未初始化的 AudioRecord 上调用了 startRecording()。

相关代码如下:

private static final int RECORDER_SAMPLERATE = 22050*2;
private static final int RECORDER_CHANNELS = AudioFormat.CHANNEL_IN_MONO;
private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT;

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,
            RECORDER_AUDIO_ENCODING, BufferElements2Rec * BytesPerElement);

    recorder.startRecording();

您可以检查您的设备是否支持 44100。 Android 没有提供明确的方法来检查它,但有一个使用 AudioRecord class' getMinBufferSize 函数的解决方法。

public void getValidSampleRates() {
    for (int rate : new int[] {44100, 22050, 11025, 16000, 8000}) {  // add the rates you wish to check against
        int bufferSize = AudioRecord.getMinBufferSize(rate, AudioFormat.CHANNEL_CONFIGURATION_DEFAULT, AudioFormat.ENCODING_PCM_16BIT);
        if (bufferSize > 0) {
            // buffer size is valid, Sample rate supported

        }
    }
}

别忘了也请求 AUDIO_RECORD 许可

private void checkRecordPermission() {

    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.RECORD_AUDIO)
            != PackageManager.PERMISSION_GRANTED) {

        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO},
                123);
    }