2015-01-12 4 views
14

나는 camera2 API를 사용해 왔습니다. 작동 방법에 대해 알아 보려면Android 카메라 2 Api

https://developer.android.com/samples/Camera2Video/index.html의 코드를 다운로드했습니다. 녹음을 멈출 때까지 잘 작동합니다. 녹음을 중지하면 다음 코드가 실행됩니다.

private void stopRecordingVideo() { 
     // UI 
     mIsRecordingVideo = false; 
     mBtn_Video.setText(R.string.record); 
     // Stop recording 
     try { 
      mMediaRecorder.stop(); 
      mMediaRecorder.reset(); 
     } 
     catch (Exception e) { 
      e.printStackTrace(); 
     } 
     Activity activity = getActivity(); 
     if (null != activity) { 
      System.out.println("file " + getVideoFile(activity)); 
      Toast.makeText(activity, "Video saved: " + getVideoFile(activity), 
        Toast.LENGTH_SHORT).show(); 
     } 
     startPreview(); 

at mMediaRecorder.stop(); 다음과 같은 오류가 발생합니다

01-12 16:24:23.115 2161-2200/com.cameratwoapi E/Surface﹕ queueBuffer: error queuing buffer to SurfaceTexture, -19 
01-12 16:24:23.135 2161-2200/com.cameratwoapi E/EGL_emulation﹕ tid 2200: swapBuffers(285): error 0x3003 (EGL_BAD_ALLOC) 
01-12 16:24:23.197 2161-2200/com.cameratwoapi E/CameraDeviceGLThread-0﹕ Received exception on GL render thread: 
    java.lang.IllegalStateException: swapBuffers: EGL error: 0x3003 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.checkEglError(SurfaceTextureRenderer.java:487) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.swapBuffers(SurfaceTextureRenderer.java:480) 
      at android.hardware.camera2.legacy.SurfaceTextureRenderer.drawIntoSurfaces(SurfaceTextureRenderer.java:681) 
      at android.hardware.camera2.legacy.GLThreadManager$1.handleMessage(GLThreadManager.java:103) 
      at android.os.Handler.dispatchMessage(Handler.java:98) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.os.HandlerThread.run(HandlerThread.java:61) 

어떤 생각을 잘못하고 있습니다. 나는 몇 시간을 보냈지만 어떤 해결책도 찾을 수 없었다.

수정 - Geneymotion 에뮬레이터를 사용하고 있습니다. 내가 IllegalStateExceptionmMediaRecorder.stop()을 호출 한 후

파일 /storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4에게

감사

+0

EGL 오류 0x3003은 "잘못된 할당"입니다. 뭔가 잘못된 것이 메모리에서 발생하고 있습니다 ... – shkschneider

+0

디버깅을 시도하고 위의 문제를 일으키는 특정 호출을 확인한 적이 있습니까? 또한 비디오를 저장할 가능성이 있기 때문에 응용 프로그램 매니페스트 파일에'WRITE_EXTERNAL_STORAGE' 권한을 추가했는지 확인하십시오. – Willis

+0

감사합니다. @Willis 매니페스트 파일에 쓰기 권한을 부여했습니다.이 경로를 사용하여 /storage/emulated/0/Android/data/com.gold.cameratwoapi/files/video.mp4 파일을 저장하고 있습니다. 이 문제는 mMediaRecorder.stop()에서 발생합니다. – user1154390

답변

3

을 사용하고 경로는 항상 발생합니다. INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY이있는 기기에서 CameraDevice이 오류로 상태가 변경되면 즉시 CameraDevice.StateCallbackonError()을 호출하는 것으로 나타났습니다.

@Override 
public void onError(CameraDevice cameraDevice, int error) { 
    // mCameraOpenCloseLock.release(); 
    // cameraDevice.close(); 
    // mCameraDevice = null; 
    // Activity activity = getActivity(); 
    // if (null != activity) { 
    // activity.finish(); 
    // } 

    closeCamera(); 
    openCamera(mTextureView.getWidth(), mTextureView.getHeight()); 
} 

는 또한 넣어하는 것이 좋습니다 것 : 당신이 참조 된 샘플에서

onError() 그래서 그냥 다음과 같이 다시 엽니 카메라를 onError()을 변경, 카메라를 닫고 작업을 완료 일부는 오류가 실제로 발생했을 경우 주석 처리 된 코드가 카메라를 반복해서 열어 보는 루프를 입력하는 대신 호출된다는 것을 확인하기 위해 거기에 체크인합니다.

private void stopRecordingVideo() { 
// UI 
mIsRecordingVideo = false; 
mButtonVideo.setText(R.string.record); 
// Added by Ben Ning, to resolve exception issue when stop recording. 
try { 
    mPreviewSession.stopRepeating(); 
    mPreviewSession.abortCaptures(); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 

// Stop recording 
mMediaRecorder.stop(); 
mMediaRecorder.reset(); 

}

키는 다음과 같습니다 : 5.0.2

21

내 솔루션은 다음과 같은 무효 stopRecordingVideo()를 변경하는 것입니다 안드로이드와 모토 G 2 세대에서 테스트

,

try { 
    mPreviewSession.stopRepeating(); 
    mPreviewSession.abortCaptures(); 
} catch (CameraAccessException e) { 
    e.printStackTrace(); 
} 
+0

광산 프로젝트에서 작동하지만 레코더를 닫기 전에 두 번 미리보기를 중지해야하는 이유에 대해 자세히 설명 할 수 있습니까? – fxp

0

CameraCaptureSession 및 MediaRecorder로 수행하는 작업에 따라 다르지만 당신이 mMediaRecorder.stop()를 호출 할 때 나는 그것이 문서는 녹음이 중지되면 그것은 단지 구축 된 것처럼

, 당신은 다시 구성해야합니다 말한다 때문에 오류를 발생시키는 카메라 미리보기 세션에 사용되는 표면을 파괴 생각

따라서 당신은 당신이 문제없이 MediaRecorder를 중지 할 수 레코더 표면에 출력을 보내는 카메라를 중지 (mPreviewSession.stopRepeating(); 내가 수집 것과 필요하지 않습니다) PreviewSession.abortCaptures()를 호출하는 경우.당신이 나를 위해 작동하고 CameraCaptureSession.StateCallback

1
 private void stopRecordingVideo() { 
// UI 
     mIsRecordingVideo = false; 
     mButtonVideo.setText(R.string.record); 
// Added by Ben Ning, to resolve exception issue when stop recording. 
     try { 
      mPreviewSession.stopRepeating(); 
      mPreviewSession.abortCaptures(); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 

// Stop recording 
     mMediaRecorder.stop(); 
     mMediaRecorder.reset(); 

     Activity activity = getActivity(); 
     if (null != activity) { 
      Toast.makeText(activity, "Video saved: " + getVideoFile(activity), 
        Toast.LENGTH_SHORT).show(); 
     } 
     startPreview(); 
    } 

onClosed() 또는 onReady() 방법 MediaRecorder.stop()를 호출 할 필요가 찾을 수 있도록

PreviewSession.abortCaptures();

즉시 카메라 미리보기 출력을 중지하지 않습니다.

0

제 경우에는 TimerTaskHandler을 사용합니다. mMediaRecorder.stop()에 직접 오류가 있습니다. 그래서이 방법을 사용합니다

final Handler mTimerHandler = new Handler(Looper.getMainLooper()); 

     mIsRecordingVideo = false; 
     // Stop recording 
     try { 
      mPreviewSession.stopRepeating(); 
      mPreviewSession.abortCaptures(); 
     } catch (CameraAccessException e) { 
      e.printStackTrace(); 
     } 
     try{ 
      Timer timer = new Timer(); 
      TimerTask timerTask = new TimerTask() { 
       @Override 
       public void run() { 
        mTimerHandler.post(new Runnable() { 
         @Override 
         public void run() { 

          mMediaRecorder.stop(); 
          mMediaRecorder.reset(); 
         } 

        }); 
       } 
      }; 
      timer.schedule(timerTask,30); 
     }catch(RuntimeException e){ 
      Log.e("----------------","---->>>>>>>>>"+e); 
      e.printStackTrace(); 
     }