【问题标题】:Android: AudioRecord Error code -20 when initializing native AudioRecord objectAndroid:初始化本机 AudioRecord 对象时的 AudioRecord 错误代码 -20
【发布时间】:2012-06-08 00:30:38
【问题描述】:

Android:我想从 mic 读取缓冲区,以便我可以对其执行处理,以下是我的代码

int sampleRateInHz = 8000;// 44100, 22050 and 11025
        int channelConfig = AudioFormat.CHANNEL_CONFIGURATION_MONO;
        int audioFormat = AudioFormat.ENCODING_PCM_16BIT;

        //int bufferSize =11025 + 
        int bufferSize = AudioRecord.getMinBufferSize(sampleRateInHz,channelConfig, audioFormat);


        short[] buffer = new short[bufferSize];

        AudioRecord audioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, sampleRateInHz,channelConfig, audioFormat, bufferSize);

        if(audioRecord.getState()== AudioRecord.STATE_INITIALIZED){
            audioRecord.startRecording();
            Log.e("recording", "before");


            boolean flag = true;
            while (flag) {
                int bufferReadResult = audioRecord.read(buffer, 0, bufferSize);
                System.out.println(buffer);
            }

            audioRecord.stop();
            audioRecord.release();
        }
        Log.e("recording", "stopeed");


<uses-permission android:name="android.permission.RECORD_AUDIO"></uses-permission>

每次我尝试测试程序时都会出现以下错误

06-04 00:18:17.222: E/AudioRecord-Java(488): [android.media.AudioRecord] 初始化本机 AudioRecord 对象时出现错误代码 -20。

【问题讨论】:

    标签: android avaudiorecorder android-audiorecord


    【解决方案1】:

    据我了解,CHANNEL_CONFIGURATION_MONO 已贬值,您应该在读取缓冲区时改用 CHANNEL_IN_MONO。我在实例化 AudioRecord 对象时遇到了类似的问题,结果证明这是我的解决方案。

    【讨论】:

    • 我的 api 级别是 7,在 api 7 中没有 CHANNEL_IN_MONO 只有 CHANNEL_CONFIGURATION_MONO
    • 我使用的是 api 3 级 android 平台 1.5,这就是问题所在,我将 api 级别升级到 api 7 级,即平台 2.1 并且它已修复。我也从 CHANNEL_CONFIGURATION_MONO 更改为 CHANNEL_IN_MONO。我还注意到模拟器中的 api level 3 没有用于录音的属性。感谢您的大力帮助。
    【解决方案2】:

    如果

    也会引发此异常
    1. 录音已在进行中或
    2. 录音不可用或
    3. 应用程序没有适当的权限例如:应用程序没有记录权限等

    【讨论】:

    • 第三个建议在这里很重要,因为错误根本不是描述性的。对于其他任何人,只需将其添加到您的清单中:
    • 仅适用于Android新手,当targetApi >= 23时,需要在运行时授予权限。查看this article
    【解决方案3】:

    这可能是答案吗?:

    参数:

    audioSource – 录音源。有关录制源定义,请参见 MediaRecorder.AudioSource。

    sampleRateInHz – 以赫兹表示的采样率。 44100Hz 是目前唯一保证适用于所有设备的频率,但其他频率(例如 22050、16000 和 11025)可能适用于某些设备。

    AudioFormat.SAMPLE_RATE_UNSPECIFIED 表示使用与路由相关的值,通常是源的采样率。 getSampleRate() 可用于检索选择的实际采样率。

    channelConfig – 描述音频通道的配置。看 AudioFormat.CHANNEL_IN_MONO 和 AudioFormat.CHANNEL_IN_STEREO。 AudioFormat.CHANNEL_IN_MONO 保证适用于所有设备。

    audioFormat – 返回音频数据的格式。请参阅 AudioFormat.ENCODING_PCM_8BIT、AudioFormat.ENCODING_PCM_16BIT 和 AudioFormat.ENCODING_PCM_FLOAT。

    bufferSizeInBytes – 在录制期间写入音频数据的缓冲区的总大小(以字节为单位)。新的音频数据可以从这个缓冲区中以小于这个大小的块读取。请参阅 getMinBufferSize(int, int, int) 以确定成功创建 AudioRecord 实例所需的最小缓冲区大小。 使用小于 getMinBufferSize() 的值会导致初始化失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 2011-05-08
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-01-18
      • 1970-01-01
      相关资源
      最近更新 更多