使用 Camera2(Android 版本 21)API 录制 60fps 视频
Posted
技术标签:
【中文标题】使用 Camera2(Android 版本 21)API 录制 60fps 视频【英文标题】:Recording 60fps video with Camera2(on Android version 21) API 【发布时间】:2016-10-25 10:04:21 【问题描述】:我正在尝试在 Camera2(android.hardware.camera2) API 上以 60(或更高)fps 的速率录制视频。
最后,我使用CameraConstrainedHighSpeedCaptureSession 成功录制了 120fps。但它只针对 >=120fps 的用例而不是 60fps。
即使我尝试使用普通捕获会话 (CameraCaptureSession) 以 60fps 的速度录制,它也只支持
Range<Integer>[] fpsRanges = characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
我不知道如何使用 Camera2 API 以 60fps 的速度进行录制。
欢迎提出任何想法。
谢谢。
【问题讨论】:
你找到解决办法了吗? 【参考方案1】:您必须从 CameraDevice 创建一个 ConstrainedHighSpeedCaptureSession
并实例化一个新会话,就像您可能对普通捕获会话所做的那样。
您还需要为您的 Builder 设置下一个值:
myPreviewRequestBuilder.set(CaptureRequest.CONTROL_MODE, CaptureRequest.CONTROL_MODE_USE_SCENE_MODE);
myPreviewRequestBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO);
myPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, new Range<Integer>(frameRate, frameRate));
之后,使用您的构建器生成一个 CaptureRequestList:
myHighSpeedRequestList = ((CameraConstrainedHighSpeedCaptureSession) cameraCaptureSession).createHighSpeedRequestList(myPreviewRequestBuilder.build());
并在您的捕获会话中使用它来生成 CaptureSession:
mCaptureSession.setRepeatingBurst(myHighSpeedRequestList,
YourHighSpeedVideoCaptureCallback,
YourBackgroundHandler);
【讨论】:
这不是用于 >= 120 fps 的视频捕获吗? 我修改了 CONTROL_AE_TARGET_FPS_RANGE 以获得我想要使用的范围 我不能分享很多这段代码:S。但无论如何,我只是创建一个 ConstrainedHighSpeedCaptureSession,将我之前发布的 3 个集合添加到构建器,创建列表并设置 RepeatingBurst。没有别的,只是捕获异常和一些条件以避免相机设备或会话为空时强制关闭 此答案无效。您不能使用高速捕获会话进行 60 FPS 录制,期间。 @FranciscoDurdinGarcia 我完全不同意你的回答。为什么CameraConstrainedHighSpeedCaptureSession
的文档会如此错误?【参考方案2】:
使用以下代码:
private fun recordSession()
setUpMediaRecorder()
val surfaceTexture = textureView.surfaceTexture
surfaceTexture?.setDefaultBufferSize(mPreviewSize!!.width, mPreviewSize!!.height)
captureRequestBuilder = mCameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_RECORD)
val surfaces = ArrayList<Surface>()
val textureSurface = Surface(surfaceTexture)
surfaces.add(textureSurface)
captureRequestBuilder.addTarget(textureSurface)
val recordSurface = mediaRecorder.surface
surfaces.add(recordSurface)
captureRequestBuilder.addTarget(recordSurface)
mCameraDevice.createCaptureSession(
surfaces,
object : CameraCaptureSession.StateCallback()
override fun onConfigured(session: CameraCaptureSession)
captureSession = session
val fps: Int = if (PreferenceProvider.getIsFrontCameraOpened())
PreferenceProvider.getFrontCameraVideoFrameRate()
else
PreferenceProvider.getBackCameraVideoFrameRate()
captureRequestBuilder.set(
CaptureRequest.CONTROL_MODE,
CaptureRequest.CONTROL_MODE_USE_SCENE_MODE
)
captureRequestBuilder.set(
CaptureRequest.CONTROL_SCENE_MODE,
CaptureRequest.CONTROL_SCENE_MODE_HIGH_SPEED_VIDEO
)
captureRequestBuilder.set(
CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE,
Range(fps, fps)
)
captureRequestBuilder.set(CaptureRequest.CONTROL_AE_EXPOSURE_COMPENSATION, currentExposureLevel)
updatePreview()
isRecording = true
mediaRecorder.start()
override fun onConfigureFailed(session: CameraCaptureSession)
showLog(TAG, "Failed to create CameraRecordSession!")
,
mBackgroundHandler
)
注意:确保您在 MediaRecorder Configs 中设置相同的帧速率(即 60)以获得 60fps 的视频效果。
【讨论】:
以上是关于使用 Camera2(Android 版本 21)API 录制 60fps 视频的主要内容,如果未能解决你的问题,请参考以下文章
支持 Android Camera Api 和 Camera2 Api 的问题
调用需要 API 级别 21(当前最低为 17):android.hardware.camera2.CameraDevice.StateCallback