<
>

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

2020-06-04 15:00:41 来源:易采站长站 作者:于海丽

实现起来也非常简单,首先绘制一个圆,监听该View的点击和长按事件,长按的时候在根据总录制时长和当前录制时间算出需要绘制的角度,就可以在圆上面绘制进度了。

最后通过接口将点击 长按和录制完成的事件返回,跟前面的拍照,录制,录制完成的代码结合起来就完成上面的效果了。

CameraView

如果觉得前面的初始化还不够简单,那么可以使用CameraX提供的CameraView了,这里面将PreviewView,Preview,ImageCapture,VideoCapture等都封装起来了,而且还能实现缩放,裁剪,旋转等功能,使用起来更加简单。

首先xml文件中添加CameraView

<androidx.camera.view.CameraView
 android:id="@+id/view_finder"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 />

然后在Activity中实例化CameraView,直接绑定当前生命周期就可以了。

mBtnCameraSwitch = findViewById(R.id.camera_switch_button);
 mCameraView.bindToLifecycle(this);

只需两句话就完成了前面的初始工作。然后就可以愉快的拍照和录制视频了。

拍照和录制的代码跟前面一样只不过全都是通过CamerView对象来调用 mCameraView.takePicture , mCameraView.startRecording ,调用之前需要通过 mCameraView.setCaptureMode(CameraView.CaptureMode.IMAGE) 来切换当前的模式是拍照还是录像。

将前面的自定义的RecordView加入布局文件中,跟CameraView的拍照、录像代码一结合,很快就能实现跟前面一样的效果了。

图片分析

CameraX还提供了图像分析功能,它提供了可供 CPU 访问以执行图像处理、计算机视觉或机器学习推断的图像,可以无缝的访问缓冲区,一般用不到但功能很强大。创建一个图片分析器然后绑定声明周期即可。

mImageAnalysis = new ImageAnalysis.Builder()
  .setTargetAspectRatio(screenAspectRatio)
  .setTargetRotation(rotation)
  .build();
 mImageAnalysis.setAnalyzer(mExecutorService, new ImageAnalysis.Analyzer() {
  @Override
  public void analyze(@NonNull ImageProxy image) {
  
  }
 });
cameraProvider.bindToLifecycle(CameraActivity.this,
  cameraSelector,mPreview,mImageCapture,mVideoCapture,mImageAnalysis);

供应商扩展

供应商扩展程序:CameraX提供了外部扩展的API,可以直接对接手机产商,如果该手机厂商实现了CameraX的扩展程序,就可以使用VamerX的扩展API直接调用这些效果比如:美颜、DHR、夜间、自动等模式。

因为不是所有的手机厂商都支持扩展程序,所以在使用扩展的时候需要判断一下该手机是否支持,支持才添加。

给预览界面设置外部扩展,需要 Preview.BuilderCameraSelector cameraSelector) 两个参数

private void setPreviewExtender(Preview.Builder builder, CameraSelector cameraSelector) {
 AutoPreviewExtender extender = AutoPreviewExtender.create(builder);
 if(extender.isExtensionAvailable(cameraSelector)){
  extender.enableExtension(cameraSelector);
 }
 BokehPreviewExtender bokehPreviewExtender = BokehPreviewExtender.create(builder);
 if(bokehPreviewExtender.isExtensionAvailable(cameraSelector)){
  bokehPreviewExtender.enableExtension(cameraSelector);
 }
 HdrPreviewExtender hdrPreviewExtender = HdrPreviewExtender.create(builder);
 if(hdrPreviewExtender.isExtensionAvailable(cameraSelector)){
  hdrPreviewExtender.enableExtension(cameraSelector);
 }
 BeautyPreviewExtender beautyPreviewExtender = BeautyPreviewExtender.create(builder);
 if(beautyPreviewExtender.isExtensionAvailable(cameraSelector)){
  beautyPreviewExtender.enableExtension(cameraSelector);
 }
 NightPreviewExtender nightPreviewExtender = NightPreviewExtender.create(builder);
 if(nightPreviewExtender.isExtensionAvailable(cameraSelector)){
  nightPreviewExtender.enableExtension(cameraSelector);
 }
 }
              
暂时禁止评论

微信扫一扫

易采站长站微信账号