gpt4 book ai didi

android - 在不中断预览的情况下切换 Camera2 中的手电筒

转载 作者:行者123 更新时间:2023-11-29 00:05:30 25 4
gpt4 key购买 nike

刚开始使用 Camera2 框架是因为它提供了对相机低级功能的更多控制。但是,我在快速打开和关闭手电筒时遇到了一些问题。使用旧的 Camera API,我可以通过以下方式在提供预览时切换闪光灯:

try
{
android.hardware.Camera.Parameters parameters = c.getParameters();
if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_OFF))
{
parameters.setFlashMode(Parameters.FLASH_MODE_TORCH);
Log.i("HeartBeatAlgorithm", "LightOn");
}
else if (parameters.getFlashMode().equals(Camera.Parameters.FLASH_MODE_TORCH))
{
parameters.setFlashMode(Parameters.FLASH_MODE_OFF);
Log.i("HeartBeatAlgorithm", "LightOff");
}
c.setParameters(parameters);
}
catch (Exception exception)
{
c.release();
c = null;
}

手电筒会快速打开或关闭,没有任何明显的中断。然而,对于 Camera2,闪光模式似乎是 CaptureSession 的一个属性,这意味着需要创建一个全新的 CaptureSession 来更改闪光模式,即:

try
{
SurfaceTexture texture = mTextureView.getSurfaceTexture();
assert texture != null;

texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
Surface surface = new Surface(texture);
mPreviewRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);

if (mLightNowOn == true)
{
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);
}
else
{
mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF);
}

mPreviewRequestBuilder.addTarget(surface);
mPreviewRequest = mPreviewRequestBuilder.build();
mCameraDevice.createCaptureSession(Arrays.asList(surface), mSessionStateCallback, null);
}
catch (CameraAccessException e)
{
e.printStackTrace();
}

正如开发者文档中提到的,“创建 session 是一项代价高昂的操作,可能需要数百毫秒,因为它需要配置相机设备的内部管道并分配内存缓冲区以将图像发送到所需目标。”确实如此,并且在切换 Flash 模式时我的应用中有明显的延迟。

我真的需要能够快速切换闪光灯模式,而不会过多地中断预览。有什么办法解决这个问题,还是由于新的 API 管道而无法避免?

最佳答案

并非每次都必须创建全新的捕获 session 只是为了更改闪光灯模式。相反,您可以在现有捕获 session 上创建重复预览请求,并且每次都设置新的重复请求,例如:

mPreviewRequestBuilder.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_TORCH);...mPreviewRequest = mPreviewRequestBuilder.build();...mCaptureSession.setRepeatingRequest(mPreviewRequest, captureCallBack, backgroundHandler);

您可以多次重复此序列。

关于android - 在不中断预览的情况下切换 Camera2 中的手电筒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34093508/

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