如何在扩展程序中播放音频?

5
AudioObj = new Audio;

将返回“未定义音频”

我还尝试了经典的修复方法:

var audio = require("audio");

但不幸的是,我没有成功。我可以在一些扩展的其他部分(例如一些内容脚本)中添加音频播放功能,从而使其工作,但也许有一种更简单和优雅的解决方案。


你可以使用 jPlayer 吗? - Larry Battle
当您使用console.log( new Audio );或console.dir( Audio )时会发生什么? - Larry Battle
控制台日志只返回未定义的音频。我看了一下jPlayer,它似乎更像是在HTML中创建播放器并控制和样式化它的方法...而且我不太确定如何在main.js中使用它,除非将所有内容都粘贴进去.. - DoTheEvo
3个回答

6
new Audio 创建一个新的 <audio> HTML 元素,但只能在绑定到文档的上下文中运行。SDK 模块在没有文档的上下文中执行,因此包括此方法在内的任何 DOM 方法都无法工作。解决方法是通过page-worker 模块加载 about:blank 并在其中注入内容脚本。然后,您可以向该内容脚本发送消息,并在需要时让它为您播放音频。
另一种替代方法是使用nsISound.play(),代码大致如下:
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);

请注意,nsISound很快将被废弃。这是一个旧的API,比HTML5音频功能差。

2
谢谢。Page-worker系统运行良好,尽管我是在我的[data]目录中使用它来处理空的HTML而不是about:blank。我还在构造函数上设置了计时器,在警报声音完成后30秒杀死page-worker。 - DoTheEvo

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

1
音频对象有文档吗?我该如何使用它播放声音? - timgeb

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接