如何在R Shiny中实现音频播放的停止与重新播放功能
解决方案
你的需求完全可以实现,原代码的问题在于每次点击播放按钮都会创建一个新的Audio对象,且snd变量的作用域仅在当前JavaScript代码块内,导致暂停操作无法找到之前创建的音频实例,同时暂停后没有重置播放位置。
修正后的代码
library(shiny) library(shinyjs) ui <- fluidPage( useShinyjs(), # 提前在全局作用域定义音频对象,确保所有操作指向同一个实例 tags$script(HTML("var snd = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3');")), actionButton('sound', 'Play sound'), actionButton('stopper', 'Stop sound') ) server <- function(input, output) { observeEvent(input$sound, { # 先暂停当前播放、重置到开头,再重新播放 shinyjs::runjs(" snd.pause(); snd.currentTime = 0; snd.play(); ") }) observeEvent(input$stopper, { # 暂停播放并重置到开头 shinyjs::runjs(" snd.pause(); snd.currentTime = 0; ") }) } shinyApp(ui = ui, server = server)
关键改动说明
- 在UI中通过
tags$script提前定义全局的snd音频对象,避免每次点击都创建新实例 - 播放按钮逻辑:先暂停当前播放,将
currentTime设为0(重置到音频开头),再触发播放 - 停止按钮逻辑:暂停播放并重置到开头,保证下次播放从起始位置开始
最终实现效果:
- 点击「Stop sound」按钮可立即终止正在播放的音频
- 再次点击「Play sound」时,会先停止当前播放(如果存在),然后从头开始播放
内容的提问来源于stack exchange,提问作者WJH
相关产品推荐
相关产品推荐

