none
Reproducir sonidos en Silverlight (MediaElement) RRS feed

  • Pregunta

  • ¡Hola!

    Estaba haciendo pruebas con el MediaElement y no consigo hacer que suene la copla ;-)

    A ver si alguién puede comentarme que estoy haciendo mal. Muchas gracias. Un saludo.

    Imports System.Windows.Resources
    
    
    
    Partial Public Class MainPage
    
     Inherits UserControl
    
    
    
     Public Sub New()
    
      InitializeComponent()
    
      PlaySonido(LayoutRoot)
    
     End Sub
    
     Dim WithEvents mp As MediaElement
    
     Friend Sub PlaySonido(ByVal LayoutRoot As Grid)
    
    
    
      Try
    
    
    
       mp = New MediaElement()
    
       Dim u As New Uri("Media/a-3-2.mp3", UriKind.Relative)
    
       Dim sri As StreamResourceInfo = Application.GetResourceStream(u)
    
       mp.SetSource(sri.Stream)
    
       mp.AutoPlay = False
    
       LayoutRoot.Children.Add(mp)
    
       mp.Position = System.TimeSpan.FromSeconds(0)
    
       mp.Play()
    
    
    
    
    
      Catch ex As Exception
    
    
    
      End Try
    
    
    
     End Sub
    
    
    
    End Class
    
    
    P.D.: Lo curioso es que no arroja ningún error.
    martes, 31 de agosto de 2010 17:26

Respuestas

  • Hola Corsario.

    He estado mirando esto, ya que he tenido que realizar algo similar, asi que te comento mis resultados.

    Por alguna razon que no he llegado a comprender (ya que no tengo tiempo de investigarlo) el codigo que tu expones no funciona debido a que el .play y el .Autoplay en la misma funcion y en ese orden no se llevan muy bien, supongo que esto sera debido que internamente hace uso de un componente COM del sistema para el acceso a multimedia y existe un posible retraso en algunas funciones.

    Bueno, esto no es problema, ya que si lo quieres reproducir en la misma funcion se establece el autoplay en true.

    asi que te pongo un codigo que funciona correctamente:

    Imports System.Windows.Resources
    
    Class MainWindow
    
      Public Sub New()
    
        InitializeComponent()
    
        PlaySonido(LayoutRoot)
    
      End Sub
    
    
      Dim WithEvents mp As MediaElement
    
      Friend Sub PlaySonido(ByVal LayoutRoot As Grid)
    
        Try
    
          mp = New MediaElement()
          mp.Name = "media"
    
          Dim u As New Uri("/SilverlightApplication3;component/Media/a-3-2.mp3", UriKind.Relative)
    
          Dim sri As StreamResourceInfo = Application.GetResourceStream(u)
    
          mp.SetSource(sri.Stream)
    
          mp.AutoPlay = False
    
          LayoutRoot.Children.Add(mp)
    
          mp.Position = System.TimeSpan.FromSeconds(0)
    
          'mp.Play()
    
    
        Catch ex As Exception
    
        End Try
    
      End Sub
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    
        CType(LayoutRoot.FindName("media"), MediaElement).Play()
    
      End Sub
    
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
        CType(LayoutRoot.FindName("media"), MediaElement).Stop()
      End Sub
    
    End Class
    
    

     

    Con el Play comentado funciona correctamente (bueno sin el play comentado tambien, pero hasta que no se pulsa un boton no se reproduce).

    Otra cosa importante, es que no se como tienes el proyecto y el mp3, yo en este ejemplo lo he metido dentro de una carpeta Media en el proyecto de silverlight y lo he establecido el .mp3 en Resources (propiedad build), de modo que la ruta a el, se establece como esta en el ejemplo "/ensamblado;component/ruta al archivo .mp3"

    Bueno, ya me comentaras que tal.

     


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    • Marcado como respuesta CorsarioVasco viernes, 10 de septiembre de 2010 18:11
    viernes, 10 de septiembre de 2010 8:18

