2016-02-24 12 views
0

所以我有一個相機應用程序,我也想錄制視頻。 當我按下按鈕,切換從攝像頭的視頻我這樣做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(); 
    } 

} 

當我按下「開關」按鈕預覽停止。但是,如果我按下開始錄製按鈕,一切正常,我可以錄製視頻,並且預覽也會重新開始。 如果我嘗試以取消從prepareVideoRecorder的mCamera.startPreview()我得到這個錯誤

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) 

任何人都知道是怎麼回事?

+0

可以提供完整的堆棧跟蹤嗎? – Opiatefuchs

+0

@Opiatefuchs我加了全部! –

+0

好的,你的DtazCamera類的136和343行是什麼? – Opiatefuchs

回答

0

好吧,所以我想出了一個解決方案,我不知道它是否是正確的,但它的工作原理。

這種情況是,爲了記錄視頻,攝像機實例需要被MediaRecorder獲取,同時如果你想顯示預覽,攝像機實例需要在surfaceview中。這就是爲什麼如果你開始錄製,你可以看到圖像被捕獲。

所以解決這個問題的唯一方法就是在mediarecorder.start()這樣的onclick方法之前進行準備。

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; 
       } 
      } 
     } 
    }); 

如果你把這樣的代碼,一切正常。如果有人有更好的解決方案,請發佈它,以便我們可以使用它!