2016-08-10 15 views
0

Люди,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){} 
} 
+0

Проверьте пример, как выполнить эту тяжелую операцию на фоне http://www.programcreek.com/java-api-examples/index.php?source_dir=LiveMultimedia-master/app/src/main/java/com/ constantinnovationsinc/livemultimedia/cameras/LollipopCamera.java –

+0

onImageAvailable() не вызывается (заблокирован) до тех пор, пока не вызовет событие Image.close(), хотя оно запущено на фоне. –

+0

Извините, я думал, что это простой случай. У меня мало опыта –

ответ

0

Хорошо, я понимаю, что эмуляторы не хороши в этой операции.

Операция с моим настоящим устройством работает нормально.

Я попытаюсь найти варианты для его оптимизации.

Спасибо за помощь.