Мы работаем над проектом, который использует функцию предварительного просмотра Android. Мы снимаем предварительный просмотр с максимально доступным разрешением (1600 x 1200 в настоящее время).Каков наилучший способ хранения кадров предварительного просмотра Android на 30 FPS?
Требование состоит в том, чтобы сохранить каждый кадр предварительного просмотра на вторичном складе. OnPreviewFrame
способен показывать предварительный просмотр при 30 FPS (около 30 миллисекунд/кадр), но когда код добавляется для сохранения данных, он ограничивает FPS.
Испытано до сих пор:
Оба
OnPreviewFrame
и Сохранение JPEG в главном потоке. В этом случае экономия примерно составляет 250-260 миллисекунд. Таким образом, FPS становится 5-6.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();
Вариант № 2 представляется выполнимым, но как мы можем реализовать Вариант №1? Буфер кадра выделяется системой Android, и ссылка используется совместно с нами. –
@AmberBeriwal, вариант 1 скопируйте данные в свою память, вариант 2, если я не ошибаюсь, есть возможность предоставить камеру вашей собственной памяти с помощью addCallbackBuffer. addCallbackBuffer может служить вам в качестве пула фреймов. https://developer.android.com/reference/android/hardware/Camera.html#addCallbackBuffer (byte []) – feldi
Хорошо, я проверю с помощью addCallbackBuffer и ThreadPool –