以30 FPS存储Android预览帧的最佳方法是什么?

时间:2016-09-06 07:35:52

标签: android performance preview frame-rate

我们正在开发一个利用Android预览功能的项目。我们以最大可用分辨率(目前为1600 x 1200)捕获预览。

要求是在二级存储上保存每个预览框架。 OnPreviewFrame能够以30 FPS(约30毫秒/帧)进行预览,但是当添加代码以保存数据时,它会限制FPS。

到目前为止已经过测试:

  1. 主线程中的OnPreviewFrame和保存JPEG。在这种情况下,保存大致需要250-260毫秒。因此,FPS变为5-6。

  2. 主线程中的
  3. OnPreviewFrame和另一个线程中的JPEG保存。因此,为每个帧创建一个新线程以进行保存。如果内存中的线程(每个线程的质量因子60大约需要450-500毫秒),它会创建很多内容,当释放内存时,预览中会出现间隙。

  4. 那么,有没有可能的解决方法,我们可以将所有帧保存在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();
    

1 个答案:

答案 0 :(得分:0)

您正在进行大量资源消耗操作。有些像磁盘I / O一样无法避免,其他的可以大大减少。

  1. 内存分配和解除分配(GC)非常昂贵 任务。考虑预先分配15-30帧并使用帧池。
  2. 线程创建非常昂贵。考虑使用一个后台线程 它将轮询一些队列的帧并将帧返回到帧 保存后的池。 (如果单个线程无法按时保存文件,请考虑事先分配的线程池。
  3. I / O必须在您建议的后台线程上完成。