我使用了两个捕获会话,一个是 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() 方法关闭和打开。
答案 0 :(得分:0)
问题似乎在于,每当您调用 recordSession(或 previewSession)时,您都会覆盖旧的 captureRequestBuilder。因此,上次调用 toggleFlashState 对 captureRequestBuilder 所做的任何更改都将丢失。
所以在recordSession和previewSession中,需要查看isFlashOn的值,并在创建新的请求构建器后将FLASH_MODE设置为正确的值。