首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android Camera2会话创建逻辑

Android Camera2会话创建逻辑
EN

Stack Overflow用户
提问于 2020-05-06 03:04:42
回答 1查看 208关注 0票数 1

我对Camera2框架很陌生,并试图理解创建捕获会话的逻辑。

我需要一个简单的东西-预览和录制视频。我还想在开始录制视频时设置正确的方向提示。但我遇到了鸡/蛋的问题。

以下是我的逻辑:

为了开始录音,我要这样做:

代码语言:javascript
复制
    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,但是在他们的示例中,相机是固定的,这样他们就可以为它分配足够的内存,并在整个应用程序生命周期中使用这个表面。

如何解决这一问题?我是不是误解了这里的概念?当我开始录制的时候,当我打开相机预览的时候,我如何在稍后的时候创建录音机,但是我仍然有它的表面创建的更早?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-07 20:56:52

使用持久输入面是正确的方法。一旦您知道了记录的方向,就创建一个新的MediaRecorder,并使用持久输入面设置它的surface。

这正是Camera2Video示例所做的,也是

代码语言:javascript
复制
        // 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是用一个较早创建的持久曲面创建的:

代码语言:javascript
复制
    /** Saves the video recording */
    private val recorder: MediaRecorder by lazy { createRecorder(recorderSurface) 
    }

当你说相机是固定的,你指的是应用程序方向被修复,还是样本不支持切换前/后摄像头?对于持久化的曲面,这些都不应该特别重要;如果需要的话,您可以在切换相机或改变方向时创建一个新的曲面。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61626653

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档