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 设备可用的最小图像尺寸才能显着提高速度。
我正在开发一个 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 设备可用的最小图像尺寸才能显着提高速度。