Firefox OS - 将文件保存在应用程序目录中

Firefox OS - save file in the app directory

我目前正在为 firefox OS (github). That uses, for playback, Howler JS (link) 开发音频编辑应用程序。

在 Firefox OS 上,我只需将 URL 传递给 Howler 即可轻松播放应用程序文件夹中的音频文件(无论在何处),但是,如果我想创建新的音频文件(录制音频),然后我需要将它们保存在内部存储器的某个位置。

问题是:Howler js 不支持播放 blob 文件(即使我尝试获取 URL - window.URL.createObjectURL(blob))。

有没有办法将应用程序创建的文件直接保存到应用程序文件夹中? (所以我可以使用 url 来引用它们?)

如果不行,怎么走比较好?

  1. 应用程序中打包的任何文件都可以使用相对 url 进行访问。这意味着您不必得到一个 blob 或任何东西。

  2. 据我所知,无法将资产(在运行时)保存在应用程序文件夹中。访问应用程序文件夹的唯一方法要求您拥有 webapp-manage 权限并且您的应用程序必须经过认证。

  3. Howler.js 不太可能不适用于 blob url,因为它们与任何其他 url 没有太大区别。不过 FirefoxOS 中可能存在错误。

根据文档,如果无法从url

var sound = new Howl({
   urls: [URL.createObjectUrl(blob)],
   format: 'mp3',
   ....
})

作为旁注,我不得不说,对于 URL.createObjectUrl(blob) 的每次使用,您还应该调用 URL.revokeObjectUrl(url)。我没有读太多,但据我了解,只要 url 未被撤销,浏览器就会将 blob 保留在内存中。每次调用 createObjectUrl 方法都会创建一个新的 URL 来引用该 blob。为了释放 blob,您还必须释放所有 urls.

根据文档,urls 不会自行撤销...这意味着如果您丢失对之前创建的 URL 的引用,您的 Web 应用程序将会泄漏除非在文档上调用 unload 事件,否则不会释放 blob 的内存。

因此,在您编写应用程序时,我建议创建一个您可以管理的 URL 池。

function UrlPool() {
  this.assets = new Map()
}

UrlPool.prototype.getUrl = function (asset, blob) {
  var url = this.assets.get(asset)
  if (!url) {
    url = URL.createObjectUrl(blob)
    this.assets.set(asset, url)
  }
  return url
}

UrlPool.prototype.removeUrl = function (asset) {
  var url = this.assets.get(asset)
  if (url) {
    URL.revokeObjectUrl(url)
    this.assets.delete(asset)
  }
}