您可能已经阅读过关于 Web Audio API 即将登陆 Firefox 的公告,并且非常兴奋,并准备让您之前只能在 WebKit 中使用的网站也能在 Firefox 中运行,Firefox 使用了未加前缀的版本规范。
不幸的是,Chrome、Safari 和 Opera 仍然使用带有前缀的名称webkitAudioContext
。此外,由于规范仍在不断变化,一些浏览器使用已弃用的属性和方法名称,这些名称在符合标准的浏览器中不存在:Safari 使用旧的方法名称,Firefox 使用新方法名称,而 Chrome 和 Opera 则同时使用两者。此外,Firefox 尚未实现 Web Audio 的所有功能。
我们该怎么办!?
我们不想维护两个或更多个独立的代码库,并且功能检测代码很麻烦!此外,我们希望编写将来能够可靠运行的代码,或者至少,能够以最少的更改运行。是否有方法同时满足所有这些约束条件?很可能!
为今天(和明天)编写代码
首先,获取 Chris Wilson 编写的AudioContext-MonkeyPatch 的副本。这个小型库将为您“规范化”接口,并使其看起来好像您的代码正在符合标准的浏览器中运行,方法是将带前缀的名称与不带前缀的版本关联。如果已存在不带前缀的版本,它将不会执行任何操作。
在将其包含在您的页面中后,您可以使用“现代 Web Audio API”样式编写代码,并执行以下操作
var audioContext = new AudioContext();
在所有地方,包括 Chrome/ium、Opera、Safari 和当然还有 Firefox。
此外,如果在某些节点中未检测到诸如start
之类的新方法,该库还将将其与旧名称关联。因此,start
映射到noteOn
,stop
映射到noteOff
,依此类推。
如果您正在移植“较旧”的代码(例如,一年前的代码),则它可能使用了一些AudioContext-MonkeyPatch
未关联的方法,因为它可以帮助您以新样式编写代码。例如,创建GainNode
实例的方式曾经是
var gain = audioContext.createGainNode();
但现在只需
var gain = audioContext.createGain();
由于 Firefox 中不存在旧方法名称,因此现有代码可能会因类似createGainNode 不是函数
的问题而崩溃,您现在知道原因了。
规范中有一个部分列出了旧名称及其更新后的等效项;请务必查看并相应地更改您的代码。您还可以查看有关移植的这篇文章,其中涵盖了更多案例并提供了许多代码示例。
尚未准备好的内容
其次,确保您的项目不使用 Firefox 中尚未实现的节点类型:MediaStreamAudioSourceNode、MediaElementAudioSourceNode 和 OscillatorNode。
例如,如果它正在使用OscillatorNode
,则您必须等到它得到支持,或者,如果您真的迫切需要,可以使用ScriptProcessorNode 构建一些替代方案,它允许您编写一个带有回调的节点,这些回调会定期调用,以便您的 JavaScript 代码生成或处理音频。
您使用的节点参数也必须在 Firefox 中受支持。如果不受支持,您可能能够暂时将其更改为“可接受”的内容,并指望才华横溢的音频开发人员尽快实现这些功能。
例如,直到几天前PannerNode 还不支持默认的 HRTF 声场模型,尝试使用具有该配置的PannerNode
只会导致静音或从该节点输出单声道,具体取决于您使用的版本。
现在,Nightly 中已提供支持,但Aurora 中尚未提供。在此期间,您可以改为显式指定'equalpower'
var panner = new audioContext.PannerNode();
panner.panningModel = 'equalpower';
保持关注
了解 Web Audio API 领域最新动态的最佳方式是订阅邮件列表。请注意,有时可能会有一些高级技术讨论,您可能无法完全理解,但即使只是浏览一下,您也能学到很多东西。
您可能还希望订阅总览 Bug,该 Bug 跟踪 Firefox 中的 Web Audio API 实现,以便在关联的 Bug 更新或解决时收到警报。
最后,还有一个使用 Web Audio API 构建的项目列表,指定哪些项目使用标准的AudioContext
以及它们在哪些浏览器中运行。如果您是通过示例学习的人,那么查看它们的源代码并了解它们如何解决兼容性问题可能很有趣。
关于 Soledad Penadés
Sole 在 Mozilla 的开发者工具团队工作,帮助人们在 Web 上创造惊人的事物,最好是实时创建。在 irc.mozilla.org 上的 #devtools 频道找到她。
关于 Robert Nyman [荣誉编辑]
Mozilla Hacks 的技术布道师和编辑。发表有关 HTML5、JavaScript 和开放 Web 的演讲和博客文章。Robert 坚定地相信 HTML5 和开放 Web,自 1999 年以来一直在从事 Web 前端开发工作——在瑞典和纽约市。他还在http://robertnyman.com 定期发布博客文章,并且喜欢旅行和结识新朋友。
2 条评论