【问题标题】:AudioRecord start() error status -38AudioRecord start() 错误状态 -38
【发布时间】:2018-02-09 19:57:33
【问题描述】:

我正在尝试设置录音机,但我不断收到特定错误,我不知道为什么。在我的代码中,我在 startrecording() 方法之前和之后使用 Log 检查了录音机的状态。

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 类的方法.

我尝试了多种方法来确保调用了 release() 函数,所以我认为这不是问题所在。

非常感谢任何帮助。

【问题讨论】:

标签: android android-audiorecord


【解决方案1】:

好吧,我认为我需要这样做 基本上你想要做的是遍历所有配置并尝试每个配置都检查 AudioRecord.ERROR_BAD_VALUE 也是因为我计划使用长度必须是 2 的幂的 fft 我添加了一点 if else if 部分如果有人else 遇到类似情况

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;
}

似乎工作得很好。感谢您的帮助。

【讨论】:

  • 您可以消除长 if..else 链。 int minBufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat); if(minBufferSize != AudioRecord.ERROR_BAD_VALUE &amp;&amp; minBufferSize != AudioRecord.ERROR) { int bufferSize = 256; while(bufferSize &lt; minBufferSize) bufferSize &lt;&lt;= 1; AudioRecord recorder = new AudioRecord(); // ... }(抱歉格式化。)
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
相关资源
最近更新 更多