2

我创建的 SD 卡上有太多(100 个)高分辨率(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 到任何图像,并且可以在位图上应用各种过滤器。

我期待一些专家解决方案以特定帧速率加载快速图像。

4

2 回答 2

2

除非你有一张超快的卡,否则你不会有任何运气从 SD 卡加载它们。普通卡的读取速度通常不会超过 10 MB/s。您始终可以计算需要预加载多少帧并在播放其余帧时加载,但我不会为您执行此操作,因此我建议使用:

android:largeHeap="true" 

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

编辑:

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

  1. 加载 x(取决于 FPS 和要播放的帧数)秒的图像
  2. 计算它加载 1 个图像的速度(可能需要保存它并考虑旧的加载速度以及稳健性)
  3. 计算你还需要加载多少:(nFramesToPlay-nLoadedFrames-FPS/(loadSpeed*1.2)*nFramesToPlay使用任意 1.2 进行实验。如果读取时间波动很大,则增加它,反之亦然)。

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

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

于 2013-10-26T11:02:20.373 回答
0

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

您通常可以减少 50 – 70% 的图像尺寸,而不会明显降低质量。他们甚至为您提供了一个小的滑动预览窗格,以便您可以看到之前和之后,这样您就可以看到质量上的差异。

于 2013-10-26T11:27:58.030 回答