1

我目前正在开发一个利用SoundJS的应用程序。在发现它在 iPad 上无法正常工作后,我继承了代码库 - 问题是它创建了大约 16 个 MP3 文件的清单,总计约 35.7mb。这显然会导致 iPad 出现问题,并在 16mb 时崩溃。

根据诊断和使用日志,崩溃日志显示这是由于每个进程限制造成的。

我已经对 SoundJS 的底层结构进行了一些挖掘,可以看到它的默认行为是通过 XHR 使用 WebAudio。然后将其解析为 ArrayBuffer(或 ArrayBuffer 数组)。

目前这意味着,在预加载之后,我们在 ArrayBuffers 中有 35.7mb 的数据——不好。这是压缩文件大小之后!任何时候都只会播放一个音频文件——这是应用程序的每个部分一个文件;除了在过渡期间,两个可能会逐渐淡入彼此

有没有一种简单的方法可以从底层结构中释放资源?即ArrayBuffers?据我所知,之前的开发人员确实尝试使用对 SoundJS.removeSound()方法的调用来释放一些内存,但结果并不好。

目前,我正在考虑创建一个对象作为所有文件名的注册表,而不是通过清单加载它们 - 单独加载它们并在使用它们时立即删除它们。但是,我预计这会在播放期间将一个文件缓入另一个文件时引起头痛。此外,我预计这实际上可能会导致类似于图像的问题,其中 MobileSafari 没有释放分配给图像的内存 - 即使在删除之后也是如此。(正确的解决方法是在删除之前重置图像元素的 'src' 属性)

有谁知道在针对 iPad 的网络应用程序中加载如此大量数据的万无一失的解决方法?

4

1 回答 1

2

测试 SoundJS 显示 iPad 没有正确释放内存的一些问题。不幸的是,从图书馆的角度来看,我们对此无能为力。

如果您一次只播放 1 个声音,我建议您仅在需要时加载它们并在使用后删除它们。您会发现最大的问题是等待声音加载,因此您可能希望对您希望使用的下一个声音实施智能预加载(这意味着您始终加载当前和下一个声音)。从理论上讲,这可以让您低于 iPad 16 mb 的内存限制。但是,如果 iPad 拒绝释放内存,您可能需要引入某种形式的缓存清除。

另一种解决方案是通过有损压缩来减小文件大小,这听起来像是已经尝试过的。

第三种选择可能是实现某种形式的流式音频,但这不是 SoundJS 可以帮助的。

希望有帮助。

于 2013-11-14T17:20:11.210 回答