在Chrome中播放多个声音

时间:2011-12-22 15:56:13

标签: html5 google-chrome html5-audio

我正在为Facebook开发HTML5游戏。我有以下HTML代码:

<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 个答案:

答案 0 :(得分:2)

这绝对是一个错误,但我认为它与实际元素有关,而不是声音播放部分。您可以通过预加载音频,为每次播放声音实例化一个新的音频对象,然后最终检查每个音阶的声音对象来确定它们是否已完成播放以便您可以清理内存。 / p>

预加载当然是这样的:

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游戏引擎中使用了这样的东西,到目前为止它的工作非常完美。