【问题标题】:Android: startRecording() called on an uninitialized AudioRecord when SAMPLERATE set to 44100Android:当 SAMPLERATE 设置为 44100 时,在未初始化的 AudioRecord 上调用 startRecording()
【发布时间】:2015-02-16 10:50:40
【问题描述】:

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

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

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: startRecording() 在未初始化的 AudioRecord 上调用。

以下是相关代码:

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

【问题讨论】:

    标签: java android sampling audiorecord


    【解决方案1】:

    别忘了也请求 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);
        }
    

    【讨论】:

    • 此调用需要使用最低 API 级别 23
    【解决方案2】:

    您可以检查您的设备是否支持 44100。 Android 没有提供明确的检查方法,但有一个使用 AudioRecord 类的 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
    
            }
        }
    }
    

    【讨论】:

    • @user3333414 你的设备支持44100采样率吗?
    • 令人惊讶的是,它没有,即使它是 2014 年末的手机。谢谢。
    • 我建议将阵列顺序切换为:{44100, 22050, 11025, 16000, 8000},以便您始终先尝试更高的记录速率。如果设备支持多种格式,这样您就可以保证最高质量的音频录制。
    • 现在都支持:P
    猜你喜欢
    • 2018-09-14
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多