关于getParameters失败(空参数)

时间:2017-03-22 14:56:32

标签: android camera surfaceview mediarecorder

我正在尝试使用SurfaceView进行相机捕捉应用。

应用程序的概述是

  1. 它可以实时检测Face(在摄像机视图上)。

  2. 它可以存储电影。

  3. 我正在使用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发生在下面的步骤中。(相机是android.hardware.Camera对象)

    @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)
    

    在调用'myRecorder.start()'之前,不会发生此异常。

    我不知道这个错误的解决方案。 请给我解决这个问题的方法。

    我的运行时环境:  Android 7.0 / API等级24

1 个答案:

答案 0 :(得分:1)

这是一个奇怪的错误信息,但情况非常真实。当相机在MediaRecorder中忙碌时,它将无法用于其他用途。

一般来说,在某些设备上访问摄像头参数可能效率很低。强烈建议不要为每个预览帧调用camera.getParameters()。在CameraView类或嵌入它的活动中创建本地字段,并在开始预览时存储宽度和高度。除非您明确停止相机并更改其配置,否则它们不会更改。

如果我没有遗漏某些内容,则您的onPreviewFrame()回调会在主(UI)主题上发生。最佳做法是在单独的HandlerThread上调用Camera.open(),以防止预览处理从减慢UI开始。