Camera 2 API可同时预览,记录和提取预览帧以进行Firebase人脸检测处理

时间:2019-01-08 12:16:38

标签: android face-detection android-camera2

我的用例是当用户开始录制视频时,我需要录制视频,还需要使用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())的功能? Camera 2 API?

2 个答案:

答案 0 :(得分:0)

请参见 Android camera2 api. Setting multiple ImageReader surfaces gives blank output 并在此处进行评论。

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

答案 1 :(得分:0)

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

一次可以设置多少个同时输出以及以何种分辨率设置也有限制。这些取决于支持的硬件级别和相机设备功能。有关这些表,请参见createCaptureSession的文档。