【发布时间】:2016-05-20 09:55:27
【问题描述】:
我正在尝试实例化 AudioRecord 以实时监控音频,但即使我尝试了多种不同的配置,它也会失败。
我已尝试多次重启手机,我已经
<uses-permission android:name="android.permission.RECORD_AUDIO" />
在我的清单中(在<manifest> 标记中,而不是在<application> 标记中)。
我为这个问题找到的解决方案是确保权限正确并且在正确的位置(检查),确保在所有 @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