Demo:
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
- (可选)配置
CameraXConfig.Provider。 - 将
PreviewView添加到布局。 - 请求
ProcessCameraProvider。 - 在创建
View时,请检查ProcessCameraProvider。 - 选择相机并绑定生命周期和用例。
使用 PreviewView 存在一些限制。使用 PreviewView 时,无法执行以下任何操作:
- 创建
SurfaceTexture,以在TextureView和Preview.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 后,请执行以下操作:
- 创建
Preview。 - 指定所需的相机
LensFacing选项。 - 将所选相机和任意用例绑定到生命周期。
- 将
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,表示音频来源。- 用于对视频/音频进行编码和压缩的两个编码器。
- 用于对两个流进行多路复用的媒体复用器。
- 用于写出结果的文件保存器。