首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Chrome中播放多个声音

在Chrome中播放多个声音
EN

Stack Overflow用户
提问于 2011-12-22 23:56:13
回答 1查看 3.2K关注 0票数 3

我正在为脸书开发一个HTML5游戏。我有以下HTML代码:

代码语言:javascript
复制
<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:

代码语言:javascript
复制
if (this.hitFlag > 6) this.hitFlag = 1;
var soundElem = document.getElementById('sound-' + (this.soundFlag % 6) + '0' );
soundElem.play();

每次单击鼠标都会触发声音事件。问题出在Chrome上,在点击了十几次之后,声音就消失了,或者开始播放时有相当大的延迟(十几秒)。但在FF或Opera中播放时没有问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-23 02:41:51

这肯定是一个bug,但我认为它与实际元素有关,而不是声音播放部分。通过预加载音频,为每次播放声音实例化一个新的音频对象,最后在每个节拍检查声音对象,以确定它们是否已经播放完毕,以便清理内存,可以很容易地解决这个问题。

当然,预加载是这样的:

代码语言:javascript
复制
var _mySnd = new Audio('my/snd/file/is/here.mp3');

实例化类似于:

代码语言:javascript
复制
var _sndCollection = [];
var n = _sndCollection.length;

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

而清理检查将是:

代码语言:javascript
复制
for (var i = 0; i < _sndCollection.length; i++)
{
    if (_sndCollection[i].currentTime >= _sndCollection[i].duration)
    {
        _sndCollection.splice(i, 1);
        i--;
    }
}

我在我自己的HTML5游戏引擎中使用了类似的东西,到目前为止它工作得很好。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8606393

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档