public void initRecorder() {
setupDynamicOverlay();
MediaProjection.Callback callback = new MediaProjection.Callback() {
@Override
public void onStop() {
super.onStop();
stopScreenCapture();
}
};
mediaProjection.registerCallback(callback, null);
if (mVirtualDisplay != null) {
mVirtualDisplay.release();
mVirtualDisplay = null;
}
int[] boundsRes = getBounds();
int width = boundsRes[0];
int height = boundsRes[1];
mVirtualDisplay = mediaProjection.createVirtualDisplay(
"ScreenCapture",
width == 0 ? DisplayMetrics.DENSITY_DEFAULT : width,
height == 0 ? DisplayMetrics.DENSITY_DEFAULT : height,
dpi,
DisplayManager.VIRTUAL_DISPLAY_FLAG_AUTO_MIRROR,
surface,
null,
handler
);
}
public void initImageReader() {
handlerThread = new HandlerThread("ImageProcessor");
handlerThread.start();
handler = new Handler(handlerThread.getLooper());
int[] boundsRes = getBounds();
imageReader = ImageReader.newInstance(
boundsRes[0],
boundsRes[1],
PixelFormat.RGBA_8888,
2
);
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireLatestImage();
if (image != null) {
Bitmap bitmap = imageToBitmap(image);
processImage(bitmap);
image.close();
bitmap.recycle();
// optional
saveToGalleryBitmap(bitmap);
}
}
}, handler);
surface = imageReader.getSurface();
initRecorder();
}
< /code>
Проблема в том, что ImageReader медленно прослушивает последнее изображение. Причина, по которой я это делаю, состоит в том, чтобы использовать модель ML для прогнозирования изображений с экрана пользователя (в ProcessImage ()). Тем не менее, я хочу, чтобы Imagelistener выводил изображения в режиме реального времени, чтобы некоторые кадры не были пропущены, когда слушатель работает. Я попробовал TextureView
в качестве альтернативы, но я получил предупреждение о том, что в настоящее время он не поддерживается на Android 15+ и может вызвать проблему задержки/производительности.
Как я могу оптимизировать это дальше? Существуют ли альтернативы Imagereader и TextureView, которые могут прослушать поверхность, которая также имеет обратный вызов для последних кадров?
В настоящее время я использую ImageReader для прослушивания виртуального дисплея MediaProction через поверхность: < /p> [code] public void initRecorder() { setupDynamicOverlay(); MediaProjection.Callback callback = new MediaProjection.Callback() { @Override public void onStop() { super.onStop(); stopScreenCapture(); } }; mediaProjection.registerCallback(callback, null); if (mVirtualDisplay != null) { mVirtualDisplay.release(); mVirtualDisplay = null; }
int[] boundsRes = getBounds(); int width = boundsRes[0]; int height = boundsRes[1];
public void initImageReader() { handlerThread = new HandlerThread("ImageProcessor"); handlerThread.start(); handler = new Handler(handlerThread.getLooper());
imageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() { @Override public void onImageAvailable(ImageReader reader) { Image image = reader.acquireLatestImage(); if (image != null) { Bitmap bitmap = imageToBitmap(image); processImage(bitmap); image.close(); bitmap.recycle(); // optional saveToGalleryBitmap(bitmap); } } }, handler); surface = imageReader.getSurface(); initRecorder(); } < /code> Проблема в том, что ImageReader медленно прослушивает последнее изображение. Причина, по которой я это делаю, состоит в том, чтобы использовать модель ML для прогнозирования изображений с экрана пользователя (в ProcessImage ()). Тем не менее, я хочу, чтобы Imagelistener выводил изображения в режиме реального времени, чтобы некоторые кадры не были пропущены, когда слушатель работает. Я попробовал TextureView [/code] в качестве альтернативы, но я получил предупреждение о том, что в настоящее время он не поддерживается на Android 15+ и может вызвать проблему задержки/производительности. Как я могу оптимизировать это дальше? Существуют ли альтернативы Imagereader и TextureView, которые могут прослушать поверхность, которая также имеет обратный вызов для последних кадров?