Web Audio 異動
Google 非常重視標準。我們的使命是打造符合標準定義的網路平台。其中一個小問題是 Web Audio API 的 webkit 前置字元實作方式 (特別是 webkitAudioContext 物件),以及我們持續支援的部分已淘汰的 Web Audio 元件。
我們原本計劃在 Chrome 36 中移除對前置字串 webkitAudioContext 的支援,因為我們已開始支援未加上前置字串的 AudioContext 物件。這項做法比預期更麻煩,因此 Chrome 36 同時支援未加上前置字元的和加上前置字元的做法。不過,即使在重新推出的 webkitAudioContext 中,也已移除 createGainNode 和 createJavaScriptNode 等多種舊版方法和屬性。簡而言之,在 Chrome 36 中,webkitAudioContext 和 AudioContext 是彼此的別名,兩者之間沒有功能差異。
我們將在 Chrome 36 之後完全移除對前置字元的支援,可能會在幾個版本後完成。變更即將生效時,我們會在這裡發布公告,並持續與作者聯絡,請他們修正 Web Audio 應用程式。
為什麼我們要這樣做,而不是恢復先前的實作方式?我們一直不願意太過往回溯,因此已移除這些 API。此外,這項別名化功能的附帶好處是,應用程式可以在 Firefox 上順利運作,因為 Firefox 在去年秋季推出的 Web Audio 支援功能中從未支援前置字首 AudioContext 物件 (這也是正確的做法)。
本更新的其餘部分會提供指南,協助您修正因這項異動而導致程式碼中可能發生的問題。修正這些問題的好處是,您的程式碼很可能只會在 Firefox 中運作!(我一直以為 Vocoder 應用程式是因為 Firefox 的導入方式而無法運作,但實際上是因為這些問題之一!)
如果您只想讓應用程式運作,不妨參考我為舊版 Web Audio 程式碼編寫的應用程式猴子補丁 程式庫,這樣就能在最短的時間內讓應用程式運作,因為這個程式庫會適當地為物件和方法建立別名。程式庫列出的修補程式確實是變更項目的絕佳指南。
首先
請將任何 window.webkitAudioContext
參照改為 window.AudioContext
。通常只要簡單執行以下操作,就能解決這個問題:
window.AudioContext = window.AudioContext || window.webkitAudioContext;
如果應用程式回應類似「很抱歉,您的瀏覽器不支援 Web Audio。請使用 Chrome 或 Safari。」這很可能是明確尋找 webkitAudioContext
。開發人員不良!你可能已經支持 Firefox 好幾個月了!
但還有一些較不明顯的程式碼移除作業。
.type
屬性 (現在是字串) 的 BiquadFilter 列舉型別常數不再顯示在BiquadFilterNode
物件上,我們也不支援在.type
屬性上使用這些常數。因此,您不再使用.LOWPASS
(或 0),而是將其設為「lowpass」。- 此外,
Oscillator.type
屬性現在也同樣是字串列舉類型,不再是.SAWTOOTH
。 PannerNode.type
現在也是字串列舉型別。PannerNode.distanceModel
現在也是字串列舉型別。createGainNode
已重新命名為createGain
createDelayNode
已重新命名為createDelay
createJavaScriptNode
已重新命名為createScriptProcessor
AudioBufferSourceNode.noteOn()
現已替換為start()
AudioBufferSourceNode.noteGrainOn()
也已由start()
取代- 已將「
AudioBufferSourceNode.noteOff()
」重新命名為「stop()
」 - 已將「
OscillatorNode.noteOn()
」重新命名為「start()
」 - 已將「
OscillatorNode.noteOff()
」重新命名為「stop()
」 - 已將「
AudioParam.setTargetValueAtTime()
」重新命名為「setTargetAtTime()
」 AudioContext.createWaveTable()
和OscillatorNode.setWaveTable()
現已重新命名為createPeriodicWave() and
setPeriodicWave()`。- 已移除
AudioBufferSourceNode.looping
,改用.loop
AudioContext.createBuffer(ArrayBuffer, boolean)
已遭到移除,無法同步解碼已編碼音訊資料的 blob。同步呼叫需要很長的時間才能完成,這並非良好的程式碼編寫方式;請改用非同步的 decodeAudioData 呼叫。這是較具挑戰性的變更之一,因為您必須實際變更邏輯流程,但這也是更佳的做法。Mozilla 的 Ehsan Angkari 在這篇文章中提供了一個不錯的示例,說明如何執行這項操作。這篇文章說明瞭如何將音訊轉換為標準 Web Audio。
其中許多錯誤 (例如重新命名 createGainNode 和移除 createBuffer 中的同步解碼) 會明顯顯示在開發人員工具主控台中,但其他錯誤 (例如以下用法) 則不會:
MULTI_LINE_CODE_PLACEHOLDER_1
不會顯示,並且會靜默失敗 (myFilterNode.BANDPASS 會解析為 undefined,而嘗試將 .type 設為 undefined 的動作將無法產生任何效果)。順帶一提,這就是導致語音轉換器失敗的原因)。同樣地,只要將 filter.type 指派給用來運作的數字即可:
myFilterNode.type = 2;
但現在您必須使用字串列舉:
myFilterNode.type = “bandpass”;
因此,您可以使用 grep 搜尋程式碼中的以下字詞:
webkitAudioContext
.LOWPASS
.HIGHPASS
.BANDPASS
.LOWSHELF
.HIGHSHELF
.PEAKING
.NOTCH
.ALLPASS
.SINE
.SQUARE
.SAWTOOTH
.TRIANGLE
.noteOn
.noteGrainOn
.noteOff
.setWaveTable
.createWaveTable
.looping
.EQUALPOWER
.HRTF
.LINEAR
.INVERSE
.EXPONENTIAL
createGainNode
createDelayNode
.type
(是的,這會產生許多誤報,但這是捕捉上述最後一個範例的唯一方法!)
再次提醒,如果您急著要開始使用,只要取得 我的 monkeypatch webkitAudioContext 程式庫的副本,並將其納入應用程式即可。祝您音訊駭客計畫順利!