gpt4 book ai didi

Android Camera2,连续拍照

转载 作者:搜寻专家 更新时间:2023-11-01 07:46:53 25 4
gpt4 key购买 nike

我需要使用 Camera2 API 连续拍照。它在高端设备(例如 Nexus 5X)上运行良好,但在较慢的设备(例如三星 Galaxy A3)上,预览会卡住。

代码有点长,所以我只贴最相关的部分:

调用以开始我的预览的方法:

private void startPreview() {

SurfaceTexture texture = mTextureView.getSurfaceTexture();

if(texture != null) {

try {

// We configure the size of default buffer to be the size of camera preview we want.
texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

// This is the output Surface we need to start preview.
Surface surface = new Surface(texture);

// We set up a CaptureRequest.Builder with the output Surface.
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
mPreviewRequestBuilder.addTarget(surface);

// Here, we create a CameraCaptureSession for camera preview.
mCameraDevice.createCaptureSession(Arrays.asList(surface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {

@Override
public void onConfigured(@NonNull CameraCaptureSession cameraCaptureSession) {

// If the camera is already closed, return:
if (mCameraDevice == null) { return; }

// When the session is ready, we start displaying the preview.
mCaptureSession = cameraCaptureSession;

// Auto focus should be continuous for camera preview.
mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
mPreviewRequest = mPreviewRequestBuilder.build();

// Start the preview
try { mCaptureSession.setRepeatingRequest(mPreviewRequest, null, mPreviewBackgroundHandler); }
catch (CameraAccessException e) { e.printStackTrace(); }
}

@Override
public void onConfigureFailed(@NonNull CameraCaptureSession cameraCaptureSession) {
Log.e(TAG, "Configure failed");
}
}, null
);
}
catch (CameraAccessException e) { e.printStackTrace(); }
}
}

拍照时调用的方法:

private void takePicture() {

try {

CaptureRequest.Builder captureBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
captureBuilder.addTarget(mImageReader.getSurface());
mCaptureSession.capture(captureBuilder.build(), null, mCaptureBackgroundHandler);
}
catch (CameraAccessException e) { e.printStackTrace(); }
}

这是我的 ImageReader:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener = new ImageReader.OnImageAvailableListener() {

@Override
public void onImageAvailable(final ImageReader reader) {

mSaveBackgroundHandler.post(new Runnable() {

@Override
public void run() {

// Set the destination file:
File destination = new File(getExternalFilesDir(null), "image_" + mNumberOfImages + ".jpg");
mNumberOfImages++;

// Acquire the latest image:
Image image = reader.acquireLatestImage();

// Save the image:
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
buffer.get(bytes);

FileOutputStream output = null;
try {
output = new FileOutputStream(destination);
output.write(bytes);
}
catch (IOException e) { e.printStackTrace(); }
finally {

image.close();

if (null != output) {

try { output.close(); }
catch (IOException e) { e.printStackTrace(); }
}
}

// Take a new picture if needed:
if(mIsTakingPictures) {
takePicture();
}
}
});
}
};

我有一个按钮可以切换 mIsTakingPictures bool 值,并进行第一个 takePicture 调用。

回顾一下,我使用了 3 个线程:

  • 一个用于预览
  • 一个用于捕获
  • 一个用于图像保存

卡住的原因可能是什么?

最佳答案

当您一直在性能较差的设备上拍摄图像时,无法避免在预览中丢失取景框。避免这种情况的唯一方法是在支持 TEMPLATE_ZERO_SHUTTER_LAG 并使用 reprocessableCaptureSession 的设备上。关于这个的文档非常糟糕,找到一种实现它的方法可能是一次冒险。几个月前我遇到了这个问题,最后我找到了实现它的方法:

How to use a reprocessCaptureRequest with camera2 API

在那个答案中,您还可以找到一些 Google CTS 测试,它也实现了 ReprocessableCaptureSession 并使用 ZSL 模板拍摄了一些连拍。

最后,您还可以使用 CaptureBuilder 与您的预览界面和附加的图像阅读器界面,在这种情况下,您的预览将一直继续工作,并且您会将每一帧保存为新图片.但是您仍然会遇到卡住问题。

我还尝试使用每 100 毫秒调度一个新的 capture 调用的处理程序实现突发捕获,第二个选项在性能和避免帧率丢失方面相当不错,但你不会得到每秒捕获多次,例如两个 ImageReader 选项。

希望我的回答对您有所帮助,API 2 仍然有点复杂,并且没有那么多示例或相关信息。

关于Android Camera2,连续拍照,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42215106/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com