Android camera2 加速
Android camera2 speed-up
我需要加快 camera2 的拍摄速度 API。我试图从 google 个示例构建 "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-300 毫秒
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
并得到结果
onImageAvailable(ImageReader reader)
这个时间可以缩短吗?我尝试为抓包请求设置不同的参数,如TEMPLATE_ZERO_SHUTTER_LAG、NOISE_REDUCTION_MODE_OFF、EDGE_MODE_OFF等,但没有任何效果。
如果我尝试捕捉连拍,那么除了第一张图像之外的所有图像都非常快,不会超过 30-40 毫秒。如何减少第一张图片的拍摄时间?
回复您的评论,但使其成为正确答案:
如果您检查幻灯片 #22 上 Samsung dev. conference 中的那些幻灯片,它会显示 camera2 模型。如您所见,有几个队列:
- 待处理请求队列
- 在飞行捕获队列中
- 将图像队列输出到显示相机预览的 Surface
- 以及对
onCaptureComplete
的回调
这解释了为什么第一次拍摄很慢,但在连拍模式下,下一张图像来得非常快。请求和处理已排队,第一个需要 300 毫秒才能到达回调,但下一个已经 "right behind it"。
如果您对新的 API 感兴趣(谁不感兴趣,camera2 太棒了),您还可以查看 full video from the Samsung Dev. conference on YouTube. And the official docs。有很多关于这些的好信息。
我需要加快 camera2 的拍摄速度 API。我试图从 google 个示例构建 "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-300 毫秒
mCaptureSession.capture(captureBuilder.build(), CaptureCallback, null);
并得到结果
onImageAvailable(ImageReader reader)
这个时间可以缩短吗?我尝试为抓包请求设置不同的参数,如TEMPLATE_ZERO_SHUTTER_LAG、NOISE_REDUCTION_MODE_OFF、EDGE_MODE_OFF等,但没有任何效果。 如果我尝试捕捉连拍,那么除了第一张图像之外的所有图像都非常快,不会超过 30-40 毫秒。如何减少第一张图片的拍摄时间?
回复您的评论,但使其成为正确答案:
如果您检查幻灯片 #22 上 Samsung dev. conference 中的那些幻灯片,它会显示 camera2 模型。如您所见,有几个队列:
- 待处理请求队列
- 在飞行捕获队列中
- 将图像队列输出到显示相机预览的 Surface
- 以及对
onCaptureComplete
的回调
这解释了为什么第一次拍摄很慢,但在连拍模式下,下一张图像来得非常快。请求和处理已排队,第一个需要 300 毫秒才能到达回调,但下一个已经 "right behind it"。
如果您对新的 API 感兴趣(谁不感兴趣,camera2 太棒了),您还可以查看 full video from the Samsung Dev. conference on YouTube. And the official docs。有很多关于这些的好信息。