我需要加快 camera2 API 的捕获速度。我试图从谷歌样本构建“android-Camera2Basic”项目。对于示例中的默认捕获请求:
if (null == activity || null == mCameraDevice) {
return;
}
// This is the CaptureRequest.Builder that we use to take a picture.
final CaptureRequest.Builder captureBuilder =
mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
// Use the same AE and AF modes as the preview.
captureBuilder.set(CaptureRequest.CONTROL_AF_MODE,
CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
captureBuilder.set(CaptureRequest.CONTROL_AE_MODE,
CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH);
// Orientation
int rotation = activity.getWindowManager().getDefaultDisplay().getRotation();
captureBuilder.set(CaptureRequest.JPEG_ORIENTATION, ORIENTATIONS.get(rotation));
CameraCaptureSession.CaptureCallback CaptureCallback
= new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
TotalCaptureResult result) {
showToast("Saved: " + mFile);
unlockFocus();
}
};
mCaptureSession.stopRepeating();
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
发送请求需要200-300ms
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
得到结果
onImageAvailable(ImageReader reader)
是否可以缩短这个时间?我尝试为捕获请求设置不同的参数,例如TEMPLATE_ZERO_SHUTTER_LAG、NOISE_REDUCTION_MODE_OFF、EDGE_MODE_OFF等,但没有任何效果。 如果我尝试捕捉连拍,那么除了第一张图像之外的所有图像都非常快,不会超过 30-40 毫秒。如何减少第一张图像的拍摄时间?
最佳答案
回复您的评论,但使其成为正确的答案:
如果您查看 Samsung dev. conference 中的那些幻灯片在幻灯片 #22 上,它显示了 camera2 模型。如您所见,有几个队列:
- 待处理请求队列
- 在飞行捕获队列中
- 将图像队列输出到显示相机预览的 Surface
- 以及对
onCaptureComplete
的回调
这解释了为什么第一次拍摄很慢,但在连拍模式下,下一张图像来得非常快。请求和处理已排队,第一个需要 300 毫秒才能一直返回回调,但下一个已经“紧随其后”。
如果您对新的 API 感兴趣(谁不感兴趣,camera2 太棒了),您还可以查看 full video from the Samsung Dev. conference on YouTube .和 the official docs .有很多关于这些的有用信息。
关于Android camera2加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566898/