Jetpack系列之CameraX 相机

news/2024/11/23 5:17:22/

(一)概述

CameraX 是Jetpack的相机组件,具有强大的参数支持和兼容性,可以实现视频拍摄、预览等操作,且API简单易用。

// cameraX
api 'androidx.camera:camera-core:1.0.0-alpha04'
api 'androidx.camera:camera-camera2:1.0.0-alpha04'
api 'androidx.camera:camera-view:1.0.0-alpha01'
api 'androidx.camera:camera-extensions:1.0.0-alpha01'
// gesture imageview
api 'com.github.chrisbanes:PhotoView:2.3.0@aar'

(二)示例代码

1.初始化相机

private fun bindCameraX() {// 取消绑定生命周期中的所有用例,并将其从CameraX中删除。CameraX.unbindAll()// 检查是否有后置摄像头var hasCameraWithLensFacing = falsetry {hasCameraWithLensFacing = CameraX.hasCameraWithLensFacing(mLensFacing)} catch (e: CameraInfoUnavailableException) {e.printStackTrace()}if (!hasCameraWithLensFacing) {InteractionPresenter.showToast("无设备cameraId!,请检查设备的相机是否被占用")return finish()}// 然后检查后置摄像头是否可用var cameraIdForLensFacing: String? = nulltry {cameraIdForLensFacing = CameraX.getCameraFactory().cameraIdForLensFacing(mLensFacing)} catch (e: CameraInfoUnavailableException) {e.printStackTrace()}if (TextUtils.isEmpty(cameraIdForLensFacing)) {InteractionPresenter.showToast("无可用的设备cameraId!,请检查设备的相机是否被占用")return finish()}// =====================重点=======================//// CameraX 视频预览val config = PreviewConfig.Builder().setLensFacing(mLensFacing) //前后摄像头.setTargetRotation(rotation)//旋转角度.setTargetResolution(resolution) //分辨率.setTargetAspectRatio(rational)//宽高比.build()preview = Preview(config)// 需要设置preview视频流回调事件,和textureview绑定。// 请注意textureview一定还要先移除再添加preview?.setOnPreviewOutputUpdateListener {val tv = binding.textureView(tv.parent as ViewGroup).run {removeView(tv)addView(tv, 0)}tv.setSurfaceTexture(it.surfaceTexture)textureView = tv}// CameraX 点击拍摄照片imageCapture = ImageCapture(ImageCaptureConfig.Builder().setTargetAspectRatio(rational).setTargetResolution(resolution).setLensFacing(mLensFacing).setTargetRotation(rotation).build())// CameraX 视频录制videoCapture = VideoCapture(VideoCaptureConfig.Builder().setTargetRotation(rotation).setLensFacing(mLensFacing).setTargetResolution(resolution).setTargetAspectRatio(rational).setVideoFrameRate(25) // 视频帧率.setBitRate(3 * 1024 * 1024).build()// bit率)// 上面配置的都是我们期望的分辨率val newUseList: MutableList<UseCase> = java.util.ArrayList()newUseList.add(preview!!)newUseList.add(imageCapture!!)newUseList.add(videoCapture!!)// 下面我们要查询一下 当前设备它所支持的分辨率有哪些,然后再更新一下 所配置的几个usecaseval resolutions = CameraX.getSurfaceManager().getSuggestedResolutions(cameraIdForLensFacing, null, newUseList)resolutions.forEach { (useCase, value) ->val suggestedResolutionMap = HashMap<String, Size>()suggestedResolutionMap[cameraIdForLensFacing!!] = valueuseCase.updateSuggestedResolution(suggestedResolutionMap)}// 最后绑定宿主生命周期CameraX.bindToLifecycle(this, preview, imageCapture, videoCapture)
}

2.视频全屏预览:

