Reproductor MP3 Fecha: 13/Ago/2003 (18/Sep/2003) |
. |
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.
- el código del programa es más corto pues nos ahorramos tener que crear con código los botones de control del reproductor (play, next, previous, stop) y sus eventos, ya que se pueden usar los que tiene incorporados el propio OCX de Media Player 9.
- al disponer de ventana de visualización, se pueden reproducir ficheros de vídeo (AVI...) y no solamente de música. Los ficheros de vídeo pueden ser vistos a pantalla completa con la combinación de teclas Alt+Intro.
- al disponer de ventana de visualización, tenemos a nuestra disposición el menú contextual del OCX de Media Player 9.
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 ClassImagen del programa en funcionamiento:
Fichero con el código de ejemplo usando Visual Studio .NET 2003 (miliuco_mp3con.zip - Tamaño 172 KB)