使用 Android Camera2 API 快速捕获 flash/no-flash 图像

Capture flash/no-flash images quickly using Android Camera2 API

我正在编写一个 android 应用程序以在用户按下捕获按钮时快速捕获 flash/no-flash 图像对。为了编写我的应用程序,我参考了 Camera2Basic 应用程序 here

从 Android 文档中,我发现要触发闪光灯,预览请求生成器应该将 AE_MODE 设置为 AE_MODE_ON_ALWAYS_FLASH

我正在使用三个请求生成器:previewnoflashflash 三者的区别是:

我正在使用 Nexus 5 设备,我发现要仅捕获 Flash 图像,必须具有如上所述的预览生成器和 Flash 生成器,并提交静态捕获请求使用以上 flash 生成器。使用此序列,我 always 在 Nexus 5 中获得正确的闪存图像。pre-flash 是 总是自动处理。

回到原题,截取一对flash/no-flash张图片,我的步骤顺序如下:

  1. 在拍照时,我使用 preview 构建器启动 auto-focus 触发器。

  2. 当auto-focus完成后,我使用noflashflash[=124连续提交两个静态捕获请求=] 建设者(首先是 noflash,然后是 flash

然而,第一个图像是flash图像second是一个no-flash图像。我不明白输出中的这种反转。

  1. JPEG 大小写: 第一个图像是总是一个合适的flash图片second图片是总是一个合适的no-flash图片如下图:

Flash 图像对应于使用 noflash 生成器提交的请求:

No-flash 与使用 flash 生成器提交的请求相对应的图像:

  1. YUV_420_888 案例: 与 JPEG 相同,但是,noflash 图像永远不合适。可以看到右侧有一条白条,颜色也不对,而且很吵!

Flash 图像对应于使用 noflash 生成器提交的请求:

不正确的no-flash图像对应于使用flash生成器提交的请求:

Off-course,因为在 YUV_420_888 格式中,两张图像是背靠背拍摄的,我在两者之间添加了一个 preview 请求以防止溢出。

我的问题是:

  1. 为什么输出图片的顺序是反的?

  2. 为什么no-flash格式的YUV_420_888图片不正确?

请帮忙。

确认几件事:

  1. 确保触发器仅针对单个请求设置为启动,而不是连续设置
  2. 如果AE_MODE是AE控制闪光的其中之一,则忽略FLASH_MODE;最好不要碰它,以防万一。
  3. 确保使用 STILL_CAPTURE 请求模板作为最终捕获请求;否则主闪光灯预计不会闪光。
  4. 您应该可以在闪光灯请求之后几乎立即提交第二个不闪光灯 STILL_CAPTURE 请求(为了安全起见,请留下一个缓冲区请求,因为由于滚动快门,主闪光灯可能会部分在闪光捕捉前后一帧可见);只需提交预览请求,然后提交带有 AE_MODE_ON 的 STILL_CAPTURE 请求。
  5. 为了获得最大速度,请不要捕获 JPEG 图片;额外的编码时间会导致图像之间的延迟。使用 YUV_420_888 并自己创建 JPEG。