Firefox OS - 将文件保存在app目录

时间:2015-05-31 17:25:47

标签: javascript audio io firefox-os howler.js

我目前正在为firefox OS(github)开发音频编辑应用程序。那个用于播放的Howler JS(link)。

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

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

有没有办法直接使用应用程序文件夹保存应用程序创建的文件? (所以我可以使用网址引用它们吗?)

如果没有,最好的方法是什么?

1 个答案:

答案 0 :(得分:2)

  1. 可以使用相对网址访问应用中打包的任何文件。这意味着你不必得到一个blob或任何东西。

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

  3. Howler.js不太可能不使用blob网址,因为它们与其他网址没有多大区别。但FirefoxOS中可能存在错误。

  4. 从文档中可以看出,你应该使用"格式"如果网址不能从网址获取,则设置网址的文件格式

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

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

    从文档中,网址不会被自己撤销...这意味着如果您丢失了对之前创建的网址的引用,那么您的网络应用程序会因为blob赢得内存而泄漏内存除非在文档上调用unload事件,否则获取释放。

    因此,在编写应用程序时,我建议您创建一个可以管理的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)
      }
    }