Статус ошибки AudioRecord start () -38

Я пытаюсь настроить аудиорекордер, но постоянно получаю определенную ошибку, и не могу понять, почему. в моем коде я проверил, в каком состоянии находится аудиомагнитофон с журналом до и после метода startrecording().

ar = new AudioRecord(audiosource, sampleRate, channelConfiguration,
                audioEncoding, buffersizebytes);
Log.d("info", "ar.getState() before = " + String.valueOf(ar.getState()));
ar.startRecording();
Log.d("info", "ar.getState() after = " +String.valueOf(ar.getState()));

Когда я запускаю приложение, я получаю эти сообщения в logcat.

D/info﹕ ar.getState() before = 1
E/AudioRecord﹕ start() status -38
D/info﹕ ar.getState() after = 1

из того, что я прочитал в документации, состояние 1 может либо соответствовать аудиорекордеру, находящемуся в состояниях RECORDSTATE_STOPPED, либо STATE_INITIALIZED, ни одно из этих двух не должно вызывать проблемы при вызове startRecording().

Статус -38 Я полагаю, что это код errno.h для /* Функция не реализована */ относится ли это к методу startRecording() или, как указано в ошибке, к функции start(), которая не является методом для класса AudioRecorder.< br/>
Я испробовал несколько методов, чтобы убедиться, что функция release() была вызвана, поэтому я не думаю, что проблема в этом.

Любая помощь приветствуется.


person mkrinblk    schedule 28.01.2015    source источник
comment
github.com/audioBoom/audioboo- android/blob/master/src/fm/ проверьте надежный рекордер Android   -  person Robert Rowntree    schedule 29.01.2015


Ответы (1)


хорошо, так что это то, что я думаю, что мне нужно было сделать, об этом действительно нужно говорить в документации AudioRecorder, но этот аналогичный вопрос привел меня к ответу Объект AudioRecord не инициализируется в основном, что вы хотите сделать, это перебрать все конфигурации и попробовать каждую из них против проверки AudioRecord.ERROR_BAD_VALUE, так как я планировал использовать fft, в котором длина должна быть степень 2, которую я добавил немного, если еще, если часть, если кто-то еще столкнется с подобной ситуацией

public AudioRecord findAudioRecord() {
    for (int rate : mSampleRates) {
        for (short audioFormat : new short[]{AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT}) {
            for (short channelConfig : new short[]{AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO}) {
                try {
                    //Log.d("audioSetup", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig);
                    int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
                    if (bufferSize > 0 && bufferSize <= 256){
                        bufferSize = 256;
                    }else if (bufferSize > 256 && bufferSize <= 512){
                        bufferSize = 512;
                    }else if (bufferSize > 512 && bufferSize <= 1024){
                        bufferSize = 1024;
                    }else if (bufferSize > 1024 && bufferSize <= 2048){
                        bufferSize = 2048;
                    }else if (bufferSize > 2048 && bufferSize <= 4096){
                        bufferSize = 4096;
                    }else if (bufferSize > 4096 && bufferSize <= 8192){
                        bufferSize = 8192;
                    }else if (bufferSize > 8192 && bufferSize <= 16384){
                        bufferSize = 16384;
                    }else{
                        bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);
                    }

                    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                        // check if we can instantiate and have a success
                        AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.DEFAULT, rate, channelConfig, audioFormat, bufferSize);

                        if (recorder.getState() == AudioRecord.STATE_INITIALIZED) {
                            Log.d("found", "rate: " + rate + " channelConfig: " + channelConfig + " bufferSize: " + bufferSize + " audioFormat: " + audioFormat);
                            sampleRate = rate;
                            channelConfiguration = channelConfig;
                            audioEncoding = audioFormat;
                            buffersizebytes = bufferSize;
                            return recorder;
                        }
                    }
                } catch (Exception e) {
                    Log.d("audioSetup", rate + "Exception, keep trying.", e);
                    e.printStackTrace();
                }
            }
        }
    }
    return null;
}

кажется, работает хорошо. Спасибо за помощь.

person mkrinblk    schedule 06.02.2015
comment
Вы можете исключить длинную цепочку if..else. int minBufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if(minBufferSize != AudioRecord.ERROR_BAD_VALUE && minBufferSize != AudioRecord.ERROR) { int bufferSize = 256; while(bufferSize < minBufferSize) bufferSize <<= 1; AudioRecord recorder = new AudioRecord(); // ... } (Извините за форматирование.) - person apaatsio; 20.03.2019