我在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的图像,并且可以在位图上应用各种过滤器。
我希望有一些专家解决方案来加载特定帧速率的快速图像。
答案 0 :(得分:2)
除非你有超快卡,否则从SD卡装载它们不会有任何好运。普通卡通常不会具有比10 MB / s更快的读取速度。您可以随时计算预加载所需的帧数,并在播放时加载其余帧,但我不打算为您执行此操作,因此我建议使用:
android:largeHeap="true"
在清单中的application-tag中。这有助于增加应用程序的堆大小。
编辑:
如果您可以允许为帧导航显示高度压缩的图像,则可以将所有内容保留在内存中(如果需要!),并在播放时和用户停在帧时根据需要动态加载完整图像。一个简单的缓冲策略:
nFramesToPlay-nLoadedFrames-FPS/(loadSpeed*1.2)*nFramesToPlay
(试验任意1.2。如果读取时间波动很大,增加它,反之亦然)。 你必须确保在后台加载图像,可能同时加载几个(试验看它是否有帮助)。如果阅读时间非常慢,那么这种策略可能会造成更大的伤害。
我还建议使用ActivityManager.getMemoryInfo()
并告诉用户您是否认为它不会成功播放视频(告诉他们获得更好的SD卡/手机/更多内存/更少FPS)。
答案 1 :(得分:0)
您可以使用"largeHeap"
按照上面的建议进行操作。
另一种方法是压缩图像。您可以免费压缩图像here。
您通常可以放松50-70%的图像尺寸而不会有明显的质量损失。 它们甚至会为您提供一个小的滑动预览窗格,以便您可以看到之前和之后的内容,以便您可以看到质量上的差异。