Android Camera2在处理帧时拍照

时间:2017-10-13 13:48:49

标签: android android-camera2

我正在使用Camera2 API创建一个可以扫描条形码的相机组件,并且能够在扫描过程中拍照。它有点工作,但预览是闪烁的 - 看起来像以前的帧,有时绿色帧正在中断实时预览。

我的代码基于Google的Camera2Basic。我只是再添加一个ImageReader及其表面作为CaptureRequest.Builder的新输出和目标。其中一个读者使用JPEG和另一个YUV。当我从输出中删除JPEG阅读器的表面时,闪烁消失(不将其传递到createCaptureSession)。

有很多代码,所以我创建了一个要点:click - 试图摆脱完全不相关的代码。

3 个答案:

答案 0 :(得分:1)

您正在LEGACY级设备上测试设备吗?

如果是这样,任何针对JPEG输出的捕获都可能会慢得多,因为它们可以运行预捕获序列,并且可能会暂时暂停预览。

但它不应该导致绿色帧,除非有设备级错误。

答案 1 :(得分:0)

如果有人在努力解决这个问题。 docs中有表格显示如果指定了3个目标,YUV ImageReader可以使用最大尺寸等于预览尺寸的图像(最大1920x1080)。减少这个有帮助!

答案 2 :(得分:0)

是的,你可以。假设您配置预览以向ImageReader提供YUV帧(因为您也可以将JPEG放在那里,请检查它),如下所示:

mImageReaderPreview = ImageReader.newInstance(mPreviewSize.getWidth(), mPreviewSize.getHeight(), ImageFormat.YUV_420_888, 1);

您可以在OnImageAvailable侦听器中处理这些帧:

@Override
public void onImageAvailable(ImageReader reader) {
    Image mImage = reader.acquireNextImage();
    if (mImage == null) {
        return;
    }

    try {

// Do some custom processing like YUV to RGB conversion, cropping, etc.

        mFrameProcessor.setNextFrame(mImage));
        mImage.close();
    } catch (IllegalStateException e) {
        Log.e("TAG", e.getMessage());
}