前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Camera2 Extensions

Camera2 Extensions

作者头像
雪月清
发布2022-11-19 09:53:21
1.8K0
发布2022-11-19 09:53:21
举报
文章被收录于专栏:雪月清的随笔雪月清的随笔

引言

相机扩展程序(Camera Extensions)是指Android提供的一套方便第三方相机开发者也能使用到平台厂商独有的一些Camera能力(比如bokeh、夜景、HDR等)的API

其中Google制定extensions-interface层,向下由OEM供应商提供能力实现,向上则封装Camera2和CameraX Extensions两套API来提供能力接口

架构图如下所示

CameraX Extensions API的用法可以参考Android官方账号发表的推文

使用 CameraX Extensions API 将特效应用到照片上

Camera2 Extensions API的用法就看这篇文章啦~

能力支持

Extensions API从Android12开始共提供了5种能力

EXTENSION_AUTOMATIC:自动模式,根据当前光线和其它环境条件自动选择特定扩展,比如HDR或NIGHT等

EXTENSION_BEAUTY:美颜能力,如磨皮、脸部肤色轮廓修饰等,Android13开始废弃

EXTENSION_FACE_RETOUCH:美颜能力,如磨皮、脸部肤色轮廓修饰等;Android13开始提供,其实就是上面的BEAUTY改了名

EXTENSION_BOKEH:焦外成像,通常也叫背景虚化能力,通过调节景深增强画面主体焦点,模糊其它区域,一般用于人像,微距等需要突出主体的场景

EXTENSION_HDR:高动态范围,可以让最终成像获得更多的动态范围和图像细节,比如拍照时使用不同的AE配置,让高光区域不过曝,暗光区域不欠曝以达到最佳成片效果

EXTENSION_NIGHT:夜景算法,可在暗光条件下抑制噪点以提升图像质量

以EXTENSION_HDR(高动态范围)为例,可以看到右侧生效HDR效果的图像,左下角暗光区域的椅子和石头还是可以看清的,顶部区域太阳周围的过曝区域的处理也非常不错

(EXTENSION_HDR)

使用流程

代码语言:javascript
复制
查询设备支持哪些扩展能力通过CameraExtensionCharacteristics
代码语言:javascript
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    mCameraExtensionCharacteristics = mCameraManager.getCameraExtensionCharacteristics(String.valueOf(mCameraId));
    if (mCameraExtensionCharacteristics != null) {
        List<Integer> list = mCameraExtensionCharacteristics.getSupportedExtensions();
        Log.i(TAG, "openCameraCore: support extensions: " + list);
    }
}

设备支持的情况下就可以开始启动预览了,步骤和Camera2普通模式启动预览流程是类似的,三步走即可,只是一些接口不同

打开相机的步骤和Camera2普通模式无差异

创建会话则采用createExtensionSession

获取CameraExtensionSession对象

代码语言:javascript
复制
// extension: 例如EXTENSION_HDR
// listener: 使用CameraExtensionSession.StateCallback
// outputs和executor类似Camera2普通模式的传参
ExtensionSessionConfiguration config = new ExtensionSessionConfiguration(
    extension, outputs, executor, listener
);
device.createExtensionSession(config);

阅读官方文档可以看到创建extension session时有几点限制

  • 最多只能配置两路stream,也就是两个surface
  • 预览stream仅支持SurfaceTexture
  • 拍照stream,JPEG格式是一定支持的,YUV_420_888不一定支持

启动预览

代码语言:javascript
复制
// listener: ExtensionCaptureCallback
extensionSession.setRepeatingRequest(request, executor, listener);

其中启动预览请求的request参数可以自由配置的key必须来自

CameraExtensionCharacteristics#getAvailableCaptureRequestKeys

其余key设置将无效,被特定extension mode底层的参数覆盖

拍照

代码语言:javascript
复制
extensionSession.capture(...);

拍照request能设置的key也必须来自

CameraExtensionCharacteristics#getAvailableCaptureRequestKeys

其余key设置将无效,被特定extension mode底层的参数覆盖

最后

Camera Extensions的设计对于第三方影像开发者来说肯定是非常好的,不过手机厂商近几年也都在大力发展自己特有的CameraSDK,一些高阶影像能力基本都是通过私有SDK来提供。。。所以Extensions API的兼容性并不高

不过从Android T开始,Google会提供默认的软件实现的extensions版本,未来还是可以期待下?

~~END~~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雪月清的随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档