2016-07-24 89 views
1

我想然而重用音頻元素,我得到在Chrome以下錯誤:不能重複音頻元素

(index):52 Uncaught InvalidStateError: Failed to execute 'createMediaElementSource' on 'AudioContext': HTMLMediaElement already connected previously to a different MediaElementSourceNode.

window.audioContext = new(window.AudioContext || window.webkitAudioContext)(); 

var sourceNode 
var scripNode 

function create() { 
    scriptNode = window.audioContext.createScriptProcessor(4096); 
    sourceNode = window.audioContext.createMediaElementSource(document.getElementById('audio')); 

    sourceNode.connect(scriptNode); 
    scriptNode.connect(window.audioContext.destination); 
} 

function destroy() { 
    sourceNode.disconnect(); 
    scriptNode.disconnect(); 
} 

create(); 

setTimeout(function() { 
    destroy(); 
    create(); 
}, 200); 

什麼是清理使用網絡音頻,這樣的正確方法一個mediaelement可以重新使用?

回答

0

我認爲這是Chrome中一個長期存在的問題。我認爲有辦法解決這個問題,但是你沒有展示你真正想做的事情,所以很難說適當的解決方法是什麼。

+0

Chrome確實應該解決這個問題。 –

+0

我真正想要做的就是我在示例中所做的:)。 – ronag

+0

如果你想說服某人修復它,那麼玩具演示作爲你真正想要的應用程序並不會很好。解釋爲什麼您需要在實際應用程序中重新使用媒體元素。 –

0

你並沒有破壞節點sourceNode,你只是斷開它們。爲什麼不重新連接音頻節點,因爲你使用的是同一個節點,另一個音頻圖或者你正在嘗試做什麼?

否則,您可以刪除HTML音頻元素,重新創建它,然後重新連接。

+0

如何「銷燬」一個節點? – ronag

+0

總之,你不能。如果沒有對它們的引用,JavaScript應該銷燬它們。然而,實際的HTML元素可能仍然會保存對javascript節點的引用,因此很可能不會以這種方式被破壞。 –