Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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();
      }
    };
like image 255
nhanndt Avatar asked Aug 30 '25 17:08

nhanndt


1 Answers

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.

like image 146
umnix Avatar answered Sep 09 '25 11:09

umnix