Android подготовить videoRecorder останавливает предварительный просмотр

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

public void prepareVideoRecorder() {
    mCamera.stopPreview();
    mCamera.prepareRecorder(video_orientation, camera_surface);
    // mCamera.startPreview();

}

и мой метод подготовки

public void prepareRecorder(int video_degrees, CameraSurfaceView sf) {
    CamcorderProfile camcorderProfile = CamcorderProfile.get(CamcorderProfile.QUALITY_HIGH);

    recorder = new MediaRecorder();
    mCamera.unlock();
    recorder.setCamera(mCamera);
    recorder.setPreviewDisplay(sf.getHolder().getSurface());

    Log.v("this", "orientation hint = " + video_degrees);
    recorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT);
    recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
    recorder.setOrientationHint(video_degrees);

    File imageFileFolder = new File(Environment.getExternalStorageDirectory(), "DCIM");
    String filename = imageFileFolder.toString() + "/" + new SimpleDateFormat("ddMMyyyyHHmmss").format(new Date()) + ".mp4";
    recorder.setOutputFile(filename);

    recorder.setProfile(camcorderProfile);
    try {
        recorder.prepare();
    } catch (Exception e) {
        e.printStackTrace();
    }

}

когда я нажимаю кнопку «переключатель», предварительный просмотр останавливается. Но если я нажимаю кнопку начала записи, все работает хорошо, я могу записать видео, а также снова начинается предварительный просмотр. Если я попытаюсь раскомментировать mCamera.startPreview() из prepareVideoRecorder, я получу эту ошибку

    02-24 13:44:49.146: E/InputEventReceiver(18078): Exception dispatching input event.
02-24 13:44:49.146: E/MessageQueue-JNI(18078): Exception in MessageQueue callback: handleReceiveCallback
02-24 13:44:49.146: E/MessageQueue-JNI(18078): java.lang.RuntimeException: startPreview failed
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.hardware.Camera.startPreview(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.DtazCamera.startPreview(DtazCamera.java:136)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.DtazPreview.prepareVideoRecorder(DtazPreview.java:343)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.CameraActivity.swipeGesture(CameraActivity.java:600)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at org.dtaz.yoda.CameraSurfaceView.onTouchEvent(CameraSurfaceView.java:87)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.View.dispatchTouchEvent(View.java:7706)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2333)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2281)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.View.dispatchPointerEvent(View.java:7886)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.MessageQueue.nativePollOnce(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.MessageQueue.next(MessageQueue.java:138)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.os.Looper.loop(Looper.java:123)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at android.app.ActivityThread.main(ActivityThread.java:5034)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at java.lang.reflect.Method.invokeNative(Native Method)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at java.lang.reflect.Method.invoke(Method.java:515)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
02-24 13:44:49.146: E/MessageQueue-JNI(18078):  at dalvik.system.NativeStart.main(Native Method)
02-24 13:44:49.156: D/AndroidRuntime(18078): Shutting down VM
02-24 13:44:49.156: W/dalvikvm(18078): threadid=1: thread exiting with uncaught exception (group=0x41841c08)
02-24 13:44:49.166: E/AndroidRuntime(18078): FATAL EXCEPTION: main
02-24 13:44:49.166: E/AndroidRuntime(18078): Process: org.dtaz.yoda, PID: 18078
02-24 13:44:49.166: E/AndroidRuntime(18078): java.lang.RuntimeException: startPreview failed
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.hardware.Camera.startPreview(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.DtazCamera.startPreview(DtazCamera.java:136)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.DtazPreview.prepareVideoRecorder(DtazPreview.java:343)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.CameraActivity.swipeGesture(CameraActivity.java:600)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at org.dtaz.yoda.CameraSurfaceView.onTouchEvent(CameraSurfaceView.java:87)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.View.dispatchTouchEvent(View.java:7706)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTransformedTouchEvent(ViewGroup.java:2216)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewGroup.dispatchTouchEvent(ViewGroup.java:1959)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchTouchEvent(PhoneWindow.java:2333)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow.superDispatchTouchEvent(PhoneWindow.java:1568)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.app.Activity.dispatchTouchEvent(Activity.java:2468)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchTouchEvent(PhoneWindow.java:2281)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.View.dispatchPointerEvent(View.java:7886)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$ViewPostImeInputStage.processPointerEvent(ViewRootImpl.java:3947)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3518)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3575)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3442)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3411)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3419)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3392)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.deliverInputEvent(ViewRootImpl.java:5532)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.doProcessInputEvents(ViewRootImpl.java:5512)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl.enqueueInputEvent(ViewRootImpl.java:5483)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.ViewRootImpl$WindowInputEventReceiver.onInputEvent(ViewRootImpl.java:5612)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.view.InputEventReceiver.dispatchInputEvent(InputEventReceiver.java:185)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.MessageQueue.nativePollOnce(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.MessageQueue.next(MessageQueue.java:138)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.os.Looper.loop(Looper.java:123)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at android.app.ActivityThread.main(ActivityThread.java:5034)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at java.lang.reflect.Method.invokeNative(Native Method)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at java.lang.reflect.Method.invoke(Method.java:515)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:611)
02-24 13:44:49.166: E/AndroidRuntime(18078):    at dalvik.system.NativeStart.main(Native Method)

