MP3 VB.NET (1)

Reproductor de MP3 en Visual Basic NET 2003

Esta aplicación usa el OCX de Windows Media Player 9 mediante la agregación de una referencia en el proyecto (el OCX se encuentra en la lista de objetos COM). En esta aplicación el OCX no se muestra al usuario y sus funciones se substituyen con botones y código propio. Es necesario tener instalado Windows Media Player 9 para poder ejecutar la aplicación generada. 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.

Los pasos requeridos para crear el ejercicio son:

Instalar los programas necesarios

  • Microsoft Visual Basic .NET 2003 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 con el código de esta aplicación.
  • Windows Media Player 9 Series SDK , necesario para el desarrollo del programa, además contiene documentación de referencia, ejemplos de código, utilidades…

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 esta 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” para que el control no sea mostrado en el formulario, 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.

Desarrollar la 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.

Cuadro de diálogo “Abrir archivo”:

En el cuadro de diálogo “Abrir archivo” OpenFileDialog1 se filtran los archivos mediante 2 extensiones: MP3 (archivos de audio MP3) y M3U (listas de reproducción de Winamp), pero estos filtros se pueden ajustar a nuestro gusto. Al estar oculto el control OCX de Windows Media Player, no existe ventana de visualización de archivos de vídeo, por lo que la extensión avi no se incluye en los filtros del control OpenFileDialog1.

Generar la solución

Al usar el menú “Generar solución” del editor de Visual Studio, tendremos en la carpeta correspondiente (por defecto bin) 3 archivos:

  • ensamblado 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.

Primary Interop Assembly (PIA)

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 dejo fuera de este ejercicio. Ello facilitaría la distribución de la aplicación a otros sistemas aunque, en su construcción actual, para poder usar la aplicación en ordenadores diferentes basta con tener Windows Media Player 9 instalado y transportar los 3 archivos nombrados (ensamblado *.exe, AxInterop.WMPLib.dll e Interop.WMPLib.dll) a una carpeta común.

Detalles del código

Para centrar horizontalmente por código el formulario, hay que dar el valor Manual a su propiedad StartPosition en la ventana de diseño de Visual Studio y escribir la siguiente línea de texto en el evento Load del formulario:

' posición x del formulario
Me.Left = (Screen.PrimaryScreen.WorkingArea.Width - Me.Width)  2

Al cambiar el estado del reproductor (playing, stopped…) se desencadena el evento PlayStateChange que, al ser detectado, nos permite mostrar información sobre la canción en curso. Como hemos seleccionado Inicio automático en las propiedades del OCX, simplemente con abrir 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
' dependiendo del estado del reproductor
Select Case e.newState
Case WMPLib.WMPPlayState.wmppsPlaying ' si reproduciendo
'...(código que hace algo)
Case WMPLib.WMPPlayState.wmppsStopped ' si detenido
'...(código que hace algo)
End Select
End Sub

El evento Tick del control Timer (Timer1) se configura para poder mostrar el tiempo de canción transcurrido contando los segundos pero aumentando en 1 el número de minutos cada vez que se superan los 59 segundos:

Dim tiempo As DateTime ' para el tiempo transcurrido

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
' Variables para mostrar el tiempo
Dim Minutos, Segundos As Integer
' Variable Segundos = diferencia en segundos entre una hora y la hora actual
Segundos = DateDiff(DateInterval.Second, tiempo, DateTime.Now)
Minutos = Segundos  60
' Para que no supere 59
Segundos = Segundos - (Minutos * 60)
' Presentación formateada del tiempo transcurrido
lbTime.Text = Format(Minutos, "00") + ":" + Format(Segundos, "00")
End Sub

Los botones de control del reproductor asocian su evento Click a métodos de Ctlcontrols, propiedad del control OCX:

' 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 abrir archivos se emplea un procedimiento definido en un bloque separado, en él se filtran por código las extensiones de archivo:

' 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

' Procedimiento para abrir un archivo
Private Sub abrirArchivo()
' 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

Utilidad de la aplicación

Con este programa reproduzco de manera habitual listas de MP3 creadas desde Winamp o el propio Windows Media Player 9. Las clases aquí utilizadas tienen muchas características no empleadas todavía, entre ellas manejo y edición de Playlists, obtención de mayor información sobre el archivo reproducido, etc.
Programadores con más experiencia pueden 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.

Anuncios