Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载太多JPEG文件(100秒)会导致内存不足错误_Java_Android_Image_Image Processing - Fatal编程技术网

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

Java 加载太多JPEG文件(100秒)会导致内存不足错误,java,android,image,image-processing,Java,Android,Image,Image Processing,我在创建的SD卡上有太多(100秒)高分辨率(1200x800)JPEG 我现在正在做的是将它们全部加载到线程中,并将它们保存在ArrayList中 我在图像视图中以用户在UI上选择的特定帧速率逐帧播放它们。 我打算在这里加载所有图像,因为我想以55 fps左右的速度快速播放它们。 如果我有一套100张图像和RAM=1GB的平板电脑,这很好,但是我有两个图像查看器,它们都有自己的一套(100 JPEG),内存不足 我尝试了很多方法来解决问题。 以下是我到目前为止所做的尝试 1)SD卡上JPEG的

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

我现在正在做的是将它们全部加载到线程中,并将它们保存在ArrayList中

我在图像视图中以用户在UI上选择的特定帧速率逐帧播放它们。 我打算在这里加载所有图像,因为我想以55 fps左右的速度快速播放它们。 如果我有一套100张图像和RAM=1GB的平板电脑,这很好,但是我有两个图像查看器,它们都有自己的一套(100 JPEG),内存不足

我尝试了很多方法来解决问题。 以下是我到目前为止所做的尝试

1)SD卡上JPEG的FFMPEG视频编码(当用户将搜索到100图像的任何位置时,它将不起作用,并且应立即在屏幕上查看,而且我正在图像上应用诸如亮度对比度之类的过滤器,因此FFMPEG将不起作用)

2) 在播放时以位图的形式加载单个文件(这不起作用,因为我想实现高帧速率,加载文件需要时间)

3) 我现在使用的第三种方法对我来说很好,但是(内存不足,因为我有两个图像视图和它们的图像集(每个视图有100个图像)) 它将所有图像加载到ArrayList中,用户可以使用Seekbar快速搜索任何图像,并且可以对位图应用各种过滤器


我希望能找到一些专家解决方案,以特定的帧速率加载快速图像。

除非您有一张超级快速卡,否则您将无法从SD卡加载它们。普通卡的读取速度通常不会超过10 MB/s。您可以随时计算需要预加载多少帧,并在播放时加载其余帧,但我不会为您这样做,因此我建议使用:

android:largeHeap="true" 
在清单中的应用程序标记中。这对增加应用程序的堆大小有很大帮助

编辑:

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

  • 加载x(取决于FPS和播放的帧数)秒图像
  • 计算它加载1个图像的速度(可能希望保存它,并考虑较旧的加载速度,以确保健壮性)
  • 计算还要加载的数量:
    nFramesToPlay nLoadedFrames FPS/(loadSpeed*1.2)*nFramesToPlay
    (使用任意1.2进行实验。如果读取时间波动很大,则增加它,反之亦然) 您必须确保在背景中加载图像,可能同时加载多个图像(实验看看是否有帮助)。如果读取时间真的很慢,这种策略可能弊大于利


    我还建议使用并告诉用户,如果您认为它无法成功播放视频(告诉他们获得更好的SD卡/手机/更多内存/更少FPS)。

    您可以按照上面的建议使用
    “largeHeap”
    。 另一种方法是压缩图像。您可以免费压缩图像

    通常,图像大小可以减少50–70%,而不会出现明显的质量损失。
    它们甚至为您提供了一个小的滑动预览窗格,以便您可以查看之前和之后的内容,以便您可以看到质量上的差异。

    我不能依赖fast SD卡,因为市场上有许多设备中没有SD卡。关于预加载策略,您还有其他想法或线索吗?因为用户可以在播放时导航到任何帧?谢谢你的回答。现在我实现了缓冲区技术,似乎SD卡读取速度是个瓶颈,但如果读取速度慢,缓冲区很快就会变空,因为消费者使用了更多的帧,而制作者无法生成那么多的帧。我想关于读取,我们无能为力速度。我已经做了largeHeap=true和关于质量的测试,它们已经是JPEG图像,但不能将其质量降低到90%以下,因为它们是医学图像,不能期望它们的质量降低,因为它们对诊断毫无用处。那么largeHeap=true是否有效?因为它对我有效。是的,启用了它,但问题是该设备有1 GB内存(三星标签2)。我准备一次加载500 MB的图像,这对于1GB RAM设备是不可能的。因此,我们需要找到一些替代策略。。