使用 js 和 R Shiny 解决这个问题的方法是创建一个单独的 js 函数来阻止声音播放。然后,每次你想开始一个新的声音,你首先还要调用声音停止函数 - 因此,任何以前播放的声音都会在新的声音开始之前停止。
library(shiny)
library(shinyjs)
ui <- fluidPage(
useShinyjs(),
extendShinyjs(script = "marbles.js", functions = c("marbles")),
extendShinyjs(script = "birds.js", functions = c("birds")),
extendShinyjs(script = "stopper.js", functions = c("stopper")),
column(10, offset = 1,
align = "center",
fluidRow(column(4,
align = "center",
column(10,
align = "center",
offset = 1,
br(),
actionButton('sound1','Sound 1', width = '100%',
style="color: #ffffff; background-color: #35467b; border-color: #2e1911"))),
column(4,
align = "center",
column(10,
align = "center",
offset = 1,
br(),
actionButton('sound2','Sound 2', width = '100%',
style="color: #ffffff; background-color: #1dbd6b; border-color: #1dbd6b"))),
column(4,
align = "center",
column(10,
align = "center",
offset = 1,
br(),
actionButton('stopper','Stop sounds', width = '100%',
style="color: #ffffff; background-color: #b73838; border-color: #b73838")))
)),
)
server <- function(input, output) {
observeEvent(input$sound1, {
js$stopper()
js$birds()
})
observeEvent(input$sound2, {
js$stopper()
js$marbles()
})
observeEvent(input$stopper, {
js$stopper()
})
}
# Run the application
shinyApp(ui = ui, server = server)
声音停止功能很简单:
shinyjs.stopper = function() {
snd.pause();
}
然后两个声音函数如下,但您在“新音频”部分插入自己的 base64 纯文本(要将 wav 转换为 base64,请参见例如:https://base64.guru/converter/encode/audio/wav)。所有的 javascript 函数都应该作为 js 文件保存在与您的应用程序相同的工作目录中名为“www”的文件夹中:
shinyjs.birds = function() {
snd = new Audio("data:audio/wav;base64,blablablabla");
snd.play();
}
shinyjs.marbles = function() {
snd = new Audio("data:audio/wav;base64,blablablabla");
snd.play();
}
简而言之,无论出于何种原因,在开始播放新声音的函数开头调用 sound.pause() 似乎都不起作用。相反,制作一个单独的函数来停止声音,然后再运行新的声音。