Reproductor MP3
[Usando el control ActiveX de Microsoft Windows Media Player 9 Series
]

Ejercicio en que el control ActiveX, a diferencia de mi anterior ejercicio también llamado "Reproductor MP3", se muestra visible en el formulario, por lo que no es necesario crear con código los botones de control del reproductor: play, stop, next, previous, ya que se usan los que tiene incorporados el propio OCX

A partir de las propuestas de Jim Travis (New Media Platforms Division) en el artículo "Playing Digital Media in a Visual Basic .NET Application" de febrero de 2003

Fecha: 13/Ago/2003 (18/Sep/2003)
Autor: Miliuco (
Emilio Pérez Egido) - emi@miliuco.com

 
.

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: Full (default)", de esta manera el control es mostrado en el formulario. Esto tiene algunas ventajas:

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.

4 - En el cuadro OpenFileDialog1 se filtran los archivos mediante 3 extensiones: MP3, M3U (listas de reproducción de Wimamp) y AVI, 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:





' REPRODUCTOR DE MP3, AVI Y M3U --- OCX visible --- 29/Mayo/2003

Public Class frmPlayer
    Inherits System.Windows.Forms.Form

#Region " Código generado por el Diseñador de Windows Forms "

    Public Sub New()
        MyBase.New()

        'El Diseñador de Windows Forms requiere esta llamada.
        InitializeComponent()

        'Agregar cualquier inicialización después de la llamada a InitializeComponent()

    End Sub

    'Form reemplaza a Dispose para limpiar la lista de componentes.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    'Requerido por el Diseñador de Windows Forms
    Private components As System.ComponentModel.IContainer

    'NOTA: el Diseñador de Windows Forms requiere el siguiente procedimiento
    'Puede modificarse utilizando el Diseñador de Windows Forms. 
    'No lo modifique con el editor de código.
    Friend WithEvents Panel2 As System.Windows.Forms.Panel
    Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog
    Friend WithEvents lbTitulo As System.Windows.Forms.Label
    Friend WithEvents lbAutor As System.Windows.Forms.Label
    Friend WithEvents ocxPlayer As AxWMPLib.AxWindowsMediaPlayer
    Friend WithEvents ToolTip1 As System.Windows.Forms.ToolTip
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
    Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem
    Friend WithEvents MenuItem2 As System.Windows.Forms.MenuItem
    Friend WithEvents MenuItem3 As System.Windows.Forms.MenuItem
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.components = New System.ComponentModel.Container
        Dim resources As System.Resources.ResourceManager = New System.Resources.ResourceManager(GetType(frmPlayer))
        Me.Panel2 = New System.Windows.Forms.Panel
        Me.lbAutor = New System.Windows.Forms.Label
        Me.lbTitulo = New System.Windows.Forms.Label
        Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog
        Me.ocxPlayer = New AxWMPLib.AxWindowsMediaPlayer
        Me.ToolTip1 = New System.Windows.Forms.ToolTip(Me.components)
        Me.MainMenu1 = New System.Windows.Forms.MainMenu
        Me.MenuItem1 = New System.Windows.Forms.MenuItem
        Me.MenuItem2 = New System.Windows.Forms.MenuItem
        Me.MenuItem3 = New System.Windows.Forms.MenuItem
        Me.Panel2.SuspendLayout()
        CType(Me.ocxPlayer, System.ComponentModel.ISupportInitialize).BeginInit()
        Me.SuspendLayout()
        '
        'Panel2
        '
        Me.Panel2.BackColor = System.Drawing.SystemColors.Control
        Me.Panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D
        Me.Panel2.Controls.Add(Me.lbAutor)
        Me.Panel2.Controls.Add(Me.lbTitulo)
        Me.Panel2.Location = New System.Drawing.Point(8, 264)
        Me.Panel2.Name = "Panel2"
        Me.Panel2.Size = New System.Drawing.Size(320, 56)
        Me.Panel2.TabIndex = 4
        '
        'lbAutor
        '
        Me.lbAutor.BackColor = System.Drawing.SystemColors.Control
        Me.lbAutor.FlatStyle = System.Windows.Forms.FlatStyle.Flat
        Me.lbAutor.Font = New System.Drawing.Font("Verdana", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.lbAutor.ForeColor = System.Drawing.Color.Navy
        Me.lbAutor.Location = New System.Drawing.Point(8, 32)
        Me.lbAutor.Name = "lbAutor"
        Me.lbAutor.Size = New System.Drawing.Size(304, 16)
        Me.lbAutor.TabIndex = 3
        Me.lbAutor.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        Me.ToolTip1.SetToolTip(Me.lbAutor, "Intérprete de la canción")
        '
        'lbTitulo
        '
        Me.lbTitulo.BackColor = System.Drawing.SystemColors.Control
        Me.lbTitulo.FlatStyle = System.Windows.Forms.FlatStyle.Flat
        Me.lbTitulo.Font = New System.Drawing.Font("Verdana", 8.25!, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, CType(0, Byte))
        Me.lbTitulo.ForeColor = System.Drawing.Color.Navy
        Me.lbTitulo.Location = New System.Drawing.Point(8, 8)
        Me.lbTitulo.Name = "lbTitulo"
        Me.lbTitulo.Size = New System.Drawing.Size(304, 16)
        Me.lbTitulo.TabIndex = 1
        Me.lbTitulo.TextAlign = System.Drawing.ContentAlignment.MiddleCenter
        Me.ToolTip1.SetToolTip(Me.lbTitulo, "Título de la canción")
        '
        'OpenFileDialog1
        '
        Me.OpenFileDialog1.RestoreDirectory = True
        '
        'ocxPlayer
        '
        Me.ocxPlayer.Enabled = True
        Me.ocxPlayer.Location = New System.Drawing.Point(8, 8)
        Me.ocxPlayer.Name = "ocxPlayer"
        Me.ocxPlayer.OcxState = CType(resources.GetObject("ocxPlayer.OcxState"), System.Windows.Forms.AxHost.State)
        Me.ocxPlayer.Size = New System.Drawing.Size(320, 248)
        Me.ocxPlayer.TabIndex = 3
        Me.ocxPlayer.TabStop = False
        '
        'ToolTip1
        '
        Me.ToolTip1.AutomaticDelay = 300
        '
        'MainMenu1
        '
        Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.MenuItem1, Me.MenuItem2, Me.MenuItem3})
        '
        'MenuItem1
        '
        Me.MenuItem1.Index = 0
        Me.MenuItem1.Text = "Abrir archivo"
        '
        'MenuItem2
        '
        Me.MenuItem2.Index = 1
        Me.MenuItem2.Text = "Ver código"
        '
        'MenuItem3
        '
        Me.MenuItem3.Index = 2
        Me.MenuItem3.Text = "Salir"
        '
        'frmPlayer
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
        Me.ClientSize = New System.Drawing.Size(334, 324)
        Me.Controls.Add(Me.Panel2)
        Me.Controls.Add(Me.ocxPlayer)
        Me.FormBorderStyle = System.Windows.Forms.FormBorderStyle.Fixed3D
        Me.Icon = CType(resources.GetObject("$this.Icon"), System.Drawing.Icon)
        Me.MaximizeBox = False
        Me.Menu = Me.MainMenu1
        Me.Name = "frmPlayer"
        Me.StartPosition = System.Windows.Forms.FormStartPosition.Manual
        Me.Text = "MP3 | M3U | AVI"
        Me.Panel2.ResumeLayout(False)
        CType(Me.ocxPlayer, System.ComponentModel.ISupportInitialize).EndInit()
        Me.ResumeLayout(False)

    End Sub

