Reproductor MP3 Fecha: 13/Ago/2003 (13/Agosto/2003) Nota: Este artículo también puedes verlo en la revista MTJ.NET de Microsoft Latinoamérica |
. |
Este ejercicio muestra cómo usar el control ActiveX de Windows Media Player 9 incluyéndolo en una aplicación de Visual Basic .NET. Este control ActiveX nos proporciona funcionalidades de reproducción de archivos multimedia (mp3, wav, wma, avi, etc...) sin que tengamos que crear código específico para esas funciones.
Pasos para crear el ejercicio:
1- Instalar los programas necesarios:
— Microsoft Visual Basic .NET y Windows.NET Framework Software Development Kit (SDK): al instalar Visual Basic .NET se suele instalar también Windows.NET Framework Software Development Kit (SDK).
— Windows Media Player 9 Series: se trata de la versión a la que se refiere este ejercicio, versiones anteriores a la 9 no funcionarán adecuadamente.
— Windows Media Player 9 Series SDK, necesario para el desarrollo del programa, además contiene documentación de referencia, ejemplos de código, utilidades...2 - Añadir el control ActiveX al proyecto de Visual Basic .NET:
— en el cuadro de herramientas, mostrar la pestaña "Componentes".
— con el menú contextual "Agregar o quitar componentes" abrimos el diálogo "Personalizar cuadro de herramientas".
— en la pestaña "Componentes COM" buscamos y marcamos "Windows Media Player". Si no apareciese en la lista de componentes, con el botón "Examinar" navegamos en busca de la librería wmp.dll (suele estar en el directorio system32).
— de esa manera se añade un elemento nuevo en el cuadro de herramientas, llamado Windows Media Player, que permite ser incorporado al formulario como cualquier otra herramienta, bajo el nombre de AxWindowsMediaPlayer1, este nombre puede cambiarse por otro más útil, en el ejercicio que nos ocupa se denomina ocxPlayer y así aparece en el código.
— en el menú contextual "Propiedades" del control ocxPlayer elegimos "Seleccione un modo: Invisible", de esta manera el control no es mostrado en el formularo, aunque seguimos teniendo a nuestra disposición todas sus funcionalidades. Conviene marcar también "Inicio automático" y elegir el volumen por defecto que tendrá el reproductor al arrancar. Las demás opciones pueden dejarse como están.3 - Desarrollar nuestra aplicación. El código busca la construcción de los elementos necesarios ya que el control ActiveX está oculto:
— botones de control (abrir, reproducir, anterior, siguiente, detener, cerrar).
— etiquetas que muestran el título y el autor del archivo reproducido.
— etiquetas que muestran la duración total del archivo reproducido y el tiempo de reproducción transcurrido.4 - En el cuadro OpenFileDialog1 se filtran los archivos mediante 2 extensiones: MP3 y M3U (listas de reproducción de Wimamp), pero puedes ajustar estos filtros a tu gusto.
5 - Al usar el menú "Generar solución" tendremos en la carpeta correspondiente (por defecto \bin) 3 archivos:
— ejecutable de la aplicación (ejemplo: MP3 Player.exe).
— las librerías AxInterop.WMPLib.dll y Interop.WMPLib.dll.
Es necesario tener los 3 archivos juntos en la misma carpeta para que el programa funcione adecuadamente.6 - La manera de evitar la necesidad de las 2 librerías nombradas en el punto anterior sería instalando el PIA (primary interop assembly) de Windows Media Services en la Global Assembly Cache (GAC) y registrando después la librería mediante RegSvr32. Aunque hay documentación al respecto (ver este artículo de Microsoft), es un tema complejo que todavía no he sido capaz de solucionar.
A continuación se muestra el código principal en Visual Basic .NET:
Dim tiempo As DateTime ' para el tiempo transcurrido
Private Sub frmPlayer_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Me.Top = 80 ' posición y del formulario Me.Left = (Screen.PrimaryScreen.WorkingArea.Width - Me.Width) \ 4 ' posición x del formulario btPlay.Enabled = False End Sub ' Para abrir el cuadro de diálogo Private Sub btAbrir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btAbrir.Click abrirArchivo() End Sub ' Mostrar información de la canción al cambiar el estado del reproductor (PlayStateChange) ' al tener inicio automático, simplemente con elegir un archivo ya cambia el estado de reproducción Private Sub ocxPlayer_PlayStateChange(ByVal sender As Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles ocxPlayer.PlayStateChange tiempo = DateTime.Now ' para empezar a contar el tiempo ' vaciar la información de la canción anterior lbTitulo.Text = "" lbTituloa.Text = "Reproducción en curso:" lbAutor.Text = "" lbAutora.Text = "Autor" ' dependiendo del estado del reproductor Select Case e.newState Case WMPLib.WMPPlayState.wmppsPlaying ' si reproduciendo btStop.Enabled = True btPlay.Enabled = False btPrev.Enabled = True btNext.Enabled = True lbTituloa.Text = "Reproducción en curso:" lbTitulo.Text = ocxPlayer.currentMedia.getItemInfobyType("title", "", 0) ' título lbAutora.Text = "Autor:" lbAutor.Text = ocxPlayer.currentMedia.getItemInfobyType("author", "", 0) ' autor ' para mostrar la duración de la canción Dim minutos As Integer Dim segundos As Integer minutos = ocxPlayer.currentMedia.duration \ 60 ' división entera entre la duración en segundos y 60 ' resto entre la duración total y el resultado de la división entera anterior segundos = ocxPlayer.currentMedia.duration - (minutos * 60) lbTotal.Text = Format(minutos, "00") & ":" & Format(segundos, "00") Timer1.Enabled = True ' iniciar el temporizador para cronometrar la canción Timer1.Start() Case WMPLib.WMPPlayState.wmppsStopped ' si detenido btStop.Enabled = False ' desactivar botón Stop btPlay.Enabled = True ' activar botón Play btPrev.Enabled = False btNext.Enabled = False Timer1.Stop() ' detener temporizador Timer1.Enabled = False lbTotal.Text = "" lbTime.Text = "" End Select End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick ' Código para el cronómetro del tiempo del programa Dim Minutos, Segundos As Integer ' variables para mostrar el tiempo ' variable Segundos = diferencia en segundos entre una hora y la hora actual Segundos = DateDiff(DateInterval.Second, tiempo, DateTime.Now) Minutos = Segundos \ 60 Segundos = Segundos - (Minutos * 60) ' para que no supere 59 ' presentación formateada del tiempo transcurrido lbTime.Text = Format(Minutos, "00") & ":" & Format(Segundos, "00") End Sub ' Botón de Play Private Sub btPlay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPlay.Click ocxPlayer.Ctlcontrols.play() ' reproducir End Sub ' Para tocar la canción anterior Private Sub btPrev_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btPrev.Click ocxPlayer.Ctlcontrols.previous() ' anterior End Sub ' Para tocar la siguiente canción Private Sub btNext_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btNext.Click ocxPlayer.Ctlcontrols.next() ' siguiente End Sub ' Botón que detiene el reproductor Private Sub btStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btStop.Click ocxPlayer.Ctlcontrols.stop() ' detener reproducción End Sub ' Para cerrar el formulario Private Sub btCerrar_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btCerrar.Click 'End Close() End Sub ' --- PROCEDIMIENTO PARA SER UTILIZADO Private Sub abrirArchivo() ' procedimiento para abrir un archivo ' presentar al usuario un cuadro de diálogo Dim openFile As New OpenFileDialog ' mostrar solamente archivos M3U y MP3 openFile.Filter = "Listas de canciones (*.m3u)|*.m3u|Archivos Mpeg Layer 3 (*.mp3)|*.mp3" ' si elegimos algún archivo If openFile.ShowDialog() = DialogResult.OK Then ' abrir el archivo elegido en el reproductor ocxPlayer.URL = openFile.FileName End If End Sub ' Para mostrar el segundo formulario con el código Private Sub lbCode_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lbCode.Click Dim code As New Form2 ' crear una nueva instancia de la clase formulario code.ShowDialog() ' mostrar el formulario End Sub
Con este programa reproduzco de manera habitual listas de MP3 creadas desde Winamp o el propio Windows Media Player 9. Las clases utilizadas tienen muchas características no empleadas aquí, entre ellas manejo y edición de Playlists, obtención de mayor información sobre el archivo reproducido, etc. Programadores con más experiencia podrían hacer un programa mucho más completo, aquí solamente se ha intentado mostrar cómo, sin necesidad de tener conocimientos avanzados en Visual Basic .NET, es factible crear aplicaciones a priori tan complejas como un reproductor de archivos multimedia.
Imagen del programa en funcionamiento:
Fichero con el código de ejemplo usando Visual Studio .NET 2003 (miliuco_mp3sin.zip - Tamaño 355 KB)