关于 getParameters 失败(空参数)
About getParameters failed (empty parameters)
我正在尝试使用 SurfaceView 的相机捕捉应用程序。
该应用程序的概述是
它可以实时检测人脸(在相机视图上)。
可以存储电影
我正在使用 android.media.MediaRecord class 来保存电影。
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 级
这是一个奇怪的错误信息,但是这个案例很真实。当摄像头在 MediaRecorder 中忙时,将无法访问其他用途。
一般来说,在某些设备上访问相机参数的效率可能非常低。强烈建议不要为每个预览帧调用 camera.getParameters()
。在您的 CameraView class 或嵌入它的 activity 中创建本地字段,并在您开始预览时将宽度和高度存储在那里。除非您明确停止相机并更改其配置,否则它们不会更改。
如果我没有遗漏什么,你的 onPreviewFrame()
回调发生在主 (UI) 线程上。好的做法是在单独的 HandlerThread 上调用 Camera.open()
,以防止预览处理速度减慢 UI。
我正在尝试使用 SurfaceView 的相机捕捉应用程序。
该应用程序的概述是
它可以实时检测人脸(在相机视图上)。
可以存储电影
我正在使用 android.media.MediaRecord class 来保存电影。
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 级
这是一个奇怪的错误信息,但是这个案例很真实。当摄像头在 MediaRecorder 中忙时,将无法访问其他用途。
一般来说,在某些设备上访问相机参数的效率可能非常低。强烈建议不要为每个预览帧调用 camera.getParameters()
。在您的 CameraView class 或嵌入它的 activity 中创建本地字段,并在您开始预览时将宽度和高度存储在那里。除非您明确停止相机并更改其配置,否则它们不会更改。
如果我没有遗漏什么,你的 onPreviewFrame()
回调发生在主 (UI) 线程上。好的做法是在单独的 HandlerThread 上调用 Camera.open()
,以防止预览处理速度减慢 UI。