使用CameraX拍摄视频

简介: 使用CameraX拍摄视频

概览


概念和简单的使用建议跳到上一篇文章去看juejin.cn/post/696831…


使用(简单拍摄一段视频并展示)


打开相机并设置相关参数

private fun openCamera() {
        cameraProviderFuture = ProcessCameraProvider.getInstance(this)//获得provider实例
        cameraProviderFuture.addListener({
            cameraProvider = cameraProviderFuture.get()
            bindPreview()
        }, ContextCompat.getMainExecutor(this))
    }
    @SuppressLint("RestrictedApi")
    private fun bindPreview(
    ) {
        val preview: Preview = Preview.Builder()
            .build()
        val cameraSelector: CameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)
            .build()
        preview.setSurfaceProvider(previdew.surfaceProvider)
        videoCapture = VideoCapture.Builder()
            .setBitRate(1024 * 1024)
            .setVideoFrameRate(36)
            .setTargetRotation(previdew.display.rotation)
            .build()
        var camera = cameraProvider?.bindToLifecycle(
            this,
            cameraSelector,
            videoCapture,
            preview
        )
    }
复制代码


拍摄视频代码

@SuppressLint("RestrictedApi", "MissingPermission")
    fun takeVideo() {
        val faceVideoFile = getExternalFilesDir("videoFile")?.also {
            if (it.exists()) {
                it.mkdirs()
            }
        }
        val destVideoFile = File(faceVideoFile, "${System.currentTimeMillis()}.mp4")
        val outFileOption = VideoCapture.OutputFileOptions.Builder(destVideoFile).build()
        videoCapture.startRecording(
            outFileOption,
            Executors.newSingleThreadExecutor(),
            object : VideoCapture.OnVideoSavedCallback {
                override fun onVideoSaved(outputFileResults: VideoCapture.OutputFileResults) {
                    lifecycleScope.launch(Dispatchers.Main) {
                        Toast.makeText(this@TakeVideoActivity, "拍摄成功", Toast.LENGTH_LONG).show()
                        startActivity(
                            Intent(
                                this@TakeVideoActivity,
                                ShowVideoActivity::class.java
                            ).apply {
                                putExtra("path", destVideoFile.absolutePath)
                            })
                    }
                }
                override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) {
                    lifecycleScope.launch(Dispatchers.Main) {
                        Toast.makeText(this@TakeVideoActivity, "拍摄失败", Toast.LENGTH_LONG).show()
                    }
                }
            })
    }
复制代码


结束拍摄

videoCapture.stopRecording()
复制代码


activity销毁的时候停止相机

@SuppressLint("RestrictedApi")
    override fun onDestroy() {
        super.onDestroy()
        cameraProvider?.shutdown()//必备的一步调用
    }
复制代码


最终效果

image.png


重要api讲解


当我们构建VideoCapture的时候有一些重要的参数设置可以决定最终我们生成视频的结果


setBitRate设置视频的比特率

.setBitRate(1024 * 1024)
复制代码

方法参数的单位是比特,表示我们生成的视频一秒钟的的比特大小

我亲测的结果是CameraX会尽量按照我们设置的比特率来做,如果设置的不合理CameraX会自动为我们调整以保证最终生成的视频的质量


setVideoFrameRate设置视频的帧率

.setVideoFrameRate(100)
复制代码

相当于设置视频的帧率,不过参数的单位是毫秒,比如本例代码我们设置100ms,那么就表示1s内回输出10张视频帧


setTargetRotation设置相机的旋转角度

.setTargetRotation(previdew.display.rotation)
复制代码

这个api没啥好说的,大家都熟悉


setAudioBitRate设置音频的码率

.setAudioBitRate(1024)
复制代码

设置音频的码率,和setBitRate类似


setTargetResolution设置生成的视频的分辨率

.setTargetResolution(Size(300,200))
复制代码

设置最终生成视频的宽高像素比,当我们想极限压缩视频大小的时候这个会非常有用,压缩收益会远大于控制帧率。


切换摄像头的方法

val cameraSelector: CameraSelector = CameraSelector.Builder()
            .requireLensFacing(CameraSelector.LENS_FACING_BACK)//设置后置摄像头,非自拍
//            .requireLensFacing(CameraSelector.LENS_FACING_FRONT)//设置前置摄像头,自拍
            .build()
复制代码

这里必须说一下安卓前置摄像头坑爹的地方:使用前置摄像头拍摄出来的图像是左右颠倒的,使用CameraX因为无法自定义SurfaceView所以我们无法对视频方向进行处理



相关文章
|
8月前
|
机器学习/深度学习 数据采集 人工智能
你大脑中的画面,现在可以高清还原了
你大脑中的画面,现在可以高清还原了
你大脑中的画面,现在可以高清还原了
|
9月前
检测使用校准的立体摄像头拍摄的视频中的人物并确定其与摄像头的距离
检测使用校准的立体摄像头拍摄的视频中的人物,并确定他们与摄像头的距离。
99 0
|
传感器 自动驾驶 开发工具
Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
Blackfly S 采用业内先进的冰块外形传感器。 具有强大功能,可以轻松生成所需的精确图像,并加速应用程序开发。 包括对图像捕获和相机预处理的自动和精确手动控制。 Blackfly S 提供GigE、USB3、套装和板级版本。 精确图像 索尼CMOS传感器中的选择包括:全局快门、偏振和高灵敏度BSI传感器。
Flir Blackfly S 工业相机:配置多个摄像头进行同步拍摄
Threejs - 相机? 什么是相机? 照相机?
Threejs - 相机? 什么是相机? 照相机?
Threejs - 相机? 什么是相机? 照相机?
01-选择属于自己的相机(中)
这些笔记仅供学习交流使用噢
134 0
01-选择属于自己的相机(中)
|
iOS开发
可眨眼拍照的智能眼镜
可眨眼拍照的智能眼镜
可眨眼拍照的智能眼镜
|
传感器 开发工具
无人机老大发布了一款黑科技相机:能够拍到肉眼看不到的东西
无人机应用场景越来越广泛,作为无人机老大——大疆在行业专业化应用中下了不少功夫,3 月 29 号,大疆联合全球热成像技术先驱,美国菲力尔公司(FLIR SYSTEMS, Inc.)推出一款名叫:禅思 XT2 双光热成像相机的设备。
157 0
无人机老大发布了一款黑科技相机:能够拍到肉眼看不到的东西
从手机拍摄的图片里获取拍摄地点的经纬
从手机拍摄的图片里获取拍摄地点的经纬
111 0
从手机拍摄的图片里获取拍摄地点的经纬
抖音集锦(你不得不看的那些镜头)
最近在看抖音,觉得很有意思,所以就录了个视频。由于时间太短,没有进行剪辑,请见谅,不过我自己看了遍,觉得真的很好玩,希望大家会喜欢,如果有好玩的,可以加我微信,一起交流。
1242 0