2011-12-22 103 views
3

我正在爲Facebook開發HTML5遊戲。我有以下的HTML代碼:在Chrome中播放多個聲音

<audio style="visibility: hidden;" controls="controls" id="sound-0"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-1"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-2"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-3"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-4"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 
<audio style="visibility: hidden;" controls="controls" id="sound-5"> 
    <source src="sound/sound_new.ogg" type="audio/ogg"/> 
    <source src="sound/sound_new.mp3" type="audio/mp3"/> 
</audio> 

而且下面的JavaScript啓動的聲音:

if (this.hitFlag > 6) this.hitFlag = 1; 
var soundElem = document.getElementById('sound-' + (this.soundFlag % 6) + '0'); 
soundElem.play(); 

鼠標的每一次點擊觸發聲音事件。問題在於,Chrome在點擊數十次之後聲音消失或者開始播放的時間相當長(十幾秒)。 但在FF或Opera中播放時沒有問題。

+1

聽起來像一個Chrome bug ... – home

+1

Chrome修復了很多

回答

2

這絕對是一個bug,但我認爲它與實際的元素,而不是聲音播放部分。您可以通過預加載音頻輕鬆解決這個問題,爲每次播放聲音實例化一個新的音頻對象,最後在每個節拍處檢查聲音對象以確定它們是否完成播放,以便清理內存。

預壓是的,當然是這樣的:

var _mySnd = new Audio('my/snd/file/is/here.mp3'); 

實例化是這樣的:

var _sndCollection = []; 
var n = _sndCollection.length; 

_sndCollection[n] = new Audio(); 
_sndCollection[n].src = _mySnd.src; 
_sndCollection[n].play(); 

而且清理檢查將是:

for (var i = 0; i < _sndCollection.length; i++) 
{ 
    if (_sndCollection[i].currentTime >= _sndCollection[i].duration) 
    { 
     _sndCollection.splice(i, 1); 
     i--; 
    } 
} 

我用的是這樣的在我自己的HTML5遊戲引擎中,並且迄今爲止完美運行。

+0

謝謝@ceprovence我會在聖誕節後立即嘗試你的代碼!祝你聖誕快樂! –

+0

這個(或類似的東西)似乎可以正常工作,但是不是它會將您放入一個文件類型中,例如示例代碼中的.mp3文件?

+0

後續操作:使用你的系統我聽起來有些滯後,好像_mySnd的預加載不會擴展到_sndCollection [n]。 – Dragonfly