如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?

Posted

技术标签:

【中文标题】如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?【英文标题】:How can I get each frame in camera2 api in android studio like PreviewCallback in camera api and ImageAnalysis.Analyzer in camerax? 【发布时间】:2021-04-20 18:09:47 【问题描述】:

如何在 android studio 中获取 Camera2 api 中的每一帧,例如 Camera api 中的 PreviewCallback 和 Camerax 中的 ImageAnalysis.Analyzer?我查看了其他问题,但他们没有正确回答我的问题。

【问题讨论】:

你能详细解释一下吗? 【参考方案1】:

基本上,使用ImageReader。为 YUV_420_888 配置它,并让它的 Surface 用作相机会话配置的一部分。

然后将其 Surface 包含在您发送到相机的每个 CaptureRequest 中,并在 ImageReader.OnImageAvailableListener() 中处理新帧。

【讨论】:

能否给我看一些代码示例? 您可以在 Google 的 Camera2Basic (github.com/googlearchive/android-Camera2Basic/blob/master/…) 示例中看到使用 ImageReader 进行 JPEG 仍然捕获的基础知识。要在每一帧都使用它,请改用 YUV_420_888,并将 ImageReader Surface 包含在重复的预览请求中,而不仅仅是静态捕获请求。【参考方案2】:

试试下面的代码。

val surface: Surface = imageReader.surface
val captureRequest = camera.createCaptureRequest(
CameraDevice.TEMPLATE_PREVIEW
).apply 
addTarget(surface)
addTarget(fragmentCameraBinding.viewFinder.holder.surface)

// This will keep sending the capture request as frequently as possible 
until the session is torn down or session.stopRepeating() is called

session.setRepeatingRequest(captureRequest.build(), null, cameraHandler)
imageReader.setOnImageAvailableListener( reader ->
val image = reader.acquireLatestImage()
Log.d(TAG, "Image available in queue: $image.timestamp")
image.close()
, imageReaderHandler)

【讨论】:

以上是关于如何在android studio中获取camera2 api中的每一帧,例如camera api中的PreviewCallback和camerax中的ImageAnalysis.Analyzer?的主要内容,如果未能解决你的问题,请参考以下文章

如何解决 JSONArray 问题,无法获取数据,Android Studio

Twitter 如何在 Android Studio 中使用 Fabric 插件获取用户个人资料图片

如何在 Android Studio 中使用 Kotlin 从 Firebase 中的数据库中获取特定值?

如何在 Android Studio 上获取 Sqlite 数据库中插入数据的实时视图

android studio如何获取SHA1(Win+Mac)

如何获取 android studio 组件(按钮、文本等)大小(宽度、高度或默认大小)