android - 关于 getParameters 失败(空参数)

标签 android camera surfaceview mediarecorder

我正在尝试使用 SurfaceView 的相机捕捉应用程序。

应用程序的概述是

  1. 它可以实时检测人脸(在摄像头 View 上)。

  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。(相机是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 类或嵌入它的 Activity 中创建本地字段,并在您开始预览时将宽度和高度存储在那里。它们不会改变,除非您明确停止相机并更改其配置。

如果我没有遗漏什么,您的 onPreviewFrame() 回调将发生在主 (UI) 线程上。好的做法是在单独的 HandlerThread 上调用 Camera.open(),以防止预览处理减慢 UI。

关于android - 关于 getParameters 失败(空参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42955271/

相关文章:

c# - 无法在 ONVIF 中实现事件订阅

android - SurfaceView 绘图在上面

android - 拍照没有预览 Android

android - 使用脸部滤镜录制视频

android - 当 onCreate() 调用 startService() 时我能期待什么

如果我使用 intent 进入主屏幕,Android 服务将被终止

android - 在 Xamarin.Android 应用程序的情况下使用的 ORMLite 等效包是什么

Android onPictureTaken 回调在 Bitmap.decodeByteArray 中抛出内存异常

iOS 检查摄像头是否被遮挡

android - 检查 View 是否属于线性布局