从firefox扩展's数据目录播放音频
Play audio from firefox extension's data directory
我正在制作一个Firefox扩展,我无法播放位于附加组件的data
目录中的声音。
-
我尝试的第一件事是在内容脚本中播放它:
var soundFile = self.options.soundFile; (new Audio(soundFile)).play();
其中
self.options.soundFile
为选项,表示data
目录下的资源文件。但我符合安全限制:Security Error: Content at http://example.com may not load or link to resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/stackoverflow-reiew-helper/data/complete.oga.
-
然后我找到了一种在
main.js
脚本中播放声音的方法(这里:如何在扩展中播放音频?):var data = require('sdk/self').data; exports.main = function() { var {Cc, Ci} = require("chrome"); var sound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound); sound.play(data.url('complete.oga')); };
这个失败了,有以下例外:
NS_ERROR_XPC_BAD_CONVERT_JS: Could not convert JavaScript argument arg 0 [nsISound.play] undefined 8 Traceback (most recent call last): File "resource://gre/modules/NetUtil.jsm", line 140, in null aCallback(pipe.inputStream, aStatusCode, aRequest); File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/net/url.js", line 49, in null resolve(data); File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 123, in then else result.then(resolved, rejected) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 55, in effort try { return f(options) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 143, in resolve while (pending.length) result.then.apply(result, pending.shift()) File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 37, in then return { then: function then(resolve) { resolve(value) } } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 117, in resolved function resolved(value) { deferred.resolve(resolve(value)) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js", line 55, in effort try { return f(options) } File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/addon/runner.js", line 90, in onLocalizationReady run(options); File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/addon/runner.js", line 134, in run quit: exit File "resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/stackoverflow-reiew-helper/lib/main.js", line 8, in exports.main sound.play(data.url('complete.oga'));
如果我用
sound.beep
代替sound.play(...)
,我得到一个很好的默认系统声音。因此,将资源路径传递给函数应该有问题。
如果有关系的话,我使用的是在线Add-on Builder。
请给出播放扩展音频资源的解决方案
nsISound.play()
接受nsIURI
实例,而不是字符串。你必须先通过nsIIOService.newURI()
创建它:
var uri = Cc["@mozilla.org/network/io-service;1"]
.getService(Ci.nsIIOService)
.newURI(data.url('complete.oga'), null, null);
sound.play(uri);
我不建议这种方法,然而,nsISound.play()
API几乎不赞成,IMHO不能够播放ogg文件。
Audio
构造函数需要访问适当的HTML文档。在基于sdk的扩展中获得一个最简单的方法是使用page-worker
模块:
require("page-worker").Page({
contentScript: "new Audio('complete.oga').play()",
contentURL: data.url("blank.html")
});
你的声音文件和blank.html
(一个空的HTML文件)都需要位于扩展的data/
目录中-注意音频文件是如何通过相对URL加载的。现在我没有看到一种方法来避免在扩展名中有一个空的HTML文件,扩展名之外的HTML文件没有访问扩展文件,不能播放它们。
相关文章:
- 从文件目录结构创建JSON数据的有效功能
- 如何引用Firefox扩展的数据目录中的文件
- 使用播放按钮和/或元数据API(Spotify)进行现场演示
- 如何通过单击Angular.js中自定义目录中的按钮来调用特定用户JSON数据
- _.map() 在播放真实数据时不起作用
- 如果目录中存在文件,则加载 JSON 数据
- 通过PHP将动态mp3数据使用到嵌入式播放器中不起作用
- 哪些字节的视频数据是指当前播放位置
- 如何为 cordova 应用程序创建一个单独的目录并在其中存储数据
- 移动浏览器无法播放本地 blob 数据中的音频
- 将数据从 SCORM 播放器发送到 LMS
- 如何在网站上检索 Spotify 播放列表元数据
- 从File对象中的数据播放视频
- 从json文件中获取视频源和数据的视频播放器
- 显示来自firefox插件的图像'网页中的数据目录
- 创建一个缓冲区和管道数据来播放它
- 从firefox扩展's数据目录播放音频
- 如何在HTML中访问数据目录
- Jwplayer:提供从主目录播放视频的路径
- 如何将照片从图库复制到数据目录