Reproducción de mp3 fácilmente en vb sin ocx

Fecha: 22/Dic/2002 (15/Jul/02)
Autor: Scythe <Scythe @ mail.ono.es>



Hola, hace mucho tiempo que conozco tu página y hace unas semanas buscando por ella encontré el interesante código de mi colega German Oltra sobre reproducción de archivos mp3 usando el mp3.dll.
Estuve estudiando el código y viendo si me sería útil para el engine gráfico de un juego que estaba haciendo bajo Direct Draw (definitivamente no lo fue, problemas al cerrar el thread, no obstante me sirvió bastante para ver el tema del multithreading en vb6, que consideraba excesivamente inestable).
El tema es que en vista de que no me servía del todo me dediqué a investigar el tema y no fue en otro lugar que en una página web en chino llena de ocx, encontré un interesante ocx que permitía manejar cd, mp3 y midi mediante vb de una forma simple. Pero aquí no acaba todo, me dediqué por curiosidad a desensamblar el ocx (era freeware) y descubrí curiosamente que entre sus string refs se ocultaba un llamativo "type MPEGVideo" así que decidí investigar más. No me costó mucho averiguar que se trataba de parte de una llamada a mciSendString, la típica API de manejo de multimedia contenida en el winmm.dll. Así pues, se me ocurrió probarlo y grande fue mi sorpresa al comprobar que no solo permitía la reproducción de archivos mp3 de forma asíncrona, sino que además permitía el uso de diferentes canales de audio (he llegado a reproducir con esto mp3, wavs y avis a la vez sin que se interrumpa el audio de ninguno y sin problemas). A pesar de ser MPEGVideo permite prácticamente lo que se le eche: me ha reproducido sin problema alguno tanto mp3, como wav como avis codificados con DivX como archivos mpeg (los archivos de vídeo los abre en una ventana nueva).

Este tipo curiosamente no sale en la lista especificada en el msdn, de hecho si buscamos "MPEGVideo" en el msdn no se muestran resultados, por lo que o bien es añadido por algún programa externo (de uso muy común tendrá que ser ya que en todos los pcs y windows en que lo he probado no ha dado problemas en ninguno) o es un tipo indocumentado de la función (cuántas cosas útiles nos deja indocumentadas microsoft... a saber qué hacen esas 126 funciones del kernel32 que ni siquiera tienen nombre o aquella CreateKernelThread de la cual no hay info en ninguna parte... y qué haríamos los que tocamos temas de programación gráfica sin las funciones indocumentadas de punteros en vb (VarPtr, etc., de hecho, la propia estructura DDSURFACEDESC2 contiene el miembro lpSurface que se usa para trabajar con punteros en superficies bloqueadas y este miembro no sale en la lista automática al pulsar el punto, tienes que escribirlo por tu cuenta sabiendo que existe del vc++, me estoy yendo de tema, volvamos al mp3)... ).

Un ejemplo de uso genérico sería este:
Call mciSendString("open " & Chr$(34) & RutaDelArchivo & Chr$(34) & " type MPEGVideo Alias " & AudioAlias, 0, 0, 0)
Call mciSendString("Play " & AudioAlias, 0, 0, 0)

Para reproducir varios sonidos simultáneamente, basta con usar diferentes strings en AudioAlias. Para parar un sonido simplemente habría que usar esto:

Call mciSendString("Close " & AudioAlias, 0, 0, 0)

Aquí como AudioAlias podría también especificarse la palabra "All", con lo que se cerrarían todos los alias abiertos por nuestro proceso. También puede usarse esta API para saber si el archivo está reproduciéndose de esta manera:

Dim mciAnswer As String * 8

Call mciSendString("Status " & AudioAlias & " Mode", mciAnswer, 8, 0)
If Left$(mciAnswer, 7) = "playing" Then Reproduciendo = True Else Reproduciendo = False

Así mismo, para una reproducción cíclica bastaría añadir al Play del primer caso la palabra repeat:
Call mciSendString("Play " & AudioAlias & " repeat", 0, 0, 0)

Debido a que para lo que yo quería no era necesario no he investigado el tema de saltar dentro del propio mp3, pero creo que también puede hacerse sin demasiadas complicaciones.

Eso es todo, espero que le sea de ayuda a mucha gente, he visto muchos ocx que prometen milagros y luego dan muchos problemas así como otros que te ponen propaganda en todas partes para que los registres, así como otros de pago.
Lo que siempre he dicho, por lo general la mayor parte de ocx son sustituibles por una o varias API que son más rápidas y dan muchas menos complicaciones.

Ya me dirás si te parece útil para subirlo a la web. Hasta otra.
 

 

Nota del Guille, 30/Abr/2005:
La dirección de correo ya no está como un link, pero si quieres escribirle, júntalo todo y funcionará.
 


ir al índice