加载太多 JPEG 文件(100 秒的 )会导致内存不足错误



我在创建的SD卡上有太多(100s)高分辨率(1200x800)JPEG。

我现在正在做的是将它们全部加载到线程中并将它们保存在 数组列表 .

我以用户在UI上选择的特定帧速率逐帧在图像视图上播放它们。我打算在这里加载所有图像,因为我想在 55 fps 左右非常快速地播放它们。如果我有 1 组 100 张图像和 RAM = 1 GB 的平板电脑,那工作正常,但我有两个图像查看器,它们都有自己的一组(100 JPEGS),它会耗尽内存。

我为我的解决方案尝试了很多方法.这是我到目前为止尝试过的。

1 ) SD卡上JPEG的FFMPEG视频编码(它不起作用,因为用户将寻求100图像的任何位置,并且应该立即在屏幕上查看,我也正在图像上应用亮度对比度等滤镜,因此FFMPEG将无法在其中工作)

2)在播放时将单个文件加载为位图(它不起作用,因为我想实现高帧速率并且文件需要时间来加载)

3)我现在正在使用的第三种方法现在对我很好,但是(内存不足问题,因为我有两个图像视图及其图像集(每个100个图像))它正在加载ArrayList中的所有图像,用户可以尽可能快地使用搜索栏搜索任何图像,并且可以在位图上应用各种过滤器。

我希望有一些专家解决方案可以以特定帧速率加载快速图像。

除非您有超快速的卡,否则您不会有任何运气从SD卡加载它们。普通卡的读取速度通常不会超过 10 MB/s。您始终可以计算出在播放时需要预加载和加载其余帧的数量,但我不会为您这样做,所以我建议使用:

android:largeHeap="true" 

在清单中的应用程序标记中。这对增加应用的堆大小有很大帮助。

编辑:

如果您允许显示帧导航的高度压缩图像,则可以将所有图像保留在内存中(如有必要!),并在播放时和用户停在帧处时根据需要动态加载完整图像。 一个简单的缓冲策略:

  1. 加载x(取决于FPS和要播放的帧数)第二值的图像
  2. 计算它加载
  3. 1 张图像的速度(可能希望保存它并考虑较旧的加载速度以及鲁棒性)
  4. 计算你还需要加载多少:nFramesToPlay-nLoadedFrames-FPS/(loadSpeed*1.2)*nFramesToPlay(试验任意 1.2。如果读取时间波动很大,请增加它,反之亦然)。

您必须确保在后台加载图像,也许同时加载多个图像(实验看看是否有帮助)。如果阅读时间真的很慢,这种策略可能弊大于利。

我还建议使用ActivityManager.getMemoryInfo()并告诉用户您是否认为它不会成功播放视频(告诉他们获得更好的SD卡/手机/更多内存/更少的FPS)。

您可以使用

"largeHeap"按照上面的建议进行操作。另一种方法是压缩图像。您可以在此处免费压缩图像。

您通常可以丢失图像大小的 50 – 70%,而不会明显降低质量。他们甚至为您提供了一个小的滑动预览窗格,因此您可以查看之前和之后,以便您可以看到质量差异。

最新更新