Люди,Image.getPlanes() на Android слишком тяжелый
Я разрабатываю приложение для захвата экрана на Android с использованием API MediaProjection.
Я использую ImageReader, чтобы реализовать его, но Image.getPlanes() слишком тяжел для захвата экрана в реальном времени.
Он потерял слишком много кадров, чтобы увидеть гладкий экран, с которого Image.getPlanes() блокирует основную нить. Когда я прокомментировал это, ImageReader получает много изображений, чем раньше.
Я не могу сделать Image.getPlanes() в фоновом режиме, так как onImageAvailable вызывается после вызова Image.close().
Итак, мои вопросы:
- Почему Image.getPlanes() так тяжело?
- Есть ли способ реализовать плавный захват экрана?
Код выглядит следующим образом.
public void onImageAvailable(ImageReader reader) {
try {
Image img = reader.acquireLatestImage();
//Too heavy!!
Image.Plane[] planes = img.getPlanes();
/* Do something */
img.close();
}catch (Exception e){
setImageReader();
}
}
Благодарим за помощь!
Вопрос обновленный
//Background process example
@Override
public void onImageAvailable(ImageReader reader) {
try {
final Image img = reader.acquireLatestImage();
new Thread(new Runnable() {
@Override
public void run() {
Image.Plane[] planes = img.getPlanes();
/* Do something */
img.close();
//onImageAvailable is no called Until here.
//Because ImageReader is locked from ImageReader.acquireLatestImage() to Image.close()
}
}).start();
}catch(Exception e){}
}
Проверьте пример, как выполнить эту тяжелую операцию на фоне http://www.programcreek.com/java-api-examples/index.php?source_dir=LiveMultimedia-master/app/src/main/java/com/ constantinnovationsinc/livemultimedia/cameras/LollipopCamera.java –
onImageAvailable() не вызывается (заблокирован) до тех пор, пока не вызовет событие Image.close(), хотя оно запущено на фоне. –
Извините, я думал, что это простой случай. У меня мало опыта –