android: запись звука с помощью MediaPlayer на эмуляторе

Я пытаюсь записать звук с микрофона на эмуляторе Android с помощью этого кода:

recorder = new MediaRecorder();
recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);
recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
recorder.setOutputFile(Environment.getExternalStorageDirectory() + "/test/test.3gp");
try {
    recorder.prepare();
}
catch (IOException io) {
    Log.v(LOG_TAG, "Could not prepare the audio " + io.getMessage());
}
recorder.start();

Для остановки звука это код:

recorder.stop();
recorder.reset();
recorder.release();

Процесс записи работает нормально, но в результате получается искаженный звук. Когда я записываю звук продолжительностью 60 секунд и проигрываю его, его продолжительность отображается как 120 секунд. Измерение неточное, но это просто для того, чтобы дать вам представление.

На моем эмуляторе работает только кодировщик AMR_NB. Я пробовал разные форматы вывода, но результат всегда был одинаковым.

Это ограничение эмулятора или я тут что-то не так делаю?

Изменить 1: Я тоже пробовал класс AudioRecord, и результат был таким же перетаскиванием звука.

Спасибо.


person Srisa    schedule 03.01.2012    source источник


Ответы (1)


Я работал над тем же и нашел решение. Попробуйте использовать следующий код:

    private void startRecording()
    {

        this.recorder = new MediaRecorder();
        this.recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        this.recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
        this.recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
        MediaRecorder.getAudioSourceMax();
        this.recorder.setOutputFile(this.getFilename());
        this.recorder.setOnErrorListener(this.errorListener);
        this.recorder.setOnInfoListener(this.infoListener);

        try
        {
            this.recorder.prepare();
            this.recorder.start();
        } catch (final IllegalStateException e)
        {
            e.printStackTrace();
        } catch (final IOException e)
        {
            e.printStackTrace();
        }
    }

Это работает безупречно. Надеюсь, это поможет вам :)

person Shraddha    schedule 22.04.2012
comment
Спасибо за публикацию; но мне не повезло. Я добавил MediaRecorder.getAudioSourceMax (); линия, но звук все равно тащит. К вашему сведению, я пробую это с Android 4.0.3, уровень API 15, ARM-эмулятор на Mac. - person Srisa; 23.04.2012