Android摄像头:非常低的预览FPS

Android摄像头:非常低的预览FPS,android,camera,android-camera,Android,Camera,Android Camera,一周前,我开始研究Android摄像头API。我已经成功初始化了相机并开始预览,效果很好。然后我发现我没有正确初始化和释放相机,所以我对代码进行了一些修改,现在我遇到了一个最初没有出现的问题:极低的FPS。大约0.5,即每帧2秒。非常有趣的是,我得到了一帧延迟,然后是紧接着的第二帧(1-15毫秒),接着是下一帧之前的2秒延迟 这是我的相机初始化代码: m_openedCamera = Camera.open(id); m_surfaceHolder = new SurfaceVi

一周前,我开始研究Android摄像头API。我已经成功初始化了相机并开始预览,效果很好。然后我发现我没有正确初始化和释放相机,所以我对代码进行了一些修改,现在我遇到了一个最初没有出现的问题:极低的FPS。大约0.5,即每帧2秒。非常有趣的是,我得到了一帧延迟,然后是紧接着的第二帧(1-15毫秒),接着是下一帧之前的2秒延迟

这是我的相机初始化代码:

    m_openedCamera = Camera.open(id);
    m_surfaceHolder = new SurfaceView(MyApplication.instance().getApplicationContext()).getHolder();
    Assert.assertNotNull(m_openedCamera);

    // This is required on A500 for some reason
    Camera.Parameters params = m_openedCamera.getParameters();
    params.setPreviewFormat(ImageFormat.NV21);
    params.setPreviewSize(320, 240);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.ICE_CREAM_SANDWICH)
    {
        params.setRecordingHint(true);
        params.setAutoExposureLock(true);
        params.setAutoWhiteBalanceLock(true);
    }

    m_openedCamera.setParameters(params);

    int bitsPerPx  = ImageFormat.getBitsPerPixel(ImageFormat.NV21);
    int width       = params.getPreviewSize().width;
    int height      = params.getPreviewSize().height;
    int size        = (int)(width * height * bitsPerPx / 8.0);
    m_openedCamera.addCallbackBuffer( new byte[size] );
    m_openedCamera.addCallbackBuffer( new byte[size] );
    m_openedCamera.addCallbackBuffer( new byte[size] );
    m_openedCamera.addCallbackBuffer( new byte[size] );

    m_openedCamera.setErrorCallback(this);
    m_openedCamera.setPreviewDisplay(m_surfaceHolder);
    m_openedCameraFacing = facing;
    m_openedCamera.setPreviewCallback(this);
    m_openedCamera.startPreview();
我刚刚添加了回调缓冲区-没有改变任何东西。在一周前的初始代码中,我没有表面视图,但现在删除它也没有效果。 这也发生在我的第二台更新得多的平板电脑上,尽管FPS在那里更高(8-10),而且那里没有双帧,但帧之间的间隔是均匀的。FPS过去至少为20。顺便说一句,光照条件从现在到那时都没有改变

更新:尝试按所述在单独的线程中打开相机-无更改。

参数。setRecordingHint(真);用于启动视频录制启动


请使用“params.setRecordingHint(false)”再次检查它。

请创建您自己的previewcallbak函数,然后

private PreviewCallback mPreviewCallback=新建PreviewCallback()

。。。。 setPreviewCallback(mPreviewCallback)

关于PreviewCallback(),您可以从下面的评论中参考cts目录中的CameraTest.Java:cts/tests/tests/hawdware/src/android/hardware/cts

“我已成功初始化相机并开始预览,它工作正常。然后我发现我没有正确初始化和释放相机”

我猜您最初使用的是camera HAL中定义的默认相机参数。虽然还不清楚“初始化”是什么意思,但我认为它们可能是相机参数设置

因此,我建议您删除params的代码,然后再次测试它。 或者,你可以一个一个地测试它

  • 仅删除“params.setPreviewSize(320240);”
  • 仅删除“params.setPreviewFormat(ImageFormat.NV21);”
  • 拆下1和2

  • 因此,如果消除回调缓冲区,性能会提高吗?类似于?@fadden:不。性能完全相同,有缓冲区或没有缓冲区。这里缺少的一个调用是或。请注意,仅选择支持的FPS。请注意,不带
    setPreviewCallbackWithBuffer()
    addCallbackBuffer()
    与此无关。如果处理涉及工作线程等,则预分配的回调缓冲区可能非常有用。如果垃圾收集是立即进行的(例如,在回调内完成的所有处理),则预分配的回调缓冲区不会有任何帮助。@AlexCohn:错过了该缓冲区。至于FPS范围-这个设备的摄像头只有一个支持的范围,我尝试过显式地设置它,但没有任何区别。
    setRecordingHint
    是Android 4.0,我正在3.1上进行试验。这是一个怎样的答案?显然,我有回电话。使用空主体(更具体地说,回调只测量和记录经过的FPS,而不记录其他内容)。