Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

377
Views
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 ?
about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

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)
about 4 years ago · Juan Pablo Isaza Report

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
about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!