2012-05-19 8 views
5
AudioObj = new Audio; 

zurückkehren wird "Audio nicht definiert ist"Wie spielt man Audio in einer Nebenstelle?

Ich habe auch versucht die klassische fix:

var audio = require("audio"); 

, aber ohne Glück. Ich könnte Audio-Wiedergabe in einem anderen Teil der Erweiterung hinzufügen als in main.js, wie ein Content-Skript, wo es funktioniert, aber vielleicht gibt es eine einfachere und elegante Lösung.

+0

Könnten Sie stattdessen jPlayer verwenden? –

+0

Was passiert, wenn Sie console.log (neues Audio); oder console.dir (Audio) –

+0

Konsolenprotokolle gibt nur zurück, dass Audio nicht definiert ist. Ich habe mir den jPlayer angesehen und es scheint eher eine Möglichkeit zu sein, einen Player in html zu erstellen und ihn zu steuern und zu stylen ... auch bin ich nicht wirklich sicher, wie ich ihn in main.js verwenden würde, kurz davor alles einzufügen. – DoTheEvo

Antwort

6

new Audio erstellt ein neues <audio> HTML-Element - das funktioniert nur in einem Kontext, der auf ein Dokument gebunden ist. SDK-Module werden in einem Kontext ausgeführt, in dem jedoch kein Dokument vorhanden ist. Daher funktionieren auch hier keine DOM-Methoden. Ein Workaround würde about:blank über page-worker module laden und dort ein Inhaltsskript einfügen. Sie könnten dann Nachrichten an dieses Inhaltsskript senden und es Audio für Sie wiedergeben lassen, wann immer Sie es benötigen.

Die Alternative wäre in dieser Richtung mit nsISound.play(), etwas sein:

var {Cc, Ci} = require("chrome"); 
var sound = Cc["@mozilla.org/sound;1"].createInstance(Ci.nsISound); 
var uri = Cc["@mozilla.org/network/io-service;1"] 
      .getService(Ci.nsIIOService) 
      .newURI(self.data.url(...), null, null); 

sound.play(uri); 

Beachten Sie, dass nsISoundlikely to be deprecated bald ist. Es ist eine alte API, die HTML5-Audio unterlegen ist.

+2

Danke. Das Page-Worker-System funktioniert gut, obwohl ich es in einem leeren HTML-Code in meinem [data] -Verzeichnis verwende als bei about: blank. Ich setze auch Timer auf Konstruktor, um den Page-Arbeiter 30 Sek. Nach dem Aufruf zu töten, wenn der Alarmton ertönt ... – DoTheEvo

4
var window = require("sdk/window/utils").getMostRecentBrowserWindow(); 
AudioObj = new window.Audio; 
+0

Dies ist die richtige Antwort, funktioniert perfekt. –

+1

Gibt es eine Dokumentation zum Audioobjekt? Wie kann ich einen Sound abspielen? – timgeb

+1

var audio = ('http://beispiel.com/audio.mp3'); audio.play(); –