【发布时间】:2014-10-14 09:24:10
【问题描述】:
一周前,我开始研究 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。顺便说一句,光照条件从现在到现在都没有改变。
更新:尝试按照here 所述在单独的线程中打开相机 - 没有变化。
【问题讨论】:
-
如果消除回调缓冲区,性能会提高吗?类似于stackoverflow.com/questions/7790566/… ?
-
@fadden:不。无论有没有缓冲区,性能都完全相同。
-
这里缺少的一个电话是
Camera.Parameters.setPreviewFrameRate()或setPreviewFpsRange()。请注意仅选择支持的 FPS。 -
请注意,没有
setPreviewCallbackWithBuffer()的addCallbackBuffer()是无关紧要的。如果您的处理涉及工作线程等,预分配的回调缓冲区可能会非常有用。如果垃圾收集是即时的(例如,所有处理都在回调内完成),这将无济于事。 -
@AlexCohn:错过了那个。至于 FPS 范围 - 此设备的相机仅支持一个范围,我已尝试明确设置它,但没有任何区别。
标签: android camera android-camera