web-dev-qa-db-fra.com

MediaRecorder a échoué lorsque j'arrête l'enregistrement

J'ai cette erreur. Quelqu'un peut-il m'aider s'il vous plaît, je pense que c'est quelque chose à propos de l'auditeur tactile ... L'erreur se produit lorsque je relâche mon doigt.

04-25 20:07:00.263: D/FB Sessions(18429): false
04-25 20:07:04.533: I/MediaRecorderJNI(18429): prepare: surface=0x189250 (identity=1813)
04-25 20:07:10.493: E/MediaRecorder(18429): stop failed: -1007
04-25 20:07:10.493: D/AndroidRuntime(18429): Shutting down VM
04-25 20:07:10.493: W/dalvikvm(18429): threadid=1: thread exiting with uncaught exception (group=0x40018608)
04-25 20:07:10.503: E/AndroidRuntime(18429): FATAL EXCEPTION: main
04-25 20:07:10.503: E/AndroidRuntime(18429): Java.lang.RuntimeException: stop failed.
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.media.MediaRecorder.stop(Native Method)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.crewbase.rec.RecordActivity.stopRecording(RecordActivity.Java:151)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.crewbase.rec.RecordActivity.access$2(RecordActivity.Java:150)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.crewbase.rec.RecordActivity$1.onTouch(RecordActivity.Java:79)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.View.dispatchTouchEvent(View.Java:3897)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:942)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:942)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:942)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewGroup.dispatchTouchEvent(ViewGroup.Java:942)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.Android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.Java:1737)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.Android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.Java:1153)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.app.Activity.dispatchTouchEvent(Activity.Java:2096)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.Android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.Java:1721)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewRoot.deliverPointerEvent(ViewRoot.Java:2200)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.view.ViewRoot.handleMessage(ViewRoot.Java:1884)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.os.Handler.dispatchMessage(Handler.Java:99)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.os.Looper.loop(Looper.Java:130)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Android.app.ActivityThread.main(ActivityThread.Java:3835)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Java.lang.reflect.Method.invokeNative(Native Method)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at Java.lang.reflect.Method.invoke(Method.Java:507)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:858)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:616)
04-25 20:07:10.503: E/AndroidRuntime(18429):    at dalvik.system.NativeStart.main(Native Method)

Et cela se produit lorsque j'essaie d'exécuter ce code:

de l'auditeur tactile:

/// Preview is SurfaceView in my view
preview.setOnTouchListener(new View.OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:

                prepareRecording();
                break;
            case MotionEvent.ACTION_MOVE:
            //Log.d(TAG, String.format("ACTION_MOVE | x:%s y:%s", 
                break;
            case MotionEvent.ACTION_UP:
                stopRecording();
                break;
            }
            return true;
        }
    });

Et ces deux méthodes:

private void prepareRecording() {
    try {
        camera.unlock();

        recorder = new MediaRecorder();
        recorder.setCamera(camera);
        recorder.setAudioSource(MediaRecorder.AudioSource.MIC);
        recorder.setVideoSource(MediaRecorder.VideoSource.CAMERA);
        recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);

        File tempFile = new File(Environment.getExternalStorageDirectory(), "/rec/temp/video_" + String.valueOf(videoCount) + ".mp4");

        recorder.setOutputFile(tempFile.getPath());
        recorder.setVideoFrameRate(25);
        recorder.setAudioEncoder(MediaRecorder.AudioEncoder.DEFAULT);
        recorder.setVideoEncoder(MediaRecorder.VideoEncoder.DEFAULT);
        recorder.setPreviewDisplay(holder.getSurface());

        recorder.prepare();
        recorder.start();
    }  catch (IllegalStateException e) {
        Log.e("REDORDING :: ",e.getMessage());
        e.printStackTrace();
    } catch (IOException e) {
        Log.e("REDORDING :: ",e.getMessage());
        e.printStackTrace();
    }
}

private void stopRecording() {
    recorder.stop();
    camera.lock();
}
30
Ivanstame

Regardez le documentation :

Notez qu'une RuntimeException est intentionnellement levée vers l'application, si aucune donnée audio/vidéo valide n'a été reçue lors de l'appel de stop (). Cela se produit si stop () est appelé immédiatement après start (). L'échec permet à l'application d'agir en conséquence pour nettoyer le fichier de sortie (supprimer le fichier de sortie, par exemple), car le fichier de sortie n'est pas correctement construit lorsque cela se produit.

En d'autres termes: Dalvik lève volontairement l'exception. Vous devez le gérer pour nettoyer après votre application. Vous devez le gérer comme ceci:

private void stopRecording() {
    try{
        recorder.stop();
    }catch(RuntimeException stopException){
        //handle cleanup here
    }
    camera.lock();
}
52
DigCamara

J'ai eu une erreur similaire -1007 lors de l'enregistrement audio avec AMR_WB, mais il s'est avéré que le problème était que j'avais oublié de régler la fréquence d'échantillonnage.

mediaRecorder.setAudioSamplingRate(16000);
4
soshial