• Empleos
  • Sobre nosotros
  • profesionales
    • Inicio
    • Empleos
    • Cursos y retos
  • empresas
    • Inicio
    • Publicar vacante
    • Nuestro proceso
    • Precios
    • Evaluaciones
    • Nómina
    • Blog
    • Comercial
    • Calculadora de salario

0

298
Vistas
Extraiga la duración de los archivos de audio alojados en R (sin descargar el archivo)

Tengo una lista de archivos de audio alojados para los que me gustaría obtener la duración, sin tener que descargar los archivos.

Puedo hacer esto creando un elemento html DOM <audio> y extrayendo la duración con el duration de duración. Esto funciona muy bien en la siguiente aplicación brillante: al hacer clic en el botón "Hacer clic en mí", la duración se devuelve en una alerta.

 shinyApp( ui = fluidPage( useShinyjs(), actionButton("btn", "Click me"), tags$audio(id = "myaudio", src = "https://download.samplelib.com/mp3/sample-3s.mp3", type = "audio/mp3", autoplay = NA, controls = NA) ), server = function(input, output) { observeEvent(input$btn, { runjs("alert(myaudio.duration);") }) } )

Este es el punto en el que estoy atascado: ¿Cómo puedo aprovechar este método para extraer la duración de múltiples (> 1'000) mp3?

  1. ¿Cómo puedo reemplazar el src= e iterar una lista de mp3?
  2. ¿Cómo puedo escribir la duración para poder procesar esto en R ?
almost 3 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Esta respuesta solo funciona para un archivo de audio.

Para obtener la duración del audio e imprimirlo, necesitamos usar js , un entorno en shinyjs de la siguiente manera:

Defina get_duration como nuestro JS y especifique qué sucede cuando la entrada cambia a través Shiny.onInputChange . Aquí también he usado reactiveValues para almacenar duraciones en el cambio.

 library(shinyjs) library(shiny) get_duration <- 'shinyjs.aud_duration = function(params) { var duration = myaudio.duration; Shiny.onInputChange("aud_duration", duration); }' ui <- fluidPage( useShinyjs(), extendShinyjs(text = get_duration, functions = "aud_duration"), actionButton("btn", "Click me"), tags$audio(id = "myaudio", src = "https://download.samplelib.com/mp3/sample-3s.mp3", type = "audio/mp3", autoplay = NA, controls = NA), verbatimTextOutput("aud_duration") ) server <- function(input, output) { js$aud_duration() durations <- reactiveValues(duration = NA) observeEvent(input$btn, durations$duration <- input$aud_duration ) output$aud_duration <- renderText(durations$duration) } shinyApp(ui, server)
almost 3 years ago · Juan Pablo Isaza Denunciar

0

Gracias a la respuesta de @NelsonGon, que resolvió parte del problema, pude desarrollar una solución a mi problema que escala y, por lo tanto, funciona en múltiples URL. Resuelve los siguientes problemas:

  1. no espera a que un usuario haga clic en un botón, sino que intenta obtener la duración cada segundo hasta que lo logra (ya que los metadatos tardan un tiempo en descargarse)
  2. la aplicación brillante está envuelta en una función, de modo que se puede ingresar la URL de la fuente
  3. en caso de éxito, se devuelve el valor de duración
 get_duration <- function(src){ library(shinyjs) library(shiny) get_duration <- 'shinyjs.aud_duration = function(params) { var duration = myaudio.duration; Shiny.onInputChange("aud_duration", duration); }' ui <- fluidPage( useShinyjs(), extendShinyjs(text = get_duration, functions = "aud_duration"), tags$audio(id = "myaudio", src = src), ) server <- function(input, output) { js$aud_duration() durations <- reactiveValues(duration = NA) observe({ invalidateLater(1000) if(!is.null(isolate(input$aud_duration))){ stopApp(input$aud_duration) } }) } shiny::runGadget(ui, server) }

se puede ejecutar de la siguiente manera:

 get_duration("https://download.samplelib.com/mp3/sample-3s.mp3") [1] 3.239184
almost 3 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Nuestro proceso Comercial
Legal
Términos y condiciones Política de privacidad
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recomiéndame algunas ofertas
Necesito ayuda