Наши реализации, использующие Media Projection API, работают нормально. Но мы часто теряем кадры, пытаясь записать отснятые изображения в файлы. Даже если весь io-код выполняется в отдельных потоках.
Мы хотели сделать некоторый онлайн-анализ изображений на захваченных кадрах, поэтому мы не можем использовать запись экрана или подобные инструменты.
Есть ли способ вызвать методы Android Media Projection из собственного кода? Для повышения производительности?
Мы даже старались не вызывать никаких операций ввода-вывода в процессе захвата. Мы сохранили все в памяти до конца. Но у нас все еще есть проблемы с пропущенными кадрами при 30 кадрах в секунду. Как мы можем этого избежать?
try {
image = mImageReader.acquireLatestImage();
if (image != null) {
Image.Plane[] planes = image.getPlanes();
ByteBuffer buffer = planes[0].getBuffer();
int pixelStride = planes[0].getPixelStride();
int rowStride = planes[0].getRowStride();
int rowPadding = rowStride - pixelStride * mWidth;
String.valueOf(pixelStride) + " -- rowStride: " + String.valueOf(rowStride) + " rowPadding: " + String.valueOf(rowPadding));
// create bitmap
if(mBitmap==null || rowPadding != mRowPadding || pixelStride != mPixelStride) {
mRowPadding = rowPadding; mPixelStride = pixelStride;
mBitmap = Bitmap.createBitmap(mWidth + rowPadding / pixelStride, mHeight, Bitmap.Config.ARGB_8888);
}
mBitmap.copyPixelsFromBuffer(buffer);
Bitmap myBitmap = Bitmap.createScaledBitmap(mBitmap, (mWidth + rowPadding / pixelStride) / 16, mHeight / 16, false);
ramStorage.add(myBitmap);