2016-09-06 1 views
0

Мы работаем над проектом, который использует функцию предварительного просмотра Android. Мы снимаем предварительный просмотр с максимально доступным разрешением (1600 x 1200 в настоящее время).Каков наилучший способ хранения кадров предварительного просмотра Android на 30 FPS?

Требование состоит в том, чтобы сохранить каждый кадр предварительного просмотра на вторичном складе. OnPreviewFrame способен показывать предварительный просмотр при 30 FPS (около 30 миллисекунд/кадр), но когда код добавляется для сохранения данных, он ограничивает FPS.

Испытано до сих пор:

  1. Оба OnPreviewFrame и Сохранение JPEG в главном потоке. В этом случае экономия примерно составляет 250-260 миллисекунд. Таким образом, FPS становится 5-6.

  2. OnPreviewFrame в основной теме и сохранение JPEG в другом потоке. Итак, для каждого кадра создается новый поток. Он создает много, если потоки в памяти (каждый принимает около 450-500 мс для коэффициента качества 60), и когда память освобождается, в предварительном просмотре наблюдается разрыв.

Итак, есть ли там какое-либо возможное обходное решение, с помощью которого мы можем сохранить все кадры при 30 FPS?

YuvImage yuvImage = new YuvImage(data, activity.previewFormat, activity.previewWidth, activity.previewHeight, null); 
FileOutputStream fos = new FileOutputStream(this.file); 
yuvImage.compressToJpeg(new Rect(0, 0, activity.previewWidth, activity.previewHeight), 60, fos); 
fos.flush(); 
fos.close(); 

ответ

0

Вы выполняете много операций по потреблению ресурсов. некоторые из них нельзя избежать, как дисковый ввод-вывод, другие могут быть значительно уменьшены.

  1. Распределение и выделение памяти (GC) очень дорогое Задача. рассмотрите предварительное выделение 15-30 кадров и использование пула фреймов.
  2. Создание темы очень дорого. рассмотрите возможность использования одного фонового потока , который будет опробовывать некоторую очередь для кадров и возвращать рамку в кадр пул после его сохранения. (Если один поток не выполняет задачу сохранения файла вовремя, рассмотрите пул потоков, который распределяется заранее).
  3. Ввод-вывод должен выполняться в фоновом потоке, как вы предполагали.
+0

Вариант № 2 представляется выполнимым, но как мы можем реализовать Вариант №1? Буфер кадра выделяется системой Android, и ссылка используется совместно с нами. –

+0

@AmberBeriwal, вариант 1 скопируйте данные в свою память, вариант 2, если я не ошибаюсь, есть возможность предоставить камеру вашей собственной памяти с помощью addCallbackBuffer. addCallbackBuffer может служить вам в качестве пула фреймов. https://developer.android.com/reference/android/hardware/Camera.html#addCallbackBuffer (byte []) – feldi

+0

Хорошо, я проверю с помощью addCallbackBuffer и ThreadPool –

Смежные вопросы