首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用安卓Camera2接口访问ImageReader队列中的所有镜像

如何使用安卓Camera2接口访问ImageReader队列中的所有镜像
EN

Stack Overflow用户
提问于 2020-07-27 15:44:11
回答 1查看 614关注 0票数 0

在我的项目中,我需要不断地捕捉摄像头流的帧。下面是我使用的当前代码片段。

为了设置ImageReader,我将maxImages设置为20。每次触发回调时,ImageReader队列中都会有20个帧。

代码语言:javascript
复制
imageReader = ImageReader.newInstance(
            optimumSize.getWidth(),
            optimumSize.getHeight(),
            ImageFormat.YUV_420_888,
            20
);

然后访问这20个帧中的每个图像。我使用了以下代码片段。

代码语言:javascript
复制
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
    @Override
    public void onImageAvailable(ImageReader reader) {
        Image image = reader.acquireNextImage();
        while (image != null) {
            // some processing here.....
            image.close();
            image = reader.acquireNextImage();
        }
        if (image != null) {
            image.close();
        }
    }
}, processingHandler);

这里的关键障碍是能够在回调中访问20帧中的每一帧,以便进行进一步的图像处理。然而,上述代码似乎有一些问题(我只能访问底层队列中的最新图像)。事实上,我只需要访问每个帧中的一个小补丁(50x50像素),由用户指定。

这样做的原因是,我需要获得采样频率为~60 20的20个连续帧数据。如果我们在每个回调中只能访问单个帧,这似乎真的很难实现,最多只能达到30fps。

任何建议都将非常受欢迎!谢谢!

EN

回答 1

Stack Overflow用户

发布于 2020-07-29 02:04:04

将maxImages设置为20只是意味着队列将允许您同时获取20张图像;这并不意味着onImageAvailable回调将仅在20张图像排队时触发。一旦出现单个图像,该回调就会触发。

大多数相机设备的最高速度是30fps,所以你看到的速度并不令人惊讶。有些摄像头确实有60fps的模式,但你必须明确地切换到(60,60)的CONTROL_AE_TARGET_FPS_RANGE才能获得,而且只有当设备的CONTROL_AE_AVAILABLE_TARGET_FPS_RANGE值包含该范围时才能实现。

60fps也可能是分辨率受限的(如果你想仔细检查,请检查StreamConfigurationMap的最小帧持续时间,以了解哪些分辨率可以支持60fps )。

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

https://stackoverflow.com/questions/63110826

复制
相关文章

相似问题

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