2013-05-08 17 views
8

Tworzę rozszerzenie przeglądarki Firefox i nie udało mi się odtworzyć dźwięku, który znajduje się w katalogu data dodatku.Odtwarzanie dźwięku z katalogu danych rozszerzenia firefox

  1. Pierwszą rzeczą Próbowałem grał go w treści skryptu w ten sposób:

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

    gdzie self.options.soundFile jest opcja, że ​​odnosi się do pliku zasobów w data katalogu. Ale spotykam ograniczeń zabezpieczeń:

    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. Potem znalazłem sposób, aby odtworzyć dźwięki w main.js scenariusza (tu: 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')); 
    }; 
    

    Ten jeden nie powiedzie się z następującym wyjątkiem:

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

    Jeśli zastąpię sound.play(...) przez sound.beep, otrzymam niezły dźwięk domyślnego systemu. Tak więc powinno być coś złego w przekazywaniu ścieżki zasobu do funkcji.

Jeśli ma to jakikolwiek wpływ, korzystam z narzędzia do tworzenia dodatków online.

Proszę zaproponować rozwiązanie odtwarzania rozwiązania odtwarzania zasobów audio.

Odpowiedz

7

nsISound.play() przyjmuje instancję nsIURI, a nie ciąg. Musisz utworzyć go poprzez nsIIOService.newURI() pierwszy:

var uri = Cc["@mozilla.org/network/io-service;1"] 
      .getService(Ci.nsIIOService) 
      .newURI(data.url('complete.oga'), null, null); 
sound.play(uri); 

Polecam przeciwko takiemu podejściu Jednak nsISound.play() API jest pretty much deprecated i IMHO nie zdolny do odtwarzania plików ogg tak.

Audio Konstruktor wymaga dostępu do odpowiedniego dokumentu HTML. Najłatwiej dostać jeden w przedłużeniu SDK oparte korzysta page-worker module:

require("page-worker").Page({ 
    contentScript: "new Audio('complete.oga').play()", 
    contentURL: data.url("blank.html") 
}); 

Zarówno plik dźwiękowy i blank.html (pusty plik HTML) muszą być umieszczone w katalogu rozszerzenia data/ - Zauważ, jak dźwięk plik jest ładowany za pomocą względnego adresu URL. W tej chwili nie widzę sposobu na uniknięcie pustego pliku HTML w rozszerzeniu, pliki HTML poza rozszerzeniem nie mają dostępu do plików rozszerzeń i nie mogą ich odtwarzać.

+0

Pierwsze rozwiązanie działa idealnie (po zastąpieniu pliku ogg wav). Ale drugi jest przekazywany w trybie cichym, bez błędów w 'Error Console' i bez dźwięku. Jaki może być tego powód, a może w jaki sposób mogę go znaleźć? – Alexey

+0

@Alexey: Masz rację, ''

+0

Dziękuję. Oba warianty działają doskonale. – Alexey

Powiązane problemy