Android CameraX使用

814 阅读3分钟

Demo:

github.com/android/cam…

1.CameraX是什么?

CameraX是一个JetPack库(JetPack是一套组件库,可帮助开发者在不同的Android版本和设备上适配developer.android.com/jetpack)。

2.CameraX优势?

  • 兼容性:CameraX支持Android5.0以上版本的设备,覆盖98%以上现有Android设备
  • 易用性:CameraX着重用例,使开发者专注于需要完成的任务,无需花时间处理不同设备之间的差别。CameraX支持常见的相机用例:预览、拍照、录像、图片分析(直接访问缓冲区的图片以便于在算法中使用,例如传输到机器学习套件中)
  • 确保各设备间的一致性:要维持一致的相机行为并非易事。您必须考虑宽高比、屏幕方向、旋转角度、预览大小和图像大小。有了 CameraX,这些基本行为都不用您再费心。
  • 新体验:CameraX 有一个可选的 Extensions API,您只需两行代码,便可借助该 API 实现与设备的原生相机应用相同的特性和功能。扩展程序包含焦外成像(人像)、高动态范围 (HDR)、夜间模式和脸部照片修复功能,所有这些都需要设备支持。

3.CameraX框架

由上图,CameraX是给予Camera2的API进行封装,所以CameraX支持Camera2的所有功能。

CameraX提供以下几个主要功能:

暂时无法在文档外展示此内容

4.CameraX使用示例

1.预览

developer.android.com/codelabs/ca…

PreviewView,一种可以裁剪、缩放和旋转,以保证正确显示的VIew。当Camera处于活动状态时,图片预览会流式传输到PreviewView中的Surface

PreviewView

  1. (可选)配置 CameraXConfig.Provider
  2. PreviewView 添加到布局。
  3. 请求 ProcessCameraProvider
  4. 在创建 View 时,请检查 ProcessCameraProvider
  5. 选择相机并绑定生命周期和用例。

使用 PreviewView 存在一些限制。使用 PreviewView 时,无法执行以下任何操作:

  • 创建 SurfaceTexture,以在 TextureViewPreview.SurfaceProvider 上进行设置。
  • TextureView 检索 SurfaceTexture,并在 Preview.SurfaceProvider 上对其进行设置。
  • SurfaceView 获取 Surface,并在 Preview.SurfaceProvider 上对其进行设置。

如果出现上述任何一种情况,Preview 就会停止将帧流式传输到 PreviewView

将 PreviewView 添加到布局

以下示例显示了布局中的 PreviewView

<FrameLayout    android:id="@+id/container">        <androidx.camera.view.PreviewView            android:id="@+id/previewView" /></FrameLayout>

请求 CameraProvider

以下代码展示了如何请求 CameraProvider

import androidx.camera.lifecycle.ProcessCameraProviderimport com.google.common.util.concurrent.ListenableFuturepublic class MainActivity extends AppCompatActivity {    private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;    @Override    protected void onCreate(@Nullable Bundle savedInstanceState) {        cameraProviderFuture = ProcessCameraProvider.getInstance(this);    }}

检查 CameraProvider 可用性

请求 CameraProvider 后,请验证它能否在视图创建后成功初始化。以下代码展示了如何执行此操作:

cameraProviderFuture.addListener(() -> {    try {        ProcessCameraProvider cameraProvider = cameraProviderFuture.get();        bindPreview(cameraProvider);    } catch (ExecutionException | InterruptedException e) {        // No errors need to be handled for this Future.        // This should never be reached.    }}, ContextCompat.getMainExecutor(this));

如需查看此示例中使用的 bindPreview 函数的示例,请参阅下一部分中提供的代码。

选择相机并绑定生命周期和 用例

创建并确认 CameraProvider 后,请执行以下操作:

  1. 创建 Preview
  2. 指定所需的相机 LensFacing 选项。
  3. 将所选相机和任意用例绑定到生命周期。
  4. Preview 连接到 PreviewView

以下代码展示了一个示例:

void bindPreview(@NonNull ProcessCameraProvider cameraProvider) {    Preview preview = new Preview.Builder()            .build();    CameraSelector cameraSelector = new CameraSelector.Builder()            .requireLensFacing(CameraSelector.LENS_FACING_BACK)            .build();    preview.setSurfaceProvider(previewView.getSurfaceProvider());    Camera camera = cameraProvider.bindToLifecycle((LifecycleOwner)this, cameraSelector, preview);}

请注意,bindToLifecycle() 会返回一个 Camera 对象。如需详细了解如何控制相机输出(如变焦和曝光),请参阅此指南。

2.拍照

  • takePicture(Executor, OnImageCapturedCallback)
  • takePicture(OutputFileOptions, Executor, OnImageSavedCallback)

运行 ImageCapture 的可自定义执行程序有两种类型:回调执行程序和 IO 执行程序。

  • 回调执行程序是 takePicture 方法的参数。它用于执行用户提供的 OnImageCapturedCallback()
  • 如果调用方选择将图片保存到文件位置,您可以指定执行程序以执行 IO。如需设置 IO 执行程序,请调用 ImageCapture.Builder.setIoExecutor(Executor)。如果执行程序不存在,则默认 CameraX 为任务的内部 IO 执行程序。

3.录像

如图 2 所示,CameraX 视频捕获包括几个高级架构组件:

  • SurfaceProvider,表示视频来源。
  • AudioSource,表示音频来源。
  • 用于对视频/音频进行编码和压缩的两个编码器。
  • 用于对两个流进行多路复用的媒体复用器。
  • 用于写出结果的文件保存器。