Android Camera2 在处理帧时拍照
Android Camera2 take picture while processing frames
我正在使用 Camera2 API 创建一个可以扫描条形码并能够在扫描过程中拍照的相机组件。它有点工作,但预览闪烁 - 似乎以前的帧和有时绿色帧正在中断实时预览。
我的代码基于 Google 的 Camera2Basic。我只是再添加一个 ImageReader
及其表面作为 CaptureRequest.Builder
的新输出和目标。 reader 之一使用 JPEG,另一个使用 YUV。当我从输出中移除 JPEG reader 的表面(不将其传递到 createCaptureSession
)时,闪烁消失了。
有很多代码,所以我创建了一个要点:click - 试图摆脱完全不相关的代码。
您正在测试的设备是 LEGACY 级别的设备吗?
如果是这样,任何以 JPEG 输出为目标的捕获都可能会慢得多,因为它们可以 运行 预捕获序列,并且还可能短暂地暂停预览。
但它不应该导致绿框,除非存在设备级错误。
如果有人为此苦苦挣扎。 docs 中有 table 表示如果指定了 3 个目标,YUV ImageReader 可以使用最大尺寸等于预览尺寸(最大 1920x1080)的图像。减少这个有帮助!
是的,你可以。假设您将预览配置为将 YUV 帧提供给 ImageReader(因为您也可以将 JPEG 放在那里,检查一下),如下所示:
mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 1);
您可以在 OnImageAvailable 侦听器中处理这些帧:
@Override
public void onImageAvailable(ImageReader reader) {
Image mImage = reader.acquireNextImage();
if (mImage == null) {
return;
}
try {
// Do some custom processing like YUV to RGB conversion, cropping, etc.
mFrameProcessor.setNextFrame(mImage));
mImage.close();
} catch (IllegalStateException e) {
Log.e("TAG", e.getMessage());
}
我正在使用 Camera2 API 创建一个可以扫描条形码并能够在扫描过程中拍照的相机组件。它有点工作,但预览闪烁 - 似乎以前的帧和有时绿色帧正在中断实时预览。
我的代码基于 Google 的 Camera2Basic。我只是再添加一个 ImageReader
及其表面作为 CaptureRequest.Builder
的新输出和目标。 reader 之一使用 JPEG,另一个使用 YUV。当我从输出中移除 JPEG reader 的表面(不将其传递到 createCaptureSession
)时,闪烁消失了。
有很多代码,所以我创建了一个要点:click - 试图摆脱完全不相关的代码。
您正在测试的设备是 LEGACY 级别的设备吗?
如果是这样,任何以 JPEG 输出为目标的捕获都可能会慢得多,因为它们可以 运行 预捕获序列,并且还可能短暂地暂停预览。
但它不应该导致绿框,除非存在设备级错误。
如果有人为此苦苦挣扎。 docs 中有 table 表示如果指定了 3 个目标,YUV ImageReader 可以使用最大尺寸等于预览尺寸(最大 1920x1080)的图像。减少这个有帮助!
是的,你可以。假设您将预览配置为将 YUV 帧提供给 ImageReader(因为您也可以将 JPEG 放在那里,检查一下),如下所示:
mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 1);
您可以在 OnImageAvailable 侦听器中处理这些帧:
@Override
public void onImageAvailable(ImageReader reader) {
Image mImage = reader.acquireNextImage();
if (mImage == null) {
return;
}
try {
// Do some custom processing like YUV to RGB conversion, cropping, etc.
mFrameProcessor.setNextFrame(mImage));
mImage.close();
} catch (IllegalStateException e) {
Log.e("TAG", e.getMessage());
}