<AudioRecord> "Не удалось получить аудиовход для источника записи 1" - PullRequest
14 голосов
/ 26 января 2011

У меня возникла эта проблема с инициализацией 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.

Любая помощь, пожалуйста? Большое спасибо!

Ответы [ 7 ]

16 голосов
/ 14 июля 2011

Для меня причиной была неудача вызова AudioRecord.release () для предыдущего экземпляра AudioRecord;он связывал собственные ресурсы в AudioFlinger и мешал последующим экземплярам AudioRecord.Видел это на Samsung Fascinate (Galaxy S) Android 2.1 (Эклер);реализация Eclair или Samsung может быть особенно нетерпимой.

8 голосов
/ 07 июня 2011

Произошла та же ошибка, пока я не перезапустил устройство.

Кажется, что на моем Galaxy S нативный impl глючит: несколько раз получая и выпускаяAudioRecorder (в течение всего времени работы телефона) вызывает эту ошибку.

5 голосов
/ 31 января 2012

После использования аудиомагнитофона, вы должны остановить и отпустить его. Затем, когда вы в следующий раз запустите диктофон, все будет в порядке.

4 голосов
/ 06 марта 2011

Привет У меня возникла та же проблема при попытке инициализировать объект 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

3 голосов
/ 15 апреля 2013

Если вы не воспользовались разрешением Record_Audio, то принимайте его даже после получения ошибки, затем выключите мобильный телефон, затем включите снова и запустите приложение.

3 голосов
/ 30 декабря 2011

Это также влияет на вкладки Sansung Galaxy GT-P1000 и более поздние 10.1 один

Эту ошибку довольно сложно воспроизвести, и перезагрузка - единственный способ избежать этого плохого состояния ...

Есть ли на samsung система отслеживания ошибок?

0 голосов
/ 07 июля 2011

Я думаю, что аудиооборудование не может поддерживать до 10 каналов, которые вы указали в качестве входных, поэтому попробуйте использовать 2 канала и посмотреть, может ли оно работать.

...