<AudioRecord> "Не удалось получить аудиовход для источника записи 1"
У меня возникла эта проблема с инициализацией AudioRecord
для Android. Я искал довольно долгое время в Интернете без успеха.
Для телефона я использую Samsung GalaxyS на SDK версии 7. Для инициализации AudioRecord
я использую 8000 в качестве частоты дискретизации, MONO для конфигурации канала, 16 бит для аудиоформата и в соответствии с log, для параметра minBufferSize установлено значение 4160. Я добавил в манифест разрешение AUDIO_RECORD.
Мой код для инициализации выглядит следующим образом:
...
private static int SAMPLE_RATE = 8000;
private static int CHANNEL_CONFIG = AudioFormat.CHANNEL_CONFIGURATION_MONO;
private static int AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT;
// ??? Both 8Bit and Default are deemed illegal.
public MicVolumeManager() {
this.bufferSize = AudioRecord.getMinBufferSize(SAMPLE_RATE,
CHANNEL_CONFIG, AUDIO_FORMAT);
PhoneDebugger.debug("AUDIO-BUFFER-SIZE",
Integer.toString(this.bufferSize));
this.recorder = new AudioRecord(AudioSource.MIC, SAMPLE_RATE,
CHANNEL_CONFIG, AUDIO_FORMAT, this.bufferSize);
this.audioBuffer = new byte[this.bufferSize];
}
...
Однако объект (this.recorder) не был инициализирован. В журнале используется DDMS:
АУДИО-БУФЕР-РАЗМЕР (3253): 4160
AudioRecord (3253): set(): sampleRate 8000, каналы 16, frameCount 2080
AudioPolicyManager (2175): getInput() inputSource 1, samplingRate 8000, формат 1, каналы 10, акустика 0
AudioFlinger (2175): openInput() openInputStream возвращает вход 0x0, SamplingRate 8000, формат 1, каналы 10, акустика 0, статус -17
AudioRecord (3253): Не удалось получить аудиовход для источника записи 1
AudioRecord-JNI (3253): Ошибка при создании экземпляра AudioRecord: проверка инициализации завершилась неудачно.
AudioRecord-Java (3253): [android.media.AudioRecord] Код ошибки -20 при инициализации собственного объекта AudioRecord.
Любая помощь, пожалуйста? Большое спасибо!
Ответы
Ответ 1
Для меня причиной было неспособность вызвать AudioRecord.release() для предыдущего экземпляра AudioRecord; он связал собственные ресурсы в AudioFlinger и вмешался в последующие экземпляры AudioRecord. Увидел его на Samsung Fascinate (Galaxy S) Android 2.1 (Eclair); либо Eclair, либо реализация Samsung могут быть особенно нетерпимыми.
Ответ 2
Имел ту же ошибку, до тех пор, пока я не перезапустил устройство.
Похоже, что на моей Galaxy S встроенный impl не работает: несколько раз получение и освобождение AudioRecorder
(в течение всего времени работы телефона) вызывает эту ошибку.
Ответ 3
После использования аудиомагнитофона вы должны остановить и отпустить его. Затем, когда вы запустите аудиозапись в следующий раз, это нормально.
Ответ 4
Привет. У меня была такая же проблема при попытке инициализировать объект AudioRecord, и найденное мной решение состояло в том, чтобы проверить параметр конфигурации, прежде чем пытаться создать экземпляр текущего объекта AudioRecord. Вот что я использовал:
/**
* Scan for the best configuration parameter for AudioRecord object on this device.
* Constants value are the audio source, the encoding and the number of channels.
* That means were are actually looking for the fitting sample rate and the minimum
* buffer size. Once both values have been determined, the corresponding program
* variable are initialized (audioSource, sampleRate, channelConfig, audioFormat)
* For each tested sample rate we request the minimum allowed buffer size. Testing the
* return value let us know if the configuration parameter are good to go on this
* device or not.
*
* This should be called in at start of the application in onCreate().
*
* */
public void initRecorderParameters(int[] sampleRates){
for (int i = 0; i < sampleRates.length; ++i){
try {
Log.i(TAG, "Indexing "+sampleRates[i]+"Hz Sample Rate");
int tmpBufferSize = AudioRecord.getMinBufferSize(sampleRates[i],
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT);
// Test the minimum allowed buffer size with this configuration on this device.
if(tmpBufferSize != AudioRecord.ERROR_BAD_VALUE){
// Seems like we have ourself the optimum AudioRecord parameter for this device.
AudioRecord tmpRecoder = new AudioRecord(MediaRecorder.AudioSource.MIC,
sampleRates[i],
AudioFormat.CHANNEL_IN_MONO,
AudioFormat.ENCODING_PCM_16BIT,
tmpBufferSize);
// Test if an AudioRecord instance can be initialized with the given parameters.
if(tmpRecoder.getState() == AudioRecord.STATE_INITIALIZED){
String configResume = "initRecorderParameters(sRates) has found recorder settings supported by the device:"
+ "\nSource = MICROPHONE"
+ "\nsRate = "+sampleRates[i]+"Hz"
+ "\nChannel = MONO"
+ "\nEncoding = 16BIT";
Log.i(TAG, configResume);
//+++Release temporary recorder resources and leave.
tmpRecoder.release();
tmpRecoder = null;
return;
}
}else{
Log.w(TAG, "Incorrect buffer size. Continue sweeping Sampling Rate...");
}
} catch (IllegalArgumentException e) {
Log.e(TAG, "The "+sampleRates[i]+"Hz Sampling Rate is not supported on this device");
}
}
}
Я использую эту помощь.
Dickwan
Ответ 5
Это также влияет на вкладки Sansung Galaxy GT-P1000 и позже 10.1 one
Эта ошибка довольно трудно воспроизвести, и перезагрузка - единственный способ, которым я нашел, чтобы избежать этого плохого состояния...
Есть ли трекеры ошибок на samsung?
Ответ 6
Если вы не приняли разрешение Record_Audio, тогда возьмите его, даже если вы получите ошибку, а затем выключите мобильный телефон, а затем включите его, а затем запустите приложение.
Ответ 7
Я думаю, что аппаратное обеспечение звука не может поддерживать до 10 каналов, которые вы устанавливаете как входные, поэтому попробуйте использовать 2 канала и посмотреть, может ли он работать.