如何在 R Shiny 中停止播放声音

问题描述 投票:0回答:1

播放声音时,我希望能够使用另一个按钮停止播放。或者当再次按下播放按钮时,声音的播放应该停止,然后从头开始播放。

我在 R Shiny 中使用闪亮js 努力实现这一点,但没有成功。这是我的代码:

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),

  shiny::actionButton('sound'  ,'Play sound'),
  shiny::actionButton('stopper','Stop sound')
)

server <- function(input, output) {
  observeEvent(input$sound, 
  {
    shinyjs::runjs("snd.pause();")
    shinyjs::runjs("var snd = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3'); snd.play();")
  })

  observeEvent(input$stopper, 
  {
    shinyjs::runjs("snd.pause();")
  })
}

shinyApp(ui = ui, server = server)

该代码的灵感来自以下代码:https://community.rstudio.com/t/how-to-stop-audio-with-shinyjs/122650.

因此,我们的想法是,在按下“播放声音”按钮后,可以使用“停止声音”按钮提前停止播放,或者当过早按下“播放声音”按钮时,播放应该停止并随后从头开始。

这有可能吗?

javascript r shiny shinyjs
1个回答
3
投票

解决方法很简单,你需要在调用

snd
之前全局定义
shinyjs
,而不是直接在
shinyjs
中定义它。

library(shiny)
library(shinyjs)

ui <- fluidPage(
    useShinyjs(),
    
    shiny::actionButton('sound'  ,'Play sound'),
    shiny::actionButton('stopper','Stop sound'),
    tags$script("var snd;")
)

server <- function(input, output) {
    observeEvent(input$sound, 
                 {
                     shinyjs::runjs("snd.pause();")
                     shinyjs::runjs("snd = new Audio('https://interactive-examples.mdn.mozilla.net/media/cc0-audio/t-rex-roar.mp3'); snd.play();")
                 })
    
    observeEvent(input$stopper, 
                 {
                     shinyjs::runjs("snd.pause();")
                 })
}

shinyApp(ui = ui, server = server)

原因是每个

runjs
位于不同的函数调用范围内;当你想在另一个
snd
中使用
runjs
时,它是
undefined
,因为当前作用域或父作用域没有这个变量,所以你要先全局定义它。您可能想搜索有关 JS 中作用域如何工作的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.