You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 18:05:17