кто-нибудь знает, что происходит?


person Alex Fragotsis    schedule 24.02.2016    source источник
comment
Вы можете предоставить полную трассировку стека?   -  person Opiatefuchs    schedule 24.02.2016
comment
@Opiatefuchs Я все это добавил!   -  person Alex Fragotsis    schedule 24.02.2016
comment
хорошо, что находится в строке 136 и 343 в вашем классе DtazCamera?   -  person Opiatefuchs    schedule 24.02.2016
comment
136 -> mCamera.startPreview(); фактический вызов начального предварительного просмотра объекта камеры не является моей реализацией. 343 в Preview также является вызовом моего объекта customcamera. Я создал настраиваемый контроллер камеры с настраиваемым видом и настраиваемым обратным вызовом, поэтому так много вызовов.   -  person Alex Fragotsis    schedule 24.02.2016
comment
извините, я имею в виду строку 343 в вашем классе DtazPreview...   -  person Opiatefuchs    schedule 24.02.2016
comment
и не могли бы вы опубликовать также часть кода, где вы запускаете предварительный просмотр? тут не видно....   -  person Opiatefuchs    schedule 24.02.2016
comment
mCamera.startPreview() вызывает startPreview моего контроллера камеры. Это просто метод camera.startPreview(), ничего больше   -  person Alex Fragotsis    schedule 24.02.2016
comment
хорошо, одна из возможных проблем может заключаться в том, что вы использовали камеру раньше для записи чего-либо. Попробуйте что-нибудь: вместо использования camera.unlock() в вашем методе prepareVideoRecorder() вызовите camera.reconnect(). ...   -  person Opiatefuchs    schedule 24.02.2016
comment
Итак, если я добавлю camera.reconect() в конце моего метода подготовки, предварительный просмотр работает, но когда я нажимаю «Пуск», я получаю E/MediaRecorder﹕ start failed: -19 ..... :/   -  person Alex Fragotsis    schedule 24.02.2016
comment
чертов круг...:) ...я думаю, тебе стоит опубликовать ту часть, с которой ты это начинаешь.....   -  person Opiatefuchs    schedule 24.02.2016


Ответы (1)


Итак, я придумал решение, я не знаю, правильное ли оно, но оно работает.

Дело в том, что для записи видео экземпляр камеры должен быть получен MediaRecorder, и одновременно, если вы хотите показать предварительный просмотр, экземпляр камеры должен находиться в SurfaceView. Вот почему, если вы начнете запись, вы увидите, что изображение было захвачено.

поэтому единственный способ преодолеть это - поместить подготовку в метод onclick непосредственно перед mediarecorder.start(), как это.

take_picture.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (isVideo) {
                if (!isRecording) {
                    camera_preview.prepareVideoRecorder();
                    camera_preview.startRecording();
                    take_picture.setText("stop");
                    isRecording = true;
                } else {
                    camera_preview.stopRecording();
                    take_picture.setText("start");
                    isRecording = false;
                }
            } 
        }
    }); 

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

person Alex Fragotsis    schedule 24.02.2016