使用 Camera2 api 开始视频录制时,闪光灯正在关闭

时间:2021-06-16 17:21:16

标签: android android-camera android-camera2 android-debug

我使用了两个捕获会话,一个是 previewSession(),第二个是 RecordSession()

private fun previewSession() {
    val surfaceTexture = textureView.surfaceTexture
    MAX_PREVIEW_HEIGHT = textureView.height
    MAX_PREVIEW_WIDTH = textureView.width

    surfaceTexture?.setDefaultBufferSize(MAX_PREVIEW_HEIGHT, MAX_PREVIEW_WIDTH)
    val surface = Surface(surfaceTexture)
    captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW)
    captureRequestBuilder.addTarget(surface)


    mCameraDevice.createCaptureSession(
        listOf(surface),
        object : CameraCaptureSession.StateCallback() {
            override fun onConfigured(session: CameraCaptureSession) {
                if (session != null) {
                    captureSession = session
                    captureSession.setRepeatingRequest(
                        captureRequestBuilder.build(),
                        null,
                        null
                    )

                }
            }

            override fun onConfigureFailed(session: CameraCaptureSession) {
                showLog(TAG, "Failed to create CameraCaptureSession")
            }
        },
        mBackgroundHandler
    )
}

而recordingSession() 就像:

private fun recordSession() {
    setUpMediaRecorder()
    val surfaceTexture = textureView.surfaceTexture
    MAX_PREVIEW_HEIGHT = textureView.height
    MAX_PREVIEW_WIDTH = textureView.width

    surfaceTexture?.setDefaultBufferSize(MAX_PREVIEW_HEIGHT, MAX_PREVIEW_WIDTH)
    val textureSurface = Surface(surfaceTexture)
    val recordSurface = mediaRecorder.surface
    captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
    captureRequestBuilder.addTarget(textureSurface)
    captureRequestBuilder.addTarget(recordSurface)

    val surfaces = ArrayList<Surface>().apply {
        add(textureSurface)
        add(recordSurface)
    }

    mCameraDevice.createCaptureSession(
        surfaces,
        object : CameraCaptureSession.StateCallback() {

            override fun onConfigured(session: CameraCaptureSession) {
                captureSession = session
                captureSession.setRepeatingRequest(
                    captureRequestBuilder.build(),
                    null,
                    null
                )
                isRecording = true
                mediaRecorder.start()
            }

            override fun onConfigureFailed(session: CameraCaptureSession) {
                showLog(TAG, "Failed to create CameraRecordSession!")
            }

        },
        mBackgroundHandler
    )
}

以及用于打开/关闭 Flash 的 toggleFlash 方法。

fun toggleFlashState(view: View) {
        if (isFlashOn) {
                captureRequestBuilder.set(
                    CaptureRequest.FLASH_MODE,
                    CaptureRequest.FLASH_MODE_OFF
                )
                captureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null)
                isFlashOn = false
        } else {
                captureRequestBuilder.set(
                    CaptureRequest.FLASH_MODE,
                    CameraMetadata.FLASH_MODE_TORCH
                )
                captureSession.setRepeatingRequest(captureRequestBuilder.build(), null, null)
                isFlashOn = true
        }
}

问题是当我打开闪光灯并开始录制时,闪光灯正在关闭。任何人都可以帮助我如何永久打开闪光灯以使闪光灯不会自动关闭?它应该只通过调用 toggleFlash() 方法关闭和打开。

1 个答案:

答案 0 :(得分:0)

问题似乎在于,每当您调用 recordSession(或 previewSession)时,您都会覆盖旧的 captureRequestBuilder。因此,上次调用 toggleFlashState 对 captureRequestBuilder 所做的任何更改都将丢失。

所以在recordSession和previewSession中,需要查看isFlashOn的值,并在创建新的请求构建器后将FLASH_MODE设置为正确的值。