2015-04-24 65 views
0

我通過編程方式填充AudioBuffer來創建1s音頻片段。 AudioBufferSourceNode啓用了循環。它在Chrome和Firefox中播放得很好。Firefox Web Audio API動態更新AudioBuffer/AudioBufferSourceNode

現在我想動態更新AudioBuffer,並立即(或在下一個循環)拾取新的音頻。在Chrome中,只需獲取通道數據(getChannelData(0))並寫入即可。 Chrome會即時更新播放音頻。 Firefox會一直播放原始緩衝區。事實上,在將Firefox分配給AudioBufferSourceNodesource.buffer = buffer)之前,需要寫入AudioBuffer

+0

這看起來像Web Audio規範中的未指定行爲。也許可以在https://github.com/WebAudio/web-audio-api/issues上指出實施差異,並希望每個瀏覽器最終都做同樣的事情? – Touffy

+0

謝謝,我不知道規範是在GitHub上。我會介入。我通常喜歡參與新的規格,但當我感覺像90年代時,我並不感興趣。 – Prinzhorn

回答

3

這不應該這樣做。您正在嘗試通過線程邊界更新對象。

Chrome有一個錯誤,我們目前沒有實現內存保護(即您可以更新AudioBuffer的內容,它會改變循環緩衝區聽起來的樣子)。 FF目前有一個不同的錯誤,它允許你多次設置.buffer。這些都應該得到修復。

爲了解決這種情況,您需要循環每個緩衝區,直到獲得下一個緩衝區,然後在它們之間進行交叉淡入淡出。不可能只循環1s緩衝區真的是你想要的嗎? (除非是噪音)

+0

「除非是噪音」:它是動態生成的蓋革計數器敲擊頻率變化(通過用戶交互)。 1s以足夠快的反應時間用新頻率更新緩衝區(每秒敲擊次數) – Prinzhorn

+0

嗯。不應該說「噪音」 - 應該說「非循環波形」,並且這是合格的。我仍然建議你只保留兩個緩衝區,並在它們之間循環,更新你目前不在播放的那個緩衝區。 – cwilso

+1

只是爲了澄清:這將意味着不斷創建新的'AudioBufferSourceNode'並將其連接,對吧? – Prinzhorn

0

只需再次分配相同的緩衝區就可以更新Firefox的內部狀態。所以在更新緩衝區後再次執行source.buffer = buffer。即使它應該是一個NOOP,因爲它是完全相同的參考。

即使source.buffer = source.buffer也有竅門。

+0

請注意,這是Firefox實施中的一個錯誤,因此可能會得到解決。 – cwilso