【问题标题】:Camera 2 API to Preview, Record and Extract the preview frame to Firebase face detection processing simultaneouslyCamera 2 API 用于同时预览、记录和提取预览帧到 Firebase 人脸检测处理
【发布时间】:2019-06-03 03:16:53
【问题描述】:

我的用例是当用户开始录制视频时,我需要录制视频并使用 Firebase 人脸检测处理帧内用户脸部的预览帧。我已尝试按照以下方式进行操作,但某些预览已暂停。

我正在使用googlesamples/android-Camera2Video 代码库,并在其中添加了以下代码。

Camera2VideoFragment 类内部:

private ImageReader mYUVImageReader;
private final ImageReader.OnImageAvailableListener mOnYUVImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

   @Override
   public void onImageAvailable(ImageReader reader) {
        Log.d(Camera2VideoFragment.TAG, "Bipin - onImageAvailable ");
   }
}

openCamera 方法内部:

mYUVImageReader = ImageReader
                    .newInstance(mPreviewSize.getWidth()/16, mPreviewSize.getHeight()/16,ImageFormat.YUV_420_888, 2);
            mYUVImageReader.setOnImageAvailableListener(
                    mOnYUVImageAvailableListener, mBackgroundHandler);

startRecording 方法内部:

   Surface imageSurface = mYUVImageReader.getSurface();
   surfaces.add(imageSurface);
   mPreviewBuilder.addTarget(imageSurface);

我也尝试在 startPreview 中设置imageSurface 但没有运气,面对相同的预览仍然存在问题。请提供您的意见或纠正我关于这种情况的最佳方法是什么?

此处的演示应用代码:https://github.com/bipinvaylu/Camera2Demo/tree/bipin

更新日期:[2019 年 1 月 10 日] 我已将其重命名为 mYUVImageReader,请在此处查找详细信息: 初始化:https://github.com/bipinvaylu/Camera2Demo/blob/bipin/app/src/main/java/com/camerademo/Camera2VideoFragment.java#L477 在此处添加 ImageReaderSurface:https://github.com/bipinvaylu/Camera2Demo/blob/bipin/app/src/main/java/com/camerademo/Camera2VideoFragment.java#L540

我主要关心的是,是否可以通过使用同时向预览表面 (mTextureView.getSurfaceTexture())、记录 (mMediaRecorder.getSurface()) 和连续图像 (mYUVImageReader.getSurface()) 提供输出相机 2 API?

【问题讨论】:

    标签: android face-detection android-camera2


    【解决方案1】:

    Android camera2 api. Setting multiple ImageReader surfaces gives blank output 和那里的 cmets。

    那里的代码基本上是正确的,除了 Ryan 尝试将捕获格式设置为 JPEG:这不起作用,但 YUV_420_888 可以工作。 另一个问题是这不适用于 LEGACY 相机。

    【讨论】:

    • 是的,我正在使用 YUV_420_888,但预览仍然冻结。我找到了您提到的设备硬件类别列表。 tobias-weis.de/projects/camera2probe
    • 您不需要外部列表来检查您的设备是否必须支持多个表面才能进行捕获会话。另外,请注意,您链接的表格是查询相机 API 的结果——因此,我预计会有很多不一致之处,API 报告错误的答案。
    • 您好,我们可以添加的 Surface 数量是否有限制?因为我在日志中没有收到任何错误。预览只是冻结。
    • 是的,表面的数量、它们的格式和 evensong 大小是有限的。 createCaptureSession 参考中的表格显示了其中一些限制。不幸的是,一些不受支持的情况不会产生可靠的日志
    【解决方案2】:

    您还需要将新的 ImageReader Surface 添加到捕获会话创建中。您不能在捕获请求构建器中包含 Surface,除非它也包含在会话中。

    同时设置的同时输出数量以及分辨率也有限制。这些取决于支持的硬件级别和相机设备功能。有关这些表格,请参阅createCaptureSession 的文档。

    【讨论】:

    • 我已经调用了 CameraCaptureSession.StateCallback 类的 ImageReader 表面 onConfigured。现在,我面临这样的不同错误:01-09 13:17:02.634 19387-19406/? E/AndroidRuntime: FATAL EXCEPTION: CameraBackground Process: com.camerademo, PID: 19387 java.lang.IllegalArgumentException: CaptureRequest contains unconfigured Input/Output Surface!
    • 我已经在这里推送了我的演示应用代码:github.com/bipinvaylu/Camera2Demo/tree/bipin
    • 我在该代码的任何地方都没有看到 mRawImageReader。乍一看,Camera2VideoImageActivity 中的代码在创建会话时需要包含 mImageReader 方面看起来不错。
    • 谢谢,是的,它就在那里,我已经用正确的链接更新了问题。
    • 请提供您对Camera2VideoFragment类的反馈。我有所有的测试代码。
    猜你喜欢
    • 2018-02-05
    • 1970-01-01
    • 2017-06-25
    • 1970-01-01
    • 2013-11-14
    • 1970-01-01
    • 2023-01-22
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多