问题描述
我正在尝试使用最新版本的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函数