Camera2以编程方式录制视频

问题描述

我已经编写了使用Camera 2 API的基本代码。现在,我需要一个代码来按一下按钮以编程方式录制视频

如下所示,我将Kotlin用于CameraFragment,将Java用于MainActivity

CameraFragment.kt:

class CameraFragment : Fragment(),ActivityCompat.OnRequestPermissionsResultCallback {

   ......

    override fun onCreateView(
        inflater: LayoutInflater,container: ViewGroup?,savedInstanceState: Bundle?
    ): View? {
        return inflater.inflate(R.layout.fragment_camera,container,false)
    }

    override fun onViewCreated(view: View,savedInstanceState: Bundle?) {
        super.onViewCreated(view,savedInstanceState)
        viewFinder = view.findViewById(R.id.view_finder)

        viewFinder.holder.addCallback(object : SurfaceHolder.Callback {
            override fun surfaceChanged(
                holder: SurfaceHolder?,format: Int,width: Int,height: Int) = Unit

            override fun surfaceDestroyed(holder: SurfaceHolder?) = Unit

            override fun surfaceCreated(holder: SurfaceHolder?) {

                Log.d(TAG,"View finder size: ${viewFinder.width} x ${viewFinder.height}")

                view.post { getPermissions() }
            }
        })
    }

    ........

    override fun onStop() {
        super.onStop()
        try { camera.close() } catch (exc: Throwable) {}
    }

    override fun onDestroy() {
        super.onDestroy()
        cameraThread.quitSafely()
    }

    private suspend fun openCamera(
        manager: CameraManager,cameraId: String,handler: Handler? = null
    ): CameraDevice = suspendCancellableCoroutine { cont ->
        val permission = ActivityCompat.checkSelfPermission(
            requireContext(),Manifest.permission.CAMERA
        )
        assert(permission != PackageManager.PERMISSION_GRANTED)

        manager.openCamera(cameraId,object : CameraDevice.StateCallback() {
            override fun onOpened(camera: CameraDevice) = cont.resume(camera)

            override fun onDisconnected(camera: CameraDevice) {
                Log.w(TAG,"Camera $cameraId has been disconnected")
                requireActivity().finish()
            }

            override fun onError(camera: CameraDevice,error: Int) {

            }

        },handler)
    }

    private fun initializeCamera() = lifecycleScope.launch(Dispatchers.Main) {
        camera = openCamera(cameraManager,cameraManager.cameraIdList.first(),cameraHandler)
        val targets = listOf(viewFinder.holder.surface)

        session = createCaptureSession(camera,targets,cameraHandler)
        captureRequest = camera
            .createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
            .apply { addTarget(viewFinder.holder.surface) }

        session.setRepeatingRequest(captureRequest.build(),null,cameraHandler)
    }

    private suspend fun createCaptureSession(
        device: CameraDevice,targets: List<Surface>,handler: Handler? = null
    ): CameraCaptureSession = suspendCoroutine { cont ->

        device.createCaptureSession(targets,object: CameraCaptureSession.StateCallback() {
            override fun onConfigureFailed(session: CameraCaptureSession) {
                val exc = RuntimeException("Camera ${device.id} session configuration failed")
                Log.e(TAG,exc.message,exc)
                cont.resumeWithException(exc)
            }

            override fun onConfigured(session: CameraCaptureSession) {
                cont.resume(session)
            }

        },handler)
    }
   
}

这是代码,我正在使用它初始化CameraFragment

MainActivity.java:

    Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.camera_fragment);
    if (fragment == null) {

    } else {
        this.cameraFragment = (CameraFragment) fragment;
    }

请分享所需的代码以编程方式录制视频

解决方法

看看Google的Camera2Video示例。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...