2017-03-22 7 views
3

SurfaceView를 사용하여 카메라 캡처 응용 프로그램을 테스트 중입니다.getParameters 정보 (빈 매개 변수)

응용 프로그램의 개요

  1. 그것은 (카메라 뷰)에 실시간으로 얼굴을 감지 할 수있다.

  2. 영화를 저장할 수 있습니다.

나는 영화를 저장하기 위해 android.media.MediaRecord 클래스를 사용하고 있습니다.

myRecorder = new MediaRecorder(); 
myRecorder.setVideoSource(MediaRecorder.VideoSource.CAMERA); 
myRecorder.setOutputFile(Environment.getExternalStorageDirectory() + "/Movies/sample.3gp"); 
myRecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP); 
myRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.MPEG_4_SP); 
myRecorder.setVideoFrameRate(30); 
myRecorder.setVideoSize(320, 240); 
myRecorder.prepare(); 
myRecorder.start(); 

가 avobe 단계 후에, RuntimeException을 아래 단계에서 발생한다.

@Override 
public void onPreviewFrame(byte[] data, Camera camera) { 
    //Log.d(TAG, "onPreviewFrame: "); 

    int width = camera.getParameters().getPreviewSize().width; <-- 
    int height = camera.getParameters().getPreviewSize().height; 


03-22 22:54:09.134 27875-27875/? E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: wbcompany.co.jp.facedetector3, PID: 27875 
               java.lang.RuntimeException: getParameters failed (empty parameters) 
                at android.hardware.Camera.native_getParameters(Native Method) 
                at android.hardware.Camera.getParameters(Camera.java:2019) 
                at wbcompany.co.jp.facedetector3.CameraView.onPreviewFrame(CameraView.java:150) 
                at android.hardware.Camera$EventHandler.handleMessage(Camera.java:1192) 
                at android.os.Handler.dispatchMessage(Handler.java:102) 
                at android.os.Looper.loop(Looper.java:154) 
                at android.app.ActivityThread.main(ActivityThread.java:6189) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) 

(카메라 android.hardware.Camera 개체이다) 'myRecorder.start를()를 호출하기 전에,이 예외가 발생하지 않는다 .

이 오류의 해결책을 모릅니다. 제게이 문제의 해결책을주세요.

내 런타임 환경 : 안드로이드 7.0/API 레벨 24

+0

필자는 필자가 안드로이드 API 22 에뮬레이터에서 Stock Camera 앱을 사용하고 있었다. 필자는 64 비트 x86 대신 에뮬레이터에서 32 비트 x86 OS 이미지를 사용하여 문제를 해결했습니다. –

답변

1

이 이상한 오류 메시지이지만, 케이스가 진짜입니다. 카메라가 MediaRecorder에서 사용 중이면 다른 용도로는 사용할 수 없습니다.

일반적으로 카메라 매개 변수에 대한 액세스는 일부 장치에서 매우 비효율적 일 수 있습니다. 모든 미리보기 프레임에 대해 camera.getParameters()으로 전화하지 않는 것이 좋습니다. CameraView 클래스 나 포함하는 활동에 로컬 필드를 만들고 미리보기를 시작할 때 너비와 높이를 저장하십시오. 명시 적으로 카메라를 중지하고 카메라의 구성을 변경하지 않으면 변경되지 않습니다.

내가 누락 된 것이 없다면 onPreviewFrame() 콜백이 기본 (UI) 스레드에서 발생합니다. 좋은 실습은 별도의 HandlerThread에 Camera.open()을 호출하여 미리보기 처리가 UI 속도를 저하시키는 것을 방지하는 것입니다.

+0

늦은 응답을 드려서 죄송합니다. 좋은 정보를 제공해 주셔서 감사합니다. 카메라를 몰랐습니다 .getParametes()는 권장하지 않습니다. –

+0

getParameters()는 완벽하게 훌륭하지만 비용이 많이 들며 재량권없이 사용해야합니다. –