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

限于喜欢 提交于 2019-12-08 20:37:47

问题


I get an error, when I set the sampling rate to 44100 for the AudioRecord object. When it's 22050 it works fine.

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﹕ Error creating AudioRecord instance: initialization check failed.

02-16 10:45:45.099 24021-24021/com.vlad.jackcomms E/android.media.AudioRecord﹕ Error code -20 when initializing native AudioRecord object.

02-16 10:45:45.109 24021-24021/com.vlad.jackcomms E/AndroidRuntime﹕ FATAL

EXCEPTION: main Process: com.vlad.jackcomms, PID: 24021 java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.

Here's the relevant code:

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();

回答1:


Don't forget to ask for AUDIO_RECORD permission too

private void checkRecordPermission() {

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

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



回答2:


You could check if 44100 is supported by your device. Android does not provide an explicit method to check it but there is a work-around with AudioRecord class' getMinBufferSize function.

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

        }
    }
}


来源:https://stackoverflow.com/questions/28539717/android-startrecording-called-on-an-uninitialized-audiorecord-when-samplerate

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!