安卓摄像头:非常低的预览FPS



一周前,我开始研究Android相机API。我已经成功地启动了相机并开始预览,它运行得很好。然后我发现我没有正确初始化和释放相机,所以我对代码进行了一些彻底的修改,现在我遇到了一个最初没有出现的问题:FPS极低。大约0.5,即每帧2秒。有趣的是,我得到了一个延迟的1帧,然后是紧接着(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。顺便说一句,从现在到那时,光照条件没有改变。

更新:尝试在单独的线程中打开相机,如这里所述-没有变化。

params.setRecordingHint(true);用于启动视频录制开始。

请使用"params.setRecordingHint(false)"再次检查

来自您下面的评论"我已经成功地初始化了相机并开始预览,效果很好。然后我发现我没有正确初始化和释放相机"

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

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

  1. 仅删除"params.setPreviewSize(320240);"
  2. 仅删除"params.setPreviewFormat(ImageFormat.NV21);"
  3. 拆下1和2

请制作自己的previewcallbak函数,然后

privatePreviewCallbackmPreviewCallback=新建PreviewCallback();

setPreviewCallback(mPreviewCallback);

关于PreviewCallback(),您可以参考cts目录中的CameraTestJava:cts/tests/tests/hawdware/src/android/hardware/cts-

最新更新