none
MediaElement no carga el fichero multimedia RRS feed

  • Pregunta

  • Buenas tardes,

    Estoy intentando hacer un bucle que recorre un lote de ficheros de audio .mp3 y, sin reproducirlos, extrae la información de la duración de cada uno. Es para una app UWP por lo que trato de usar el mediaElement. El caso es que después de "cargar" la fuente o archivo de audio, siempre entrega 0 como duración del archivo, parece que haya que esperar a que termine el proceso que estableció el archivo mp3 para tener luego, a través de otro proceso u otra llamada, el tiempo del audio con la propiedad NaturalDuration.

    Si corro el código de abajo, el textBoock marcará 0, pero si lo vuelvo a correr una segunda vez ya me marca el valor real. ¿mediaElement.Source es síncrono no?

    Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click

            mediaElement.Source = New Uri("\\Mac\Home\Desktop\NOVEDADES01\AbrahamMateo-OldSchool.mp3")

            textBlock.Text = mediaElement.NaturalDuration.ToString

        End Sub

    También he provado a esperar dentro del mismo proceso hasta que la propiedad NaturalDuration tenga un valor > 0, pero no funciona, se queda en el bucle y parece que MediaElement.Source no termina de cargar el archivo, por lo que tampoco parece tener un comportamiento asíncrono.

    Private Sub button_Click(sender As Object, e As RoutedEventArgs) Handles button.Click

            mediaElement.Source = New Uri("\\Mac\Home\Desktop\NOVEDADES01\AbrahamMateo-OldSchool.mp3")

            Do

            Loop Until mediaElement.NaturalDuration.TimeSpan.TotalSeconds > 0

            textBlock.Text = mediaElement.NaturalDuration.ToString

        End Sub

    Agradezco a todos cualquier idea o comentario para poder hacer esta tarea, aunque sea utilizando otro camino. Gracias!!

    sábado, 16 de abril de 2016 17:26

Respuestas

  • Según la propia documentación de la propiedad NaturalDuration ésta no tiene valor hasta que se genera el evento MediaOpened.

    Lo único que se me ocurre es provocar el evento ejecutando el Play:

            Dim media As New MediaElement With{
                .Source=New Uri("\\Mac\Home\Desktop\NOVEDADES01\AbrahamMateo-OldSchool.mp3")
                }
            AddHandler media.MediaOpened,
                Sub(mediaControl, openedEventArgs)
                    textBlock.Text = media.NaturalDuration.ToString()
                End Sub
    
            media.LoadedBehavior = MediaState.Manual
            media.UnloadedBehavior = MediaState.Manual
            media.Play()
            media.Stop()
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 16 de abril de 2016 19:28
  • Hola,

    Puedes usar también WMPLib.WindowsMediaPlayer, para obtener el tiempo del archivo mp3.

    Ejemplo :

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim miRuta As String = "C:\Users\Joel\Desktop\Ludovico Einaudi - Nuvole Bianche.mp3"
    
            Dim media As New WindowsMediaPlayer
            Dim song As IWMPMedia = media.newMedia(miRuta)
    
            TextBox1.Text = song.durationString
    
        End Sub

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    sábado, 16 de abril de 2016 19:16

Todas las respuestas

  • Hola,

    Puedes usar también WMPLib.WindowsMediaPlayer, para obtener el tiempo del archivo mp3.

    Ejemplo :

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim miRuta As String = "C:\Users\Joel\Desktop\Ludovico Einaudi - Nuvole Bianche.mp3"
    
            Dim media As New WindowsMediaPlayer
            Dim song As IWMPMedia = media.newMedia(miRuta)
    
            TextBox1.Text = song.durationString
    
        End Sub

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    sábado, 16 de abril de 2016 19:16
  • Según la propia documentación de la propiedad NaturalDuration ésta no tiene valor hasta que se genera el evento MediaOpened.

    Lo único que se me ocurre es provocar el evento ejecutando el Play:

            Dim media As New MediaElement With{
                .Source=New Uri("\\Mac\Home\Desktop\NOVEDADES01\AbrahamMateo-OldSchool.mp3")
                }
            AddHandler media.MediaOpened,
                Sub(mediaControl, openedEventArgs)
                    textBlock.Text = media.NaturalDuration.ToString()
                End Sub
    
            media.LoadedBehavior = MediaState.Manual
            media.UnloadedBehavior = MediaState.Manual
            media.Play()
            media.Stop()
    


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    sábado, 16 de abril de 2016 19:28
  • Según la propia documentación de la propiedad NaturalDuration ésta no tiene valor hasta que se genera el evento MediaOpened.

    Lo único que se me ocurre es provocar el evento ejecutando el Play:

            Dim media As New MediaElement With{
                .Source=New Uri("\\Mac\Home\Desktop\NOVEDADES01\AbrahamMateo-OldSchool.mp3")
                }
            AddHandler media.MediaOpened,
                Sub(mediaControl, openedEventArgs)
                    textBlock.Text = media.NaturalDuration.ToString()
                End Sub
    
            media.LoadedBehavior = MediaState.Manual
            media.UnloadedBehavior = MediaState.Manual
            media.Play()
            media.Stop()


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    Gracias Asier. Buena opción pero resulta que si llamas a Play justo después de cargar el archivo con .Source, el Play no hace efecto alguno. Parece que no le diera tiempo a cargar, y si me espero en un bucle justo detrás de .Source, pues entra en él y ya no sale ni termina de cargarse el fichero. Un comportamiento algo raro en mi opinión, porque parece que .Source sea asíncrono, pero lo que he comprobado es que .Source no termina de hacer su trabajo hasta que no se se sale del procedimiento que lo llamó.

    sábado, 16 de abril de 2016 19:57
  • Hola,

    Puedes usar también WMPLib.WindowsMediaPlayer, para obtener el tiempo del archivo mp3.

    Ejemplo :

       Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim miRuta As String = "C:\Users\Joel\Desktop\Ludovico Einaudi - Nuvole Bianche.mp3"
    
            Dim media As New WindowsMediaPlayer
            Dim song As IWMPMedia = media.newMedia(miRuta)
    
            TextBox1.Text = song.durationString
    
        End Sub

    Resultado :

    Saludos.


    JC NaupaCrispín
    Lima - Perú

    La magia no existe, la programación SI


    Gracias Joel pero si no me equivoco el Windows Media Player no se puede emplear una aplicación Windows Universal. De todas formas voy a tratar de usarlo.
    sábado, 16 de abril de 2016 20:01