当前位置: 首页 > 面试题库 >

Android camera2捕获连拍太慢

袁鸿达
2023-03-14
问题内容

我正在尝试修改android-Camera2Basic代码以捕获一连串的图片。但是,在运行L 5.0.1的Nexus
5上,图片之间的延迟不会超过200-300ms。

我已经尝试了很多东西,但这是最基本的。这是我修改过的Camera2Basic代码的唯一部分。我的预览TextureView只有50x50dp,但这没关系,对吧?

就其价值而言,此代码在我的Nexus 6(带有L 5.1)上仅能延迟50-100毫秒。

private void captureStillPicture() {
    try {
        List<CaptureRequest> captureList = new ArrayList<CaptureRequest>();
        mPreviewRequestBuilder.addTarget(mImageReader.getSurface());

        for (int i=0;i<10;i++) {
            captureList.add(mPreviewRequestBuilder.build());
        }

        mCaptureSession.stopRepeating();
        mCaptureSession.captureBurst(captureList, cameraCaptureCallback, null);
        mPreviewRequestBuilder.removeTarget(mImageReader.getSurface());
    } catch (CameraAccessException e) {
        e.printStackTrace();
    }
}

CameraCaptureSession.CaptureCallback cameraCaptureCallback = new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request,
            TotalCaptureResult result) {
        Log.d("camera","saved");
        mPictureCounter++;
        if (mPictureCounter >= 10)
            unlockFocus();
    }
};

问题答案:

您遇到的问题是您所请求的图像输出格式的伪像。JPEG编码过程将大量的停顿时间加在相机管线上,因此在一次曝光结束与下一次曝光之间(这种编码发生时)会有很多停机时间。

引用的30fps速率可以通过将输出图像格式设置ImageReader为YUV来实现,因为这是相机的“本机”输出。这将是在捕获图像时存储图像的一种方式,然后您将必须随后进行JPEG编码,这与相机的内联处理是分开的。

例如,在Nexus
5上JPEG,您一直在观察的编码输出停顿时间为243ms。对于YUV_420_888输出,它是0毫秒。同样,由于其尺寸较大,RAW_SENSOR编码会引入200ms的停顿时间。

还请注意,即使通过选择“更快”的格式消除了停顿时间障碍,根据输出图像的大小,仍然有最短的帧时间。但是,对于Nexus
5的全分辨率输出,这是33ms,这正是您所期望的。

相关信息位于相机元数据的StreamConfigurationMap对象中,在此处。请查看getOutputStallDuration(int format, Size size)getOutputMinFrameDuration(int format, Size size)方法进行确认。



 类似资料:
  • 我正在开发一个android应用程序,我需要从应用程序中获取图像捕获,并返回捕获<code>uri < code > uri = data . get data(); 此外,我尝试从位图中获取uri,如下所示: 但仍然不起作用。 我错过了什么?谢谢!

  • 当我的WooCommerce购物车页面为空时,我会在页面上出现此错误,我如何消除此错误消息? 致命错误:未捕获的ArgumentCountError:参数太少,无法执行wc_get_page_id(),0在第30行 /home/s3morder/public_html/wp-content/themes/Intranet主题/伍兹商业/购物车/cart-empty.php中传递,而在 /home/

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: Java新手问题: 我需要捕获由第三方组件写入printStream的文本。 PrintStream默认为System.err,但可以更改为另一个PrintStream。 查看文档,我找不到将PrintStream的内容定向到字符串编写器/缓冲区的简单方法。 有人可以帮忙吗? 问题答案:

  • 拍拍客 我们喜欢随手拍一拍,大多数照片没有特殊意义,偶尔也会看一看。我们是——————拍拍客! 1、功能 通过微信公共账号(以后会添加来往、易信等)发送图片。采用显示3D照片墙,共有4中样式分别如下 1.1 照片墙 1.2 水晶球 1.3 螺旋塔 1.4 展览厅 2、产品特点 2.1 绚丽 采用Three.js的3D样式,打破了传统照片墙单调乏味的风格 2.2 互动 +   通过微信就可以上传图片

  • export class SearchService { ... .map((response) => response.json()) .catch((e) => { if (e.status >== 500) { return cachedVersion(); new Error(`${ e.status