使用cameraX 1.0.0-beta11进行视频录制不起作用

问题描述

我正在尝试使用最新版本的cameraX 1.0.0-beta11录制视频,但是录制时遇到了问题。

代码段以启动摄像头并录制视频。

@SuppressLint("RestrictedApi")
    private fun startCameraX() {
        val cameraProviderFuture = ProcessCameraProvider.getInstance(activity!!)

        cameraProviderFuture.addListener(Runnable {
            // Used to bind the lifecycle of cameras to the lifecycle owner
            val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

            // Preview
            val preview = Preview.Builder()
                .build()
                .also {
                    it.setSurfaceProvider(previewView.surfaceProvider)
                }

              val videoCapture=VideoCapture.Builder().setVideoFrameRate(15).build()


            val videoFile = File(
                getoutputDirectory(),SimpleDateFormat(FILENAME_FORMAT,Locale.US
                ).format(System.currentTimeMillis()) + ".mp4")
            val outputoptions = VideoCapture.OutputFileOptions.Builder(videoFile).build()
            videoCapture.startRecording(outputoptions,ContextCompat.getMainExecutor(activity),object: VideoCapture.OnVideoSavedCallback{
                override fun onVideoSaved(outputFileResults: VideoCapture.OutputFileResults) {
                    Log.e("data","onVideoSaved")
                }

                override fun onError(videoCaptureError: Int,message: String,cause: Throwable?) {
                    Log.e("data","onError->$message")
                }
            })

            // Select back camera as a default
            val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

            try {
                // Unbind use cases before rebinding
                cameraProvider.unbindAll()

                // Bind use cases to camera
                cameraProvider.bindToLifecycle(
                    (this as LifecycleOwner),cameraSelector,preview,videoCapture)

            } catch(exc: Exception) {
                Log.e("TAG","Use case binding Failed",exc)
            }


        },ContextCompat.getMainExecutor(activity))
    }

输出目录

private fun getoutputDirectory(): File {
            val mediaDir = activity?.externalMediaDirs?.firstOrNull()?.let {
                File(it,resources.getString(R.string.app_name)).apply { mkdirs() } }
            return if (mediaDir != null && mediaDir.exists())
                mediaDir else activity!!.filesDir
        }

错误-未绑定到相机[androidx.camera.core.VideoCapture@4bd02a4]

请帮助!! 预先感谢。

解决方法

您必须在调用 startRecording 函数之前启动相机。基本上你应该在函数中输出以下代码。

val videoFile = File(
    getOutputDirectory(),SimpleDateFormat(FILENAME_FORMAT,Locale.US
).format(System.currentTimeMillis()) + ".mp4")
val outputOptions = VideoCapture.OutputFileOptions.Builder(videoFile).build()
videoCapture.startRecording(outputOptions,ContextCompat.getMainExecutor(activity),object: VideoCapture.OnVideoSavedCallback{
    override fun onVideoSaved(outputFileResults: VideoCapture.OutputFileResults) {
        Log.e("data","onVideoSaved")
    }
    override fun onError(videoCaptureError: Int,message: String,cause: Throwable?) {
        Log.e("data","onError->$message")
    }
})

并在用户点击录制按钮时调用它,然后,当用户点击停止按钮时,您可以使用

停止录制
videoCapture.stopRecording()

一旦调用stopRecording函数,如果一切正常,就会调用onVideoSaved函数