Запись в Android дает исключения - PullRequest
0 голосов
/ 16 декабря 2010

Когда я пытаюсь записать звук через эмулятор, используя следующий код

  AudioRecord recordInstance = new AudioRecord(
    MediaRecorder.AudioSource.MIC, this.getFrequency(), this
      .getChannelConfiguration(), this.getAudioEncoding(),
    bufferSize);

Тогда я получаю следующие исключения в logcat:

12-16 19:07:31.680: INFO/jdwp(223): Ignoring second debugger -- accepting and dropping
12-16 19:07:31.700: ERROR/AudioHardware(34): Error opening input channel
12-16 19:07:31.720: WARN/AudioHardwareInterface(34): getInputBufferSize bad sampling rate: 11025
12-16 19:07:31.730: ERROR/AudioRecord(294): Recording parameters are not supported: sampleRate 11025, channelCount 1, format 1
12-16 19:07:31.730: ERROR/AudioRecord-JNI(294): Error creating AudioRecord instance: initialization check failed.

12-16 19:07:31.730: ERROR/AudioRecord-Java(294): [ android.media.AudioRecord ] Error code -20 when initializing native AudioRecord object.
12-16 19:07:31.730: WARN/dalvikvm(294): threadid=7: thread exiting with uncaught exception (group=0x4001d800)
12-16 19:07:31.770: ERROR/AndroidRuntime(294): FATAL EXCEPTION: Thread-8
12-16 19:07:31.770: ERROR/AndroidRuntime(294): java.lang.IllegalStateException: startRecording() called on an uninitialized AudioRecord.
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at android.media.AudioRecord.startRecording(AudioRecord.java:495)
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at com.prospeak.Recorder.run(Recorder.java:84)
12-16 19:07:31.770: ERROR/AndroidRuntime(294):     at java.lang.Thread.run(Thread.java:1096)

Можете ли вы понять, что не так?в этом коде?

Ответы [ 7 ]

3 голосов
/ 16 декабря 2010

Ваша частота дискретизации неверна, попробуйте 8000 Гц.Это ограничение эмулятора.

2 голосов
/ 07 января 2014

Кроме того, убедитесь, что у вас установлено это разрешение в вашем AndroidManifest.xml: <uses-permission android:name="android.permission.RECORD_AUDIO" />

1 голос
/ 16 декабря 2010

Если вы не зарегистрировали разрешение на запись звука в манифесте, вы получите сообщение об ошибке.

0 голосов
/ 10 октября 2013

Недавно я боролся с подобной проблемой.Как было сказано ранее, вы должны циклически просматривать все возможные комбинации частот дискретизации, конфигурации каналов, аудиоформатов, чтобы узнать, что подходит для данного телефона.Эмулятор AFAIK не поддерживает аудиовход и всегда выдаст ошибку инициализации объектов AudioRecord.Таким образом, вы должны проверить свой код на реальном устройстве.Но кроме того, я обнаружил, что существует максимальный размер буфера, который вы можете задать для объекта AudioRecord.Это должно быть где-то в нескольких КБ.Я попытался установить его на уровне около 10 МБ, и он продолжал выдавать ту же ошибку инициализации.Так что будьте осторожны.Вот код для циклического переключения между форматами и частотой дискретизации (любезно предоставлено где-то на StackEx):

 private static int[] mSampleRates = new int[] { 8000, 11025, 22050, 44100 };
private static short [] aformats = new short[] { AudioFormat.ENCODING_PCM_8BIT, AudioFormat.ENCODING_PCM_16BIT };
private static short [] chConfigs = new short[] { AudioFormat.CHANNEL_IN_MONO, AudioFormat.CHANNEL_IN_STEREO };


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

                    if (bufferSize != AudioRecord.ERROR_BAD_VALUE) {
                        // check if we can instantiate and have a success
                        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){
                            Chosen_SR = rate;
                            audFormat = audioFormat;
                            chanConfig = channelConfig;
                            return recorder;
                        }

                    }
                } catch (Exception e) {
                    Log.e("Log:", rate + "Exception, keep trying.",e);
                }
            }
        }
    }
    return null;
}
AudioRecorder mRecord = findAudioRecord();

Надеюсь, это поможет.

0 голосов
/ 24 августа 2011

парни работают только с аудиозаписью,

    AudioRecord recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            8000, AudioFormat.CHANNEL_CONFIGURATION_MONO,
            AudioFormat.ENCODING_PCM_16BIT, 500000);
    recorder.startRecording();

Я искал его долгое время и в последний раз обнаружил, что, но он только производит шум, попробуйте получить хорошее качество звука

0 голосов
/ 11 августа 2011

Убедитесь, что вы проверили пример кода audiorecord.getState() == initialized.

в этом сообщении:

https://stackoverflow.com/questions/tagged/sample-rate+android

0 голосов
/ 20 декабря 2010

Ошибка:

getInputBufferSize bad sampling rate: 11025

Вам нужна другая частота дискретизации.Вы можете циклически просматривать потенциальную частоту дискретизации, пока у вас не возникнет исключение.

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

...