web-dev-qa-db-ja.com

Android:SAMPLERATEが44100に設定されている場合、初期化されていないAudioRecordでstartRecording()が呼び出されます

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

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);
    }
10
Cédric Dufouil

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

        }
    }
}
13
LaurentY