如何解决使用 Camera2 api 开始视频录制时,闪光灯正在关闭
我使用了两个捕获会话,一个是 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
)
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)
isFlashOn = false
} else {
captureRequestBuilder.set(
CaptureRequest.FLASH_MODE,CameraMetadata.FLASH_MODE_TORCH
)
captureSession.setRepeatingRequest(captureRequestBuilder.build(),null)
isFlashOn = true
}
}
问题是当我打开闪光灯并开始录制时,闪光灯正在关闭。任何人都可以帮助我如何永久打开闪光灯以使闪光灯不会自动关闭?它应该只通过调用 toggleFlash() 方法关闭和打开。
解决方法
问题似乎在于,每当您调用 recordSession(或 previewSession)时,您都会覆盖旧的 captureRequestBuilder。因此,上次调用 toggleFlashState 对 captureRequestBuilder 所做的任何更改都将丢失。
所以在recordSession和previewSession中,需要查看isFlashOn的值,并在创建新的请求构建器后将FLASH_MODE设置为正确的值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。