Android mediaRecorder Stop не удалось — попытка указать максимальное качество записи для устройства

Итак, как следует из названия, я получаю исключение остановки mediaRecorder -1007, однако на самом деле это не так.

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

Мне нужна возможность записывать высококачественный звук на любое устройство Android с микрофоном >=API16.

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

public class RecordingHandler {

    private static MediaRecorder recorder;

    static void beginRecording(String output) throws Exception {

        ditchMediaRecorder();
        File outFile = new File(output);
        if (outFile.exists())
            outFile.delete();
        recorder = new MediaRecorder();
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.AAC_ADTS);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setOutputFile(output);

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

        //this was working before
//      recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
//      recorder.setOutputFormat(MediaRecorder.OutputFormat.AMR_NB);
//      recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);
//      recorder.setOutputFile(output);
//
//      try {
//          recorder.prepare();
//      } catch (IOException e) {
//          Log.e("Recording Handler", "prepare() failed");
//      }
//      recorder.start();
    }

    static void ditchMediaRecorder() {
        // if we have the recorder, release it
        if (recorder != null)
            recorder.release();
    }

    static void stopRecording() {
        if (recorder != null) {
            recorder.stop(); //error happening here
            recorder.reset();
            recorder.release();
            recorder = null;
        }
    }

}

Текущая ошибка:

05-02 21:00:29.443: E/MediaRecorder(28252): stop failed: -1007
05-02 21:00:29.443: E/InputEventReceiver(28252): Exception dispatching input event.
05-02 21:00:29.443: E/MessageQueue-JNI(28252): Exception in MessageQueue callback: handleReceiveCallback
05-02 21:00:29.443: E/MessageQueue-JNI(28252): java.lang.RuntimeException: stop failed.
05-02 21:00:29.443: E/MessageQueue-JNI(28252):  at android.media.MediaRecorder.stop(Native Method)
05-02 21:00:29.443: E/MessageQueue-JNI(28252):  at com.appulse.beatbox.RecordingHandler.stopRecording(RecordingHandler.java:56)

Если ваш ответ содержит слова "THREE_GPP" или "AMR_NB", он просто не будет принят, потому что звук из него - полная чушь.

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


person Derek    schedule 03.05.2014    source источник


Ответы (1)


Ниже приведен фрагмент, который я использую в одном из своих приложений для записи звука высочайшего качества. Обратите внимание, что не все устройства поддерживают частоту дискретизации 44,1 кГц. В настоящее время нет способа проверить, поддерживает ли устройство определенный источник звука, частоту дискретизации или тип файла. Вы должны справиться с этим самостоятельно - начать запись, проверить, не произошла ли запись (если файл не был сохранен в каталоге), и снова начать запись с настройкой, поддерживаемой всеми устройствами (Mic, 3GP, MediaRecorder.AudioEncoder.AMR_NB). Я обновил свой ответ, чтобы справиться с этим:

MediaRecorder recorder;
File audioFile;

Строка storeLoc = Environment.getExternalStorageDirectory() .getAbsolutePath() + "/MyRecordings/";

File path = new File(storeLoc);
    if(!path.exists())
    path.mkdir();  

Начать запись:

  recorder = new MediaRecorder();


            recorder.setAudioSource(MediaRecorder.AudioSource.MIC);                                                   recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

    recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC);
        recorder.setAudioEncodingBitRate(320000);
        recorder.setAudioSamplingRate(44100);               
        try {
                audioFile = File.createTempFile("temporaryFileName", ".mp4", path);
            } catch (IOException e) {
//          throw new RuntimeException(
//                  "Couldn't create recording audio file", e);
            }
            recorder.setOutputFile(audioFile.getAbsolutePath());
                    try {
                recorder.prepare();     
                recorder.start();

            } catch (Exception e) { 
                //couldn't start recording probably because settings not supported on device
                //so delete recording and start again but this time using basic settings
                File unSuccessfulRecFile = new File(audioFile.getAbsolutePath());
                unSuccessfulRecFile.delete();

                recorder = new MediaRecorder();

                recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
                //exception might also be due to filetype being mp4 so change to 3gp
            recorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);                                 
                            recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);

                try {
                audioFile = File.createTempFile("temporaryFileName", ".3gp", path);
                } catch (IOException eI) {}
                recorder.setOutputFile(audioFile.getAbsolutePath());

                    recorder.prepare();     
                    recorder.start();

                        }

Остановить запись:

recorder.stop();
recorder.release();
File from = new File(audioFile.getAbsolutePath());
File to = new File(storeLoc, "FinalFileName");
from.renameTo(to);
person Nana Ghartey    schedule 03.05.2014
comment
Спасибо за ответ, один быстрый вопрос, как вы проверяете, не будет ли работать аудиозапись, чтобы она могла переключиться на настройки по умолчанию 3gp и т. Д.? - person Derek; 03.05.2014
comment
Я не уверен, что MediaRecorder будет выполнять запись в выходной файл после вызова stop() и release(). - person Frank Schwieterman; 15.09.2014