/*** 预览视频: 视频的全屏预览需要区分本地视频资源&网络视频资源*/
private fun previewVideo(previewUrl: String) {mPreviewBinding.playerView.visibility = View.VISIBLE// 播放器player = ExoPlayerFactory.newSimpleInstance(this,DefaultRenderersFactory(this),DefaultTrackSelector(),DefaultLoadControl())var uri: Uri? = nullval file = File(previewUrl)if (file.exists()) {// 如果是本地视频val dataSpec = DataSpec(Uri.fromFile(file))val fileDataSource = FileDataSource()try {fileDataSource.open(dataSpec)uri = fileDataSource.uri} catch (e: FileDataSourceException) {e.printStackTrace()}} else {// 网络视频uri = Uri.parse(previewUrl)}val factory = ProgressiveMediaSource.Factory(DefaultDataSourceFactory(this, Util.getUserAgent(this,packageName)))val mediaSource = factory.createMediaSource(uri)player?.apply {prepare(mediaSource)// 加载视频playWhenReady = true// 播放视频mPreviewBinding.playerView.player = this// playerView与player绑定}
}

3)图片全屏预览:

<!--图片的全屏预览我们使用PhotoView来实现,
请注意它的scaleType需要设置成fitCenter, 否则宽高可能会被裁减-->
<com.github.chrisbanes.photoview.PhotoViewandroid:id="@+id/photo_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:layout_marginTop="90dp"android:layout_marginBottom="@dimen/dp_60"android:scaleType="fitCenter"android:visibility="gone" />
// 预览图片
Glide.with(this).load(previewUrl).into(mPreviewBinding.photoView)


http://www.ppmy.cn/news/407842.html

相关文章

Unity3D镜头眩光组件Lens Flare

在自然界中&#xff0c;由于亮度差异过大的时候&#xff0c;容易产生镜头眩光。为了增加场景的真实性&#xff0c;某些情况下我们也需要用到该组件。 右键点击创建一个新的flare&#xff1a; 这是个结构比较简单的组件&#xff0c;只需要拖入眩光的图片即可。然后在产生眩光的灯…

OpenCV:mask的作用,如何制作掩模mask

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、mask是什么&#xff1f;二、OpenCV生成mask的几种方法矩形圆形 总结 前言 OpenCV中的很多函数用到mask&#xff0c;mask是什么&#xff1f;怎么作一个mask…

UE风格化Day20-光照函数/关于相机的使用

今天做了一下初步的打光&#xff0c;因为感觉打光其实会影响我的云彩和石头的构图 之前的是只放了一个动态的定向光&#xff0c;整体的明暗相对比较平&#xff0c;一般常规构图都会把前景做一个模糊或者暗化&#xff0c;所以需要将主体建筑照亮&#xff0c;然后把前景遮光&…

浅谈机器视觉的相机,镜头选型和打光

本文章只针对较为常见的案例&#xff0c;具有一定的通用性。具体内容为本人的实际学习笔记&#xff0c;做为记录和参考。 相机&#xff0c;镜头选型和打光 需求分析&#xff0c;&#xff08;识别定位&#xff0c;缺陷检测&#xff0c;OCR&#xff0c;测量&#xff09;方案设计…

DALSA 相机硬件/偏振相机

关于常见的面阵相机&#xff08;Dalsa相机&#xff09; 1、500万面阵相机&#xff08;型号&#xff1a;PIC-GM-2592-CS&#xff09; Sensor 5M COMS,1/2.5’’ 2.2um pixel size Shutter Rolling (not suitable for capturing moving images) Frame 2592X1944 up to 13 frames…

相机快门之:电子前帘快门

电子前帘快门 Electronic Front Curtain Shutter&#xff0c;结合机械快门与电子快门各自的特点&#xff0c;用电子的方式代替了机械的前帘。 在相机上常简写为 EFC。 工作原理 按下快门后&#xff0c;感光元件重置&#xff0c;然后从下往上逐行曝光&#xff08;类似机械前帘升…

3.额外器件-光场相机

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 光场成像&光场相机 前言一、光场是什么&#xff1f;1.光场2.光场成像的基本理论3.光场的数据表示 二、光场采集1.多相机光场采集2.单相机光场采集3.光场传感器 三、基于微…

谈谈遮光罩

——材质区别——遮光罩是套在照相机镜头前的常用摄影附件&#xff0c;有金属、硬塑、软胶等多种材质。——使用作用——1.在逆光、侧光或闪光灯摄影时&#xff0c;能防止非成象光的进入&#xff0c;避免雾霭。2.在顺光和侧光摄影时&#xff0c;可以避免周围的散射光进入镜头。…