无法初始化有效的AudioRecord

时间:2016-05-20 09:55:27

标签: android android-audiorecord

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

我多次尝试重启手机,我有

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

在我的清单中(在<manifest>标记中,而不在<application>标记中)。

我发现此问题的解决方案是确保权限正确且位于正确位置(检查),以确保在所有问题上调用release() AudioRecord个实例(检查),重新启动手机(检查)并使用查找采样率,音频格式和频道配置的有效组合的方法(检查)。

顺便说一下,我在运行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!

1 个答案:

答案 0 :(得分:0)

查看此帖子以供参考,它说AudioRecord.getMinBufferSize不支持PCM_8BIT

AudioRecord - Invalid audio buffer size

希望这可以帮助你。