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 来引用它们?)
如果不行,怎么走比较好?
应用程序中打包的任何文件都可以使用相对 url 进行访问。这意味着您不必得到一个 blob 或任何东西。
据我所知,无法将资产(在运行时)保存在应用程序文件夹中。访问应用程序文件夹的唯一方法要求您拥有 webapp-manage
权限并且您的应用程序必须经过认证。
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)
}
}
我目前正在为 firefox OS (github). That uses, for playback, Howler JS (link) 开发音频编辑应用程序。
在 Firefox OS 上,我只需将 URL 传递给 Howler 即可轻松播放应用程序文件夹中的音频文件(无论在何处),但是,如果我想创建新的音频文件(录制音频),然后我需要将它们保存在内部存储器的某个位置。
问题是:Howler js 不支持播放 blob 文件(即使我尝试获取 URL - window.URL.createObjectURL(blob))。
有没有办法将应用程序创建的文件直接保存到应用程序文件夹中? (所以我可以使用 url 来引用它们?)
如果不行,怎么走比较好?
应用程序中打包的任何文件都可以使用相对 url 进行访问。这意味着您不必得到一个 blob 或任何东西。
据我所知,无法将资产(在运行时)保存在应用程序文件夹中。访问应用程序文件夹的唯一方法要求您拥有
webapp-manage
权限并且您的应用程序必须经过认证。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)
}
}