我正在使用Android Camera2 API捕获和处理图像。图像处理是对成功捕获的响应。我遇到的问题是相机捕获了2张图像,我无法更改Camera2Basic示例中的代码以确保仅捕获单个图像。可以通过向该ImageSaver.run()
方法中的方法添加日志记录代码来证明该问题。Camera2BasicFragment.java
public void run() {
Log.d("Camera2", "Saving image");
ByteBuffer buffer = mImage.getPlanes()[0].getBuffer();
...
}
编辑-经过进一步调查后,问题似乎出在该示例的实现中,而不是API的基本要求。在示例中,以下代码跟踪摄像机的状态变化,
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
// We have nothing to do when the camera preview is working normally.
break;
}
case STATE_WAITING_LOCK: {
int afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
mState = STATE_WAITING_NON_PRECAPTURE;
/** CAPTURE 1 */
captureStillPicture();
} else {
runPrecaptureSequence();
}
}
break;
}
case STATE_WAITING_PRECAPTURE: {
...
break;
}
case STATE_WAITING_NON_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
mState = STATE_PICTURE_TAKEN;
/** CAPTURE 2 **/
captureStillPicture();
}
break;
}
}
}
我已经验证了两次调用都会captureStillPicture
导致生成图像并进行处理。我不太确定正确的状态转换应该是什么。
我正在使用Motorola Nexus 6
从您的问题开始,我开始阅读并深入研究它,我相信这就是它的工作方式。根据文档(链接)说:
每个请求将产生一个CaptureResult并为一个或多个目标Surface产生新的帧
请注意,它说“ frame s ”。复数形式。
说,我相信您应该只考虑onCaptureCompleted
回调内部的最后一帧。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句