JetPack开发中使用CameraX完成拍照和拍视频功能

2020-06-04 15:00 来源:易采站长站 作者:于海丽 点击: 评论:

A-A+

原标题:JetPack开发中使用CameraX完成拍照和拍视频功能

前段时间CameraX的Beta版发布了,这几天有时间也来尝试一下。Beta版本是对外测试版本,意味着它已经走出实验室走向生产,API的调用基本稳定不会大改了,bug也会更少可以用于生成环境。

之前使用Camera1和Camera2开发相机功能的时候需要调用非常复杂的API,而且由于Android手机的碎片化严重,不同手机对相机功能的支持度也不一样,因此很多做相机相关应用的公司都会封装自己的相机库来简化相机的使用步骤和处理兼容性问题。

CameraX其实就是Google开发的一个用来简化相机开发时候API的调用和处理各种兼容性问题的库。最多兼容到Android 5.0,底层调用的也是Camera2,不过比Camera2用起来更简单,而且可以绑定生命周期,从而可以自动的处理相机的开启释放等工作。

下面开始来尝试吧

添加依赖

dependencies {
 // CameraX 核心库使用 camera2 实现
 implementation "androidx.camera:camera-camera2:1.0.0-beta03"
 // 可以使用CameraView
 implementation "androidx.camera:camera-view:1.0.0-alpha10"
 // 可以使用供应商扩展
 implementation "androidx.camera:camera-extensions:1.0.0-alpha10"
 //camerax的生命周期库
 implementation "androidx.camera:camera-lifecycle:1.0.0-beta03"
 }

如果想要使用CameraX拍照非常简单,只需要配置不同的使用状态,然后绑定到生命周期中即可。比如预览需要设置预览相关的状态,拍照需要设置拍照相关的状态,录制视频需要设置录制相关的状态。

配置状态

预览配置:Preview用于相机预览的时候显示预览画面。

Preview preview = new Preview.Builder()
  //设置宽高比
  .setTargetAspectRatio(screenAspectRatio)
  //设置当前屏幕的旋转
  .setTargetRotation(rotation)
  .build();

照相配置:ImageCapture 用于拍照,并将图片保存

ImageCapture imageCapture = new ImageCapture.Builder()
  //优化捕获速度,可能降低图片质量
  .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
  //设置宽高比
  .setTargetAspectRatio(screenAspectRatio)
  //设置初始的旋转角度
  .setTargetRotation(rotation)
  .build();

录制视频设置:VideoCapture 用来录制视频和保存视频,宽高比和分辨率设置一个就可以了,不要同时设置否则报错。根据实际的需求来设置,如果对宽高比要求高就设置宽高比,反之就设置分辨率

VideoCapture videoCapture = new VideoCaptureConfig.Builder()
  //设置当前旋转
  .setTargetRotation(rotation)
  //设置宽高比
  .setTargetAspectRatio(screenAspectRatio)
  //分辨率
  //.setTargetResolution(resolution)
  //视频帧率 越高视频体积越大
  .setVideoFrameRate(25)
  //bit率 越大视频体积越大
  .setBitRate(3 * 1024 * 1024)
  .build();

绑定到生命周期:ProcessCameraProvider 是一个单例类,可以把相机的生命周期绑定到任何LifecycleOwner类中。AppCompatActivity和Fragment都是LifecycleOwner

【易采站长站编辑:秋军】