Search code examples
androidandroid-5.0-lollipopsurface

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


I am developing an Android App in which I'm using ImageReader to get image from a Surface. The surface's data is achieved from the VirtualDisplay when i record screen in Lollipop version. The problem is the image is available with very low rate (1 fps) (OnImageAvailableListener.onImageAvailable() function is invoked). When i tried to use MediaEncoder with this surface as an input surface the output video looks smooth under 30fps. Is there any suggestion for me to read the image data of surface with high fps?

            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();
      }
    };

Solution

  • FPS increased extremely when I switched to another format :

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

    Hope this will help you.