从Firefox扩展的数据目录播放音频 [英] Play audio from firefox extension's data directory

查看:159
本文介绍了从Firefox扩展的数据目录播放音频的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在制作Firefox扩展程序,而且我无法播放位于附加程序 data 目录中的声音。


  1. 我试过的第一件事就是用这种方式在内容脚本中播放它:

      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。


  2. 然后我找到了一种方法来播放 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);

然而,我建议不要这种方法, 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文件无法访问扩展文件,也无法播放。


I'm making a Firefox extension and I'm failing to play a sound that's located in add-on's data directory.

  1. The first thing I've tried was playing it in a content script this way:

    var soundFile = self.options.soundFile;
    (new Audio(soundFile)).play();
    

    where 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.
    

  2. Then I've found a way to play sounds in 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'));
    };
    

    This one fails with the following exception:

    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'));
    

    If I replace 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.

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.

解决方案

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);

I would recommend against this approach however, 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")
});

Both your sound file and 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.

这篇关于从Firefox扩展的数据目录播放音频的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