Todas las respuestas

  • Me temo que algo anda perdido por ahí, tal vez en tu xaml.

    Aqui te paso dos referencias.

    http://code.msdn.microsoft.com/WPFmediaplayer

    http://msdn.microsoft.com/en-us/library/cc189078(VS.95).aspx

    Espero te ayuden, saludos,


    Microsoft Certified Technology Specialist .NET 3.5 WPF Application Development
    Proyecto en Codeplex
    World Wide Finalist Imagine Cup 2007
    C#, WPF, WCF
    LinkedIn
    martes, 31 de agosto de 2010 18:58
  • ¡Hola !

    Esas páginas ya las había visitado al ver que el invento no funcionaba. De todas formas, gracias por el aporte.

    Un saludo,

    jueves, 2 de septiembre de 2010 11:55
  • Hola Corsario.

    He estado mirando esto, ya que he tenido que realizar algo similar, asi que te comento mis resultados.

    Por alguna razon que no he llegado a comprender (ya que no tengo tiempo de investigarlo) el codigo que tu expones no funciona debido a que el .play y el .Autoplay en la misma funcion y en ese orden no se llevan muy bien, supongo que esto sera debido que internamente hace uso de un componente COM del sistema para el acceso a multimedia y existe un posible retraso en algunas funciones.

    Bueno, esto no es problema, ya que si lo quieres reproducir en la misma funcion se establece el autoplay en true.

    asi que te pongo un codigo que funciona correctamente:

    Imports System.Windows.Resources
    
    Class MainWindow
    
      Public Sub New()
    
        InitializeComponent()
    
        PlaySonido(LayoutRoot)
    
      End Sub
    
    
      Dim WithEvents mp As MediaElement
    
      Friend Sub PlaySonido(ByVal LayoutRoot As Grid)
    
        Try
    
          mp = New MediaElement()
          mp.Name = "media"
    
          Dim u As New Uri("/SilverlightApplication3;component/Media/a-3-2.mp3", UriKind.Relative)
    
          Dim sri As StreamResourceInfo = Application.GetResourceStream(u)
    
          mp.SetSource(sri.Stream)
    
          mp.AutoPlay = False
    
          LayoutRoot.Children.Add(mp)
    
          mp.Position = System.TimeSpan.FromSeconds(0)
    
          'mp.Play()
    
    
        Catch ex As Exception
    
        End Try
    
      End Sub
    
      Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button1.Click
    
        CType(LayoutRoot.FindName("media"), MediaElement).Play()
    
      End Sub
    
      Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles Button2.Click
        CType(LayoutRoot.FindName("media"), MediaElement).Stop()
      End Sub
    
    End Class
    
    

     

    Con el Play comentado funciona correctamente (bueno sin el play comentado tambien, pero hasta que no se pulsa un boton no se reproduce).

    Otra cosa importante, es que no se como tienes el proyecto y el mp3, yo en este ejemplo lo he metido dentro de una carpeta Media en el proyecto de silverlight y lo he establecido el .mp3 en Resources (propiedad build), de modo que la ruta a el, se establece como esta en el ejemplo "/ensamblado;component/ruta al archivo .mp3"

    Bueno, ya me comentaras que tal.

     


    Saludos
    David González
    MCP.
    Visita mi Blog en: http://www.dgzornoza.com/
    • Marcado como respuesta CorsarioVasco viernes, 10 de septiembre de 2010 18:11
    viernes, 10 de septiembre de 2010 8:18
  • ¡Hola David!

    Lo miro y te comento, pero adelanto: ¡Gracias por tomarte la molestia de mirarlo!

     

    Un abrazo,

     

     

    viernes, 10 de septiembre de 2010 16:43
  • Ya oigo. Ya oigoooooooo ;-).

     

    Gracias. Un abrazo,

     

    P.D.: Si me entero de porque se llevan mal te comento. En alguna de mis lecturas ya aparecerá ;-)

    viernes, 10 de septiembre de 2010 18:10
  • Dim sri As StreamResourceInfo = Application.GetResourceStream(u)

    Esta linea, traducida a c# seria:

    StreamResourceInfo sri = Application.GetResourceStream(u);

    Pero me da error en la siguiente linea y sri es null.

    El codigo seria asi:

    public MainPage()
            {
                InitializeComponent();
                MediaElement mp = new MediaElement();
                mp.Name = "media";
                Uri u = new Uri("australia.mp3", UriKind.Relative);
    
                //Dim sri As StreamResourceInfo = Application.GetResourceStream(u)
    
                StreamResourceInfo sri = Application.GetResourceStream(u);
    
                //StreamResourceInfo sri = Application.GetResourceStream(u);
                //StreamResourceInfo sri = new StreamResourceInfo(Application.GetResourceStream,'mp3');
                //En la siguiente linea da error ya que sri esta en null
                mp.SetSource(sri.Stream);
                mp.AutoPlay = false;
                LayoutRoot.Children.Add(mp);
                mp.Position = System.TimeSpan.FromSeconds(0);
    
                this.LayoutRoot.Children.Add(mp);
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
    
                
                //mp.Play();
                ((MediaElement)LayoutRoot.FindName("media")).Play();
            }

    Y lo tengo incluido en el proyecto como un item existente. En el visual studio sale con una camara como icono.

    • Editado Karmak84 martes, 22 de enero de 2013 16:29
    martes, 22 de enero de 2013 16:26
  • Hola Karmak.

    Si el audio es un recurso de tu aplicacion y no es un recurso online, (para el modo en el que lo quieres hacer) debes establecer en las propiedades del archivo de audio -> opciones de compilacion -> 'Recurso' (OJO: no recurso incrustado) ya que tu vas a usar una funcion para obtener el stream de un recurso.

    Luego, la url deberias de establecerla mas completa, algo asi:

    Uri u = new Uri("SilverlightApplication2;component/australia.mp3", UriKind.RelativeOrAbsolute);

    Donde la ruta se compone de 'NombreProyecto;component/rutaRecurso'.

    Con esto te deberia de funcionar correctamente.

    NOTA: he oservado que añades 2 veces el mediaelement como hijo a LayoutRoot, esto te dara un error, de modo que debes comentar la ultima linea para evitar añadirlo 2 veces:

    //this.LayoutRoot.Children.Add(mp);


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    miércoles, 23 de enero de 2013 7:43
  • Gracias por contestar, ahora no me da el error de la Uri, pero sin embargo no me reproduce el sonido.

    El codigo es el siguiente

    public MainPage()
            {
                InitializeComponent();
                MediaElement mp = new MediaElement();
                mp.Name = "media";
    
                StreamResourceInfo sri = Application.GetResourceStream(new Uri("SilverlightApplication5;component/australia.mp3", UriKind.RelativeOrAbsolute));
                mp.SetSource(sri.Stream);
                mp.AutoPlay = false;
                LayoutRoot.Children.Add(mp);
                mp.Position = System.TimeSpan.FromSeconds(0);
                mp.Volume = 1;
            }
    
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                ((MediaElement)LayoutRoot.FindName("media")).Play();
            }


    El archivo lo tengo dentro de SilverlightApplication y de SilverlightApplication.Web
    • Editado Karmak84 miércoles, 23 de enero de 2013 8:12
    miércoles, 23 de enero de 2013 8:10
  • Hola Karmak.

    El archivo de audio no hace falta tenerlo en la web si ya lo tienes en el proyecto silverlight como recurso, ya que se incluira dentro de la DLL resultante y puedes acceder mediante el modo que usas (ahora bien, el ejecutable final de descarga aumentara, ya que tambien esta el audio).

    Yo he probado el codigo y funciona bien. ¿has establecido la opcion de compilacion del audio en recurso?, si es asi y al pulsar el boton se ejecuta la linea con el play(), deberia de funcionarte.

    si puedes pasar el proyecto o exponer la aplicacion silverlight desde la web para probarlo te podria ayudar mas.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    miércoles, 23 de enero de 2013 9:41
  • Te puedo pasar el proyecto. dime como y lo hago.
    miércoles, 23 de enero de 2013 9:49
  • Hola Karmak.

    por ejemplo puedes subirlo a tu skydrive y me lo descargo o enviamelo a mi correo (puedes verlo en mi blog)


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    miércoles, 23 de enero de 2013 10:37
  • Hola Karmak.

    He visto el proyecto y esta bien, solo falta seleccionar el audio en el explorador de soluciones y pulsar F4 para mostrar las propiedades, tras lo cual estableces en recurso para las opciones de compilacion.

    Ademas existe un problema con el archivo de audio, no con todos los reproductores se oye, supongo que sera tema de codecs, de modo que he probado abrirlo con Audacity (editor de audio) y abre la onda pero no la reproduce, es como si estubiera defectuosa, si pruebas con otro audio deberia de funcionar correctamente.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    miércoles, 23 de enero de 2013 11:50
  • Cuando hablas de recurso quieres decir Resource? A mi no me sale la opcion de Recurso y ya lo tnego en Resource si la respuesta es si.

    La verdad es que ese audio puede estar mal porque al crearlo se hizo en wav y yo manualmente lo cambie a mp3 cuando lei que solo acepta mp3 o wmp


    • Editado Karmak84 miércoles, 23 de enero de 2013 12:34
    miércoles, 23 de enero de 2013 12:33
  • Hola Karmak.

    Si, es en resoure, es que el ejemplo que me has pasado no lo tenia, pero en cualquier caso si no lo tienes en resource te dara error.

    De modo que solo te falta un audio bueno, he probado lo que comentas y es cierto, el archivo es wav, si le cambio la extension si se habre bien en el editor. No puedes cambiarle la extension a un archivo, aunque wav actua como un contenedor de diferentes formatos mediante la implementacion de RIFF, no basta con cambiar la extension. En windows una extension solo indica el programa con el cual se ejecuta un archivo, de modo que si cambias la extension entre formatos de audio, seguira abriendose con el mismo programa y al analizar la cabecera es posible que seleccione el codec adecuado, pero esto no es valido para silverlight, ya que no puede reproducir todos los formatos de audio.

    Para modificar el audio y cambiarlos de formato puedes usar Audacity, que es un programa muy bueno y openSource:

    http://audacity.sourceforge.net/

    con el podras abrir el wav y guardarlo en mp3 mediante su plugin correspondiente que tienes que descargar aparte.


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/

    miércoles, 23 de enero de 2013 13:00
  • Si si, gracias ya lo sabia pero era una prueba rapida. He cambiado el audio por un mp3 autentico y ha funcionado correctamente. Lo mio esta solucionado muchas gracias.
    miércoles, 23 de enero de 2013 13:15