【问题标题】:Cannot initialize a valid AudioRecord无法初始化有效的 AudioRecord
【发布时间】:2016-05-20 09:55:27
【问题描述】:

我正在尝试实例化 AudioRecord 以实时监控音频,但即使我尝试了多种不同的配置,它也会失败。

我已尝试多次重启手机,我已经

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

在我的清单中(在&lt;manifest&gt; 标记中,而不是在&lt;application&gt; 标记中)。

我为这个问题找到的解决方案是确保权限正确并且在正确的位置(检查),确保在所有 @987654326 上调用 release() @ 实例(check),重新启动手机(check)并使用一种方法找到采样率、音频格式和通道配置的有效组合(检查)。

顺便说一下,我已经在运行 Android 4.4.2 的三星 Galaxy S5 和运行 Android 4.4.4 的摩托罗拉 Moto G 上进行了尝试。

 

这是我尝试查找有效AudioRecord 的代码:

public AudioRecord findAudioRecord() {
    int[] mSampleRates = new int[] { 44100, 11025, 22050, 16000, 8000 };
    short [] aformats = new short[] { AudioFormat.ENCODING_PCM_16BIT, AudioFormat.ENCODING_PCM_8BIT };
    short [] chConfigs = new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO };


    for (int rate : mSampleRates) {
        for (short audioFormat : aformats) {
            for (short channelConfig : chConfigs) {
                try {
                    Log.d("SoundMeter", "Attempting rate " + rate + "Hz, bits: " + audioFormat + ", channel: " + channelConfig);
                    int bufferSize = AudioRecord.getMinBufferSize(rate, channelConfig, audioFormat);

                    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                        Log.d("SoundMeter", "Buffer size OK");

                        // Try to instantiate
                        AudioRecord recorder = new AudioRecord(android.media.MediaRecorder.AudioSource.MIC, rate, channelConfig, audioFormat, java.lang.Math.max(bufferSize,1024*800));

                        if( recorder.getState() == AudioRecord.STATE_INITIALIZED ){
                            Log.d("SoundMeter", "Success: AudioRecord initialized!");
                            return recorder;
                        }
                        else {
                            Log.d("SoundMeter", "Failed: AudioRecord not initialized");

                            // Important! Release recorder
                            recorder.release();
                        }
                    }
                }
                catch (Exception e) {
                    Log.e("SoundMeter", "Exception on sample rate " + rate + "\n   ", e);
                }
            }
        }
    }
    Log.println(Log.ASSERT, "SoundMeter", "No valid audio record configuration found!");

    return null;
}

这是运行上述方法的 logcat:

05-20 11:42:34.146 8326-8326/com.my.app D/SoundMeter: Attempting rate 44100Hz, bits: 2, channel: 16
05-20 11:42:34.156 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.196 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.196 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.196 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.196 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.196 8326-8326/com.my.app D/SoundMeter: Attempting rate 44100Hz, bits: 2, channel: 12
05-20 11:42:34.196 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.196 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.206 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.206 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Attempting rate 44100Hz, bits: 3, channel: 16
05-20 11:42:34.206 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Attempting rate 44100Hz, bits: 3, channel: 12
05-20 11:42:34.206 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Attempting rate 11025Hz, bits: 2, channel: 16
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.206 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.206 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.206 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Attempting rate 11025Hz, bits: 2, channel: 12
05-20 11:42:34.206 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.216 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.216 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.216 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Attempting rate 11025Hz, bits: 3, channel: 16
05-20 11:42:34.216 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Attempting rate 11025Hz, bits: 3, channel: 12
05-20 11:42:34.216 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Attempting rate 22050Hz, bits: 2, channel: 16
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.216 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.216 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.216 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.216 8326-8326/com.my.app D/SoundMeter: Attempting rate 22050Hz, bits: 2, channel: 12
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.226 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.226 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.226 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Attempting rate 22050Hz, bits: 3, channel: 16
05-20 11:42:34.226 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Attempting rate 22050Hz, bits: 3, channel: 12
05-20 11:42:34.226 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Attempting rate 16000Hz, bits: 2, channel: 16
05-20 11:42:34.226 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.226 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.236 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.236 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Attempting rate 16000Hz, bits: 2, channel: 12
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.236 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.236 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.236 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Attempting rate 16000Hz, bits: 3, channel: 16
05-20 11:42:34.236 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Attempting rate 16000Hz, bits: 3, channel: 12
05-20 11:42:34.236 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Attempting rate 8000Hz, bits: 2, channel: 16
05-20 11:42:34.236 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.246 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.246 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.246 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.246 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.246 8326-8326/com.my.app D/SoundMeter: Attempting rate 8000Hz, bits: 2, channel: 12
05-20 11:42:34.246 8326-8326/com.my.app D/SoundMeter: Buffer size OK
05-20 11:42:34.246 8326-8326/com.my.app E/AudioRecord: AudioFlinger could not create record track, status: -12
05-20 11:42:34.256 8326-8326/com.my.app E/AudioRecord-JNI: Error creating AudioRecord instance: initialization check failed.
05-20 11:42:34.256 8326-8326/com.my.app E/android.media.AudioRecord: Error code -20 when initializing native AudioRecord object.
05-20 11:42:34.256 8326-8326/com.my.app D/SoundMeter: Failed: AudioRecord not initialized
05-20 11:42:34.256 8326-8326/com.my.app D/SoundMeter: Attempting rate 8000Hz, bits: 3, channel: 16
05-20 11:42:34.256 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.256 8326-8326/com.my.app D/SoundMeter: Attempting rate 8000Hz, bits: 3, channel: 12
05-20 11:42:34.256 8326-8326/com.my.app E/android.media.AudioRecord: getMinBufferSize(): Invalid audio format.
05-20 11:42:34.256 8326-8326/com.my.app A/SoundMeter: No valid audio record configuration found!

【问题讨论】:

    标签: android android-audiorecord


    【解决方案1】:

    查看这篇文章以供参考,它说AudioRecord.getMinBufferSize不支持PCM_8BIT

    AudioRecord - Invalid audio buffer size

    希望对您有所帮助。

    【讨论】:

    • 谢谢,但不幸的是,这只解决了一半的问题 - 现在我没有收到 Invalid audio format 错误,但其余错误与以前一样......
    • 尝试做干净的项目并重建应用程序,也许它会在它之后工作。要支持此答案,请参阅链接。 stackoverflow.com/questions/4843739/…
    猜你喜欢
    • 2011-05-08
    • 2011-06-18
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    • 2013-02-26
    相关资源
    最近更新 更多