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

时间:2013-10-26 10:45:31

标签: java android image image-processing

我在SD卡上创建了太多(100x)高分辨率(1200x800)JPEGS。

我现在正在做的是在Thread中加载它们并将它们保存在ArrayList中。

我按照用户在UI上选择的特定帧速率逐帧播放图像。 我的意图是加载所有图像,因为我想以55 fps的速度快速播放它们。 如果我有1套100图像和RAM = 1 GB的平板电脑,但是我有两个图像查看器,它们都有自己的(100 JPEGS),它会内存不足。

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

1)在SDCard上对JPEGS进行FFMPEG视频编码(因为用户将寻找100个图像的任何位置,它应该立即在屏幕上查看,我也在图像上应用亮度对比度等滤镜,因此FFMPEG不会在那里工作)

2)将单个文件作为位图加载(因为我想要实现高帧速率和文件需要时间来加载)

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

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

2 个答案:

答案 0 :(得分:2)

除非你有超快卡,否则从SD卡装载它们不会有任何好运。普通卡通常不会具有比10 MB / s更快的读取速度。您可以随时计算预加载所需的帧数,并在播放时加载其余帧,但我不打算为您执行此操作,因此我建议使用:

android:largeHeap="true" 

在清单中的application-tag中。这有助于增加应用程序的堆大小。

编辑:

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

  1. 加载x(取决于FPS和要播放的帧数)第二个值图像
  2. 计算加载1张图片的速度(可能需要保存并考虑较旧的加载速度以及稳健性)
  3. 计算你需要加载多少:nFramesToPlay-nLoadedFrames-FPS/(loadSpeed*1.2)*nFramesToPlay(试验任意1.2。如果读取时间波动很大,增加它,反之亦然)。
  4. 你必须确保在后台加载图像,可能同时加载几个(试验看它是否有帮助)。如果阅读时间非常慢,那么这种策略可能会造成更大的伤害。

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

答案 1 :(得分:0)

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

您通常可以放松50-70%的图像尺寸而不会有明显的质量损失。 它们甚至会为您提供一个小的滑动预览窗格,以便您可以看到之前和之后的内容,以便您可以看到质量上的差异。