ZSL (zero shutter lag):零秒延迟
在日常生活中,使用手机camera拍照的时候往往会有一些延迟的体验。ZSL,就是为了消除这种延迟,提供一种“拍即视”的体验而被开发出来。
通过zsl 技术,最大程度上减小了这种延迟,如下图:
预览之后,sensor 和VFE 会产生快照和预览帧,并且会把最新的一些帧保留在图像buffer中。一旦“取图”事件被触发,系统就会在第一时间内从图像buffer中把相关的图像找出并返回给用户,这就是ZSL,零秒延迟。
Burst mode 是single shot 特征的自然延伸。此功能允许用户捕获的不仅是当前帧,但也有几个帧之前和之后的当前帧的少数几个帧,从而捕捉到一个序列的图像到内存。这将为用户提供不同的快照时间,从中选择一个或多个帧来保存。应用了多少帧的选择自由是多少追溯帧和未来帧在记忆的局限性上,追溯和未来帧是相对于真正的快门时间的。
Implementation without ZSL:
Implementation with ZSL:
参考链接:
http://blog.chinaunix.net/uid-7213935-id-5753468.html https://blog.csdn.net/kris_fei/article/details/77057473
一篇关于摄像头基础部分的文章:高通Camera架构
https://www.cnblogs.com/whw19818/p/5853407.html
——————————————下面说下Code的方式—————————————————-
setZSLMode
默认是隐藏的方法. 具体对于队列的维护
放在了Framework层去处理Goolge建议对于缓存队列的处理放在App 层来处理 具体可以参考如下的链接 Camera2 ZSL
这里要注意的是需要设置模板TEMPLATE_ZERO_SHUTTER_LAG
来通知HAL切换模板
createReprocessableCaptureSessionByConfigurations
camera.createReprocessableCaptureSessionByConfigurations(inputConfiguration, outputs,sessionListener, handler);
InputConfiguration
, 还有ImageWrite
InputConfiguration inputConfiguration = new InputConfiguration
Size.width(), Size.height(),
ImageFormat.YUV_420_888;
ImageReader mZslImageReader = new ImageReader(Size.width(), Size.height(),
ImageFormat.PRIVATE);
CaptureRequest.Builder reqBuilder = cameraDevice.createCaptureRequest(templateType);
reqBuilder.addTarget(mZslImageReader.getSurface);
mCaptureSession.setRepeatingBurst(reqBuilder....);
private final LinkedBlockingQueue<Image> mQueue = new LinkedBlockingQueue<Image>();
mQueue.add(Image)
这个surface其实就是设置inputconfig的时候底层创建的surface
ImageWriter mImageWriter = ImageWriter.newInstance(session.getInputSurface(), 2);
mImageWriter.queueInputImage(mQueue.getImage());//伪代码
captureRequestBuilder = mCameraDevice.
createReprocessCaptureRequest(mQueue.getResult());
captureRequestBuilder.addTarget(mCaptureImageReader.getSurface());
mCaptureSession.capture(captureRequestBuilder.build(),
captureRequestCallback, mCameraDeviceHandler.getDeviceThreadHandler());
我整理了一张图片大致流程是这样的
Android5.0之后,增加了Cameraapi2接口,api2和api1在调用流程上差异很大,功能上api2提供了更加细致的控制功能,api1子系统被设计为具备高级控制功能的黑盒,能够发出请求,但无法控制图像的缓冲区和元数据,无法再帧层面控制传感器的特性,无法通过访问和修改元数据信息(如3A信息)对捕获的帧应用任何增强功能,重新设计api2旨在大幅提高应用程序控制摄像头子系统的能力,性能也有一定的提升。
后续分析
Command+C
复制文件Command+Option+V
剪切文件