调用audio.pause()无法暂停音频的技术求助
调用audio.pause()无法暂停音频的技术求助
嘿,我一眼就发现问题出在哪了!
你当前的代码有个关键的逻辑漏洞:每次调用executeBackgroundMusic函数时,不管是执行start还是stop操作,都会新建一个全新的Audio实例。
举个例子:
- 当你调用
<<backmus start 01>>时,你创建了一个Audio实例并开始播放,同时把song ID存到了audioPlayer.currentlyPlaying里 - 但当你调用
<<backmus stop 01>>时,你又新建了一个完全独立的Audio实例,然后对这个新实例调用pause()——可这个新实例根本就没在播放啊!真正在播放的是你start时创建的那个旧实例,它完全不受这个新实例的pause操作影响,自然会继续播放。这也解释了为什么audioPlayer.currentlyPlaying会被清空,但音频停不下来。
audio.pause()本身是完全有效的暂停方法,你的问题不是方法不对,而是操作的对象错了。
给你修改后的代码方案:
var executeBackgroundMusic = function(action) { var operator = action.options[0] var song = music[action.options[1]]; if (operator == "start"){ // 新建音频实例并保存到audioPlayer中 var audio = new Audio(music[action.options[1]]); audioPlayer["currentlyPlaying"] = song; audioPlayer["activeAudio"] = audio; // 新增:保存正在播放的音频实例 audio.play(); audio.loop=true; } else if (operator == "stop") { // 直接使用之前保存的音频实例,不要新建 if (audioPlayer["activeAudio"]) { audioPlayer["activeAudio"].pause(); audioPlayer["activeAudio"].currentTime = 0; audioPlayer["currentlyPlaying"] = ""; audioPlayer["activeAudio"] = null; // 清空实例引用 } } }
这个方案的核心是:把正在播放的Audio实例持久保存起来,而不是每次操作都新建。这样stop操作时,才能精准地对那个正在播放的实例执行暂停和重置操作。
另外可以再加个小优化:如果你的项目需要同时处理多首音频,可以把activeAudio改成对象,用song ID作为key来存储不同的音频实例,这样就能支持多音频的独立控制啦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