#End Region

    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
    End Sub

    ' Mostrar información de la canción al cambiar el estado del reproductor (PlayStateChange)
    ' al tener autostart = true simplemente con elegir un archivo cambia el estado de reproducción
    Private Sub ocxPlayer_PlayStateChange(ByVal sender As System.Object, ByVal e As AxWMPLib._WMPOCXEvents_PlayStateChangeEvent) Handles ocxPlayer.PlayStateChange
        ' vaciar la información de la canción anterior
        lbTitulo.Text = ""
        lbAutor.Text = ""
        Dim cadena As String ' para guardar la extensión del archivo (3 últimos caracteres)
        ' Math.Max sive para evitar errores si la cadena mide menos de 3 caracteres (índice negativo)
        cadena = ocxPlayer.URL.Substring(Math.Max(0, ocxPlayer.URL.Length - 3))
        If Not cadena = "avi" Then ' si no es un AVI mostrar toda la información
            lbTitulo.Text = ocxPlayer.currentMedia.getItemInfobyType("title", "", 0) ' título
            lbAutor.Text = ocxPlayer.currentMedia.getItemInfobyType("author", "", 0) ' autor
        ElseIf cadena = "avi" Then ' si es un AVI mostrar sólo el título
            lbAutor.Text = ""
        End If
    End Sub

    ' Abre el cuadro de diálogo
    Private Sub MenuItem1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItem1.Click
        ' presentar al usuario un cuadro de diálogo
        Dim openFile As New OpenFileDialog
        ' mostrar solamente archivos M3U, MP3 y AVI
        openFile.Filter = "Listas de canciones (*.m3u)|*.m3u|Archivos Mpeg Layer 3 (*.mp3)|*.mp3|Archivos de vídeo (*.avi)|*.avi"
        ' si elegimos algún archivo
        If openFile.ShowDialog() = DialogResult.OK Then
            ' abrir el archivo elegido en el reproductor
            ocxPlayer.URL = openFile.FileName
            ' vaciar la información de la canción anterior
            lbTitulo.Text = ""
            lbAutor.Text = ""
        End If
    End Sub

    ' Muestra el segundo formulario
    Private Sub MenuItem2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItem2.Click
        Dim code As New Form2   ' crear una nueva instancia de la clase formulario
        code.ShowDialog() ' mostrar el formulario
    End Sub

    ' Cierra el formulario
    Private Sub MenuItem3_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MenuItem3.Click
        Close()
    End Sub

End Class

Imagen del programa en funcionamiento:

 

Fichero con el código de ejemplo usando Visual Studio .NET 2003 (miliuco_mp3con.zip - Tamaño 172 KB)


ir al índice