JavaScript中播放下一个base64音频前停止所有正在播放音频的方法
解决方案
核心思路是将播放的音频实例存储在全局作用域中,每次调用播放函数前先终止之前的实例即可,修改后的代码如下:
// 全局存储当前正在播放的音频实例,可自定义变量名避免和其他脚本冲突 window.currentShinyAudio = null; shinyjs.soundmaker = function() { // 先终止之前正在播放的音频 if (window.currentShinyAudio) { window.currentShinyAudio.pause(); // 重置播放进度为0,下次从头播放 window.currentShinyAudio.currentTime = 0; window.currentShinyAudio = null; } // 新建音频实例并播放 window.currentShinyAudio = new Audio("data:audio/wav;base64,blablablabla"); // 可选:添加错误捕获避免播放失败报错 window.currentShinyAudio.play().catch(err => { console.warn("音频播放失败:", err); }); }
额外优化建议
- 如果需要动态传入不同的base64音频内容,可以给函数添加参数,R端调用时直接传入对应字符串即可,无需写死在JS代码中:
shinyjs.soundmaker = function(audioBase64) { // 前面的终止逻辑不变 if (window.currentShinyAudio) { window.currentShinyAudio.pause(); window.currentShinyAudio.currentTime = 0; window.currentShinyAudio = null; } window.currentShinyAudio = new Audio(audioBase64); window.currentShinyAudio.play(); }
R端调用示例:shinyjs::soundmaker("你的base64音频字符串")
- 如果需要多组音频独立控制(比如通知音、警告音分开终止),只需要新建不同的全局存储变量,对应不同的播放函数即可。
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

