Android 中的 ImageReader 需要很长时间才能使一帧可用

ImageReader in Android needs too long time for one frame to be available

我正在开发一个 Android 应用程序,我在其中使用 ImageReader 从 Surface 获取图像。当我在 Lollipop 版本中录制屏幕时,表面的数据是从 VirtualDisplay 获得的。问题是图像以非常低的速率 (1 fps) 可用(调用 OnImageAvailableListener.onImageAvailable() 函数)。当我尝试将 MediaEncoder 与此表面一起用作输入表面时,输出视频在 30fps 下看起来很流畅。 有什么建议让我读取高帧率的表面图像数据吗?

            ImageReader imageReader = ImageReader.newInstance(width, height, PixelFormat.RGBA_8888, 2);
            mImageReader.setOnImageAvailableListener(onImageListener, null);
            mVirtualDisplay = mMediaProjection.createVirtualDisplay("VideoCap",
                mDisplayWidth, mDisplayHeight, mScreenDensity,
                DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
                imageReader.getSurface(), null /*Callbacks*/, null /*Handler*/);

               //
               //

               OnImageAvailableListener onImageListener = new OnImageAvailableListener() {

    @Override
    public void onImageAvailable(ImageReader reader) {
        // TODO Auto-generated method stub
        if(reader != mImageReader)
            return;
        Image image = reader.acquireLatestImage();
        if(image == null)
            return;

        // do some stuff

        image.close();
      }
    };

当我切换到另一种格式时,FPS 大幅增加:

mImageReader = ImageReader.newInstance(mVideoSize.getWidth(), mVideoSize.getHeight(), ImageFormat.YUV_420_888, 2);

希望对您有所帮助。

我发现除了 select 使用 YUV 格式外,我还必须 select 设备可用的最小图像尺寸才能显着提高速度。