我对Camera2框架很陌生,并试图理解创建捕获会话的逻辑。
我需要一个简单的东西-预览和录制视频。我还想在开始录制视频时设置正确的方向提示。但我遇到了鸡/蛋的问题。
以下是我的逻辑:
为了开始录音,我要这样做:
val recordRequest = session.device.createCaptureRequest(CameraDevice.TEMPLATE_RECORD).apply {
// Add the preview and recording surface targets
addTarget(viewFinder.holder.surface)
addTarget(recorder.surface)
}.build()
session.setRepeatingRequest(recordRequest, null, cameraHandler)
recorder.setOrientationHint(it) // NOT allowed after getSurface()!
recorder.prepare() // NOT allowed after getSurface()!
recorder.start()但是,当我在上面添加目标时,我已经调用了recorder.surface (或getSurface())。人们可以认为,我可以准备然后添加目标,然而,文档 for addTarget()说,增加的曲面必须是最近调用addTarget()时包含的曲面之一
这就引出了一个有趣的问题。每当我打开应用程序,我需要创建捕捉会话开始预览相机图像。然而,在创建的时候,createCaptureSession()需要包括--未来捕获请求中将出现的所有曲面--。这意味着,我也需要包括记录表面,即使我只是打开相机还没有记录。我怎样才能得到这个Surface来记录?文档说我可以从MediaRecorder或者MediaCodec那里得到它。我想从MediaRecorder获得它,因为我想使用CamcorderProfiles。但是,正如我在上面的代码中所显示的那样,一旦我在会话创建点从记录器获得了这个表面,我就不能在开始记录时在中做任何更改,比如设置方向提示。
官方的Camera2Video示例应用程序有一个窍门--它使用createPersistentInputSurface,但是在他们的示例中,相机是固定的,这样他们就可以为它分配足够的内存,并在整个应用程序生命周期中使用这个表面。
如何解决这一问题?我是不是误解了这里的概念?当我开始录制的时候,当我打开相机预览的时候,我如何在稍后的时候创建录音机,但是我仍然有它的表面创建的更早?
发布于 2020-05-07 20:56:52
使用持久输入面是正确的方法。一旦您知道了记录的方向,就创建一个新的MediaRecorder,并使用持久输入面设置它的surface。
这正是Camera2Video示例所做的,也是
// React to user touching the capture button
capture_button.setOnTouchListener { view, event ->
when (event.action) {
MotionEvent.ACTION_DOWN -> lifecycleScope.launch(Dispatchers.IO) {
// Prevents screen rotation during the video recording
requireActivity().requestedOrientation =
ActivityInfo.SCREEN_ORIENTATION_LOCKED
// Start recording repeating requests, which will stop the ongoing preview
// repeating requests without having to explicitly call `session.stopRepeating`
session.setRepeatingRequest(recordRequest, null, cameraHandler)
// Finalizes recorder setup and starts recording
recorder.apply {
// Sets output orientation based on current sensor value at start time
relativeOrientation.value?.let { setOrientationHint(it) }
prepare()
start()
}recorder是用一个较早创建的持久曲面创建的:
/** Saves the video recording */
private val recorder: MediaRecorder by lazy { createRecorder(recorderSurface)
}当你说相机是固定的,你指的是应用程序方向被修复,还是样本不支持切换前/后摄像头?对于持久化的曲面,这些都不应该特别重要;如果需要的话,您可以在切换相机或改变方向时创建一个新的曲面。
https://stackoverflow.com/questions/61626653
复制相似问题