我目前正在为firefox OS(github)开发音频编辑应用程序。那个用于播放的Howler JS(link)。
在Firefox OS上,只需将URL传递给Howler,我就可以轻松播放应用程序文件夹中的音频文件(无所谓),但是,如果我想创建新的音频文件(录制音频),我就可以需要将它们保存在内部存储器的某个位置。
问题是:Howler js不支持回放blob文件(即使我尝试获取URL - window.URL.createObjectURL(blob))。
有没有办法直接使用应用程序文件夹保存应用程序创建的文件? (所以我可以使用网址引用它们吗?)
如果没有,最好的方法是什么?
答案 0 :(得分:2)
可以使用相对网址访问应用中打包的任何文件。这意味着你不必得到一个blob或任何东西。
据我所知,它无法在app文件夹中保存资产(在运行时)。访问应用文件夹的唯一方法是要求您拥有webapp-manage
权限,并且您的申请必须经过认证。
Howler.js
不太可能不使用blob网址,因为它们与其他网址没有多大区别。但FirefoxOS中可能存在错误。
从文档中可以看出,你应该使用"格式"如果网址不能从网址获取,则设置网址的文件格式
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)
}
}