从Firefox扩展的数据目录播放音频 [英] Play audio from firefox extension's data directory
问题描述
我正在制作Firefox扩展程序,而且我无法播放位于附加程序 data
目录中的声音。
-
我试过的第一件事就是用这种方式在内容脚本中播放它:
var soundFile = self.options.soundFile;
(new Audio(soundFile))。play();
其中
self.options.soundFile
是选项,它引用data
目录中的资源文件。但是我遇到了安全限制:
pre $安全错误:http://example.com上的内容可能无法加载或链接到资源: //jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/stackoverflow-reiew-helper/data/complete.oga。
-
然后我找到了一种方法来播放
main .js
脚本(这里:如何播放音频
var data = require('sdk / self')。data;
$ b exports.main = function(){
var {Cc,Ci} = require(chrome);
var sound = Cc [@ mozilla.org/sound;1\"].createInstance(Ci.nsisound);
sound.play(data.url('complete.oga'));
};
这个失败,例外情况如下:
< pre $NS_ERROR_XPC_BAD_CONVERT_JS:无法转换JavaScript参数arg 0 [nsISound.play]
undefined 8
Traceback(最近一次调用最后一次):
文件resource ://gre/modules/NetUtil.jsm,第140行,空
aCallback(pipe.inputStream,aStatusCode,aRequest);
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/net/url.js,第49行,为空
resolve(data);
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第143行,解析
while(pending.length)结果。 then.apply(result,pending.shift())
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第37行,然后在
return {then:function then(resolve){resolve(value)}}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon -sdk / lib / sdk / core / promise。 js,第117行,已解决
函数解析(值) (pending.length)result.then.apply(result,pending.shift())
lib / sdk / core / promise.js,第143行解析
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon-sdk / lib / sdk / core / promise.js,第37行,然后
return {then:function then(resolve){resolve(value)}}
文件资源:// j (已解决)
函数已解决(value){deferred.resolve(resolve(value))} $ b已经解决了$ id $ -a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon -sdk / lib / sdk / core / promise.js $ b文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第143行,在解析
while(pending.length)result.then。 apply(result,pending.shift())
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第37行,然后
return {then:function then(resolve){resolve(value)}}
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js ,第117行,已解决
函数resolve(value){deferred.resolve(resolve(value))}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon -sdk / lib / sdk / core / promise.js,第143行,解析
while(pending.length)result.then.apply(result,pending.shift())
文件resource:// jid0- a02no8rrtu2pb ize7g7sszzo0z8-jet-pack / addon-sdk / lib / sdk / core / promise.js,第37行,然后
return {then:function then(resolve){resolve(value)}}
文件资源://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,行117,已解决的
函数解析(值){deferred.resolve(resolve(值))}
文件资源://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,行143,解析
while(pending。 length)result.then.apply(result,pending.shift())
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,行37,然后在
return {then:function then(resolve){resolve(value)}}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon -sdk / lib / sdk / core / promise.js,第117行,已解决
函数已解决(value){deferred.resolve(resolve(value))}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack /广告(pending.length)result.then.apply(result,pending.shift())
解析
文件don-sdk / lib / sdk / core / promise.js资源://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第123行,然后
else result.then(已解决,拒绝)
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第37行,然后
return {then:function then(resolve){resolve(value )}}
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,行117,已解决
函数解析(值) {deferred.resolve(resolve(value))}
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第55行,在
尝试{返回f(选项)}
文件资源://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,行117,已解决
函数解析(值){deferred.resolve(resolve(value))}
文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/core/promise.js,第143行,
while(pending.length)result.then.apply(result,pending.shift())
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon -sdk / lib / sdk / core / promise.js,第37行,然后
return {then:function then(resolve){resolve(value)}}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack /在解决的
函数解析(值){deferred.resolve(解析(值))}
文件资源:/ /解决方案jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon-sdk / lib / sdk / core / promise.js,第55行,努力
try {return f(options)}
文件resource:// jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack / addon-sdk / lib / sdk / addon / runner.js,第90行,在onLocalizationReady
run(options);
运行
的文件resource://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/addon-sdk/lib/sdk/addon/runner.js,行134,退出:退出
文件resources://jid0-a02no8rrtu2pbize7g7sszzo0z8-at-jetpack/stackoverflow-reiew-helper/lib/main.js,第8行,位于exports.main
sound.play(data.url('complete.oga' ));
如果我替换
sound.play(...)
与sound.beep
,我得到一个很好的默认系统声音。因此,将资源路径传递给函数应该是错误的。
如果有任何问题,使用在线插件生成器。
$ b
请建议播放播放扩展音频资源的解决方案。
nsISound.play()
需要 nsIURI
实例,而不是一个字符串。您必须通过
nsIIOService .newURI()
首先: $ b
var uri = Cc [@ mozilla.org/network/io-service;1]
.getService(Ci.nsIIOService)
.newURI(data.url('complete.oga'),null,null );
sound.play(uri);
然而,我建议不要这种方法, 您的声音文件和 I'm making a Firefox extension and I'm failing to play a sound that's located in add-on's The first thing I've tried was playing it in a content script this way: where Then I've found a way to play sounds in This one fails with the following exception: If I replace If it matters in any way, I'm using online Add-on Builder. Please suggest a solution of playing a solution of playing extension audio resources. I would recommend against this approach however, Both your sound file and 这篇关于从Firefox扩展的数据目录播放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋! nsISound.play() code> API是相当多弃用和恕我直言,不能玩ogg文件。
$ b Audio
构造函数需要访问正确的HTML文档。在基于SDK的扩展中获取最简单的方法是使用 page-worker
模块:
$ b
require(page-worker)。Page({
contentScript:new Audio('complete.oga')play(),
contentURL:data .url(blank.html)
});
blank.html
(一个空的HTML文件)需要位于扩展的 data /
目录中 - 注意音频文件是如何通过相对URL加载的。现在我看不到一种方法来避免扩展名中有一个空的HTML文件,扩展名之外的HTML文件无法访问扩展文件,也无法播放。data
directory.
var soundFile = self.options.soundFile;
(new Audio(soundFile)).play();
self.options.soundFile
is an option that refers to a resource file in data
directory. But I meet security restrictions: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
script (here: How to play audio in an extension?):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.play(...)
with sound.beep
, I get a nice default system sound. So, there should be something wrong with passing resource path to the function.nsISound.play()
takes an nsIURI
instance, not a string. You have to create it via nsIIOService.newURI()
first: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 is pretty much deprecated and IMHO not capable of playing ogg files anyway.Audio
constructor requires access to a proper HTML document. Easiest way to get one in an SDK-based extension is using page-worker
module:require("page-worker").Page({
contentScript: "new Audio('complete.oga').play()",
contentURL: data.url("blank.html")
});
blank.html
(an empty HTML file) need to be located in the data/
directory of the extension - note how the audio file is loaded via a relative URL. Right now I don't see a way to avoid having an empty HTML file in the extension, HTML files outside the extension don't have access to extension files and cannot play them.