Каков наилучший способ хранить кадры предварительного просмотра Android на 30 FPS?
Мы работаем над проектом, который использует функцию предварительного просмотра Android. Мы делаем предварительный просмотр в максимально доступном разрешении (1600 x 1200 в настоящее время).
Требование - сохранять каждый кадр предварительного просмотра на вторичном хранилище. OnPreviewFrame
способен выдавать предварительный просмотр со скоростью 30 FPS (около 30 миллисекунд / кадр), но когда код добавляется для сохранения данных, он ограничивает FPS.
Проверено до сих пор:
И то и другое
OnPreviewFrame
и сохранение JPEG в главном потоке. В этом случае экономия примерно занимает 250-260 миллисекунд. Итак, FPS становится 5-6.OnPreviewFrame
в основном потоке и сохранение JPEG в другом потоке. Итак, для каждого кадра создается новый поток для сохранения. Он создает много, если потоки в памяти (каждая занимает около 450-500 мс для показателя качества 60) и когда память освобождается, в предварительном просмотре наблюдается разрыв.
Итак, есть ли возможный обходной путь, с помощью которого мы можем сохранить все кадры со скоростью 30 кадров в секунду?
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();
1 ответ
Вы делаете много ресурсоемких операций. некоторых нельзя избежать, как, например, дисковый ввод-вывод, другие могут быть значительно сокращены.
- Распределение и освобождение памяти (GC) является очень дорогой задачей. рассмотрите возможность предварительного выделения 15-30 кадров и использования пула кадров.
- Создание темы очень дорого. рассмотрите возможность использования одного фонового потока, который будет опрашивать некоторую очередь на наличие кадров и возвращать кадр в пул кадров после его сохранения. (Если отдельный поток не справляется с задачей сохранения файла вовремя, рассмотрите пул потоков, которые выделены заранее).
- Ввод / вывод должен выполняться в фоновом потоке, как вы предложили.