CREANDO UN OCX PARA REPRODUCIR VIDEO CON LA API MCISENDSTRING

 

Sucedió que necesité mucho mucho un ocx para reproducir video, pero no cualquier ocx: no debía depender de componentes instalados con anterioridad, lo que yo quería era un ocx que trabajara directamente con las Apis del windows.

Las Apis son funciones del propio Windows, guardadas dentro de los millones de Dlls en la carpeta de instalación (especialmente en la System32). Las Apis son casi un millar y lo hacen todo: obtienen información de los discos y las particiones, las características del escritorio, la pantalla, los colores, el hardware, los archivos, manejan multimedia, los periféricos, etc etc.

Poniendo en mis propias palabras lo que me dijo mi asesor de tesis: "Si quieres pasarte por encima del lenguaje de programación, ve y tócale los huevos a las Apis".

Rebuscando en internet, hallé muchos códigos fuentes que llamaban a las Apis que manejan multimedia: MciExecute, MciSendCommand y MciSendString.

De todas, la mejor es la MciSendString. La primera tiene opciones un tanto limitadas, la segunda requiere que se le pasen parámetros en hexadecimal, mientras que la última permite cadenas fácilmente entendibles.

Cómo funciona MciSendString:

Esta Api devuelve un valor tipo Long que es un código por si ocurre un error. Para saber qué error ha sido se llama a otra Api: mciGetErrorString, la cual no usé para este ocx.

En esta web lo ponen para un avi:

http://www.geocities.com/smigman.geo/mci/avi.html 

Y fue gracias a estos ejemplos que aprendí a usar la MciSendString:

http://www.recursosvisualbasic.com.ar/htm/utilidades-codigo-fuente/reproductor-de-video-con-mcisendstring.htm 

Lo primero que se debe hacer con esta Api es enviarle la ruta del archivo multimedia que se quiere reproducir:

"vid" es una variable tipo Long, "rutavideo" es una variable tipo String y contiene la ruta del archivo, algo así como:

C:\carpeta\ese_archivo.mpg 

 Lo que primero se hace es ponerle las comillas al principio y al final.

rutavideo = Chr$(34) & rutavideo & Chr$(34) 'para agregarle las comillas
vid = mciSendString("open " & rutavideo & " type mpegvideo alias movie parent " & Picture1.hWnd & " style " & "child ", 0, 0, 0)
vid = mciSendString("put movie window at 0 0 336 240", 0&, 0, 0)

La segunda y tercera líneas le dice que abra el archivo de esa ruta como un video del tipo mpeg (todos los videos que quería reproducir son mpegs) y que lo reconozca como "movie" porque así es más fácil de escribir (¡observad el espacio después de "open"! aquí hay que respetar los espacios!!). 

En esta segunda línea también se puede poner simplemente:

vid = mciSendString("open "& rutavideo & type mpegvideo alias movie", 0&, 0, 0)

Pero esto hará que cuando se reproduzca el video lo haga en una ventana Popup, y yo quería reproducirlo dentro de mi control ocx, así que por ello le incluí un Picturebox. La propiedad "Picture1.hWnd" devuelve un número tipo Long que es el identificador del control donde se desea reproducir el video (puede ser un form también), así se evita que aparezca esa ventana Popup. 

El resto de las instrucciones es más simple (basta recordar que ya la Api reconoce a nuestro archivo y su ruta como "movie"):

vid = mciSendString("play movie", 0, 0, 0)
vid = mciSendString("pause movie", 0, 0, 0)
vid = mciSendString("resume movie", 0, 0, 0)
vid = mciSendString("stop movie", 0, 0, 0)

Para reproducir desde un tiempo determinado ("tiempo" es una variable tipo Long):
vid = mciSendString("play movie from " & tiempo, 0, 0, 0)

Una muy importante es:
vid = mciSendString("close movie", 0, 0, 0)
Si no se "cierra" nuestro archivo, a la siguiente que se quiera reproducir no aparecerá. Esta instrucción debe estar en el evento Unload del form y cada vez que se quiere reproducir otro video.

Hasta aquí lo básico para hacer un reproductor con MciSendString. Ahora falta meterlo todo en un ocx, al cual llamé "video_rep".

Cómo crear un ocx está en esta web:

http://www.elguruprogramador.com.ar/articulos/creando-un-control-activex-ocx.htm

Lo que hice fué combinar ambas cosas: los comandos del MciSendString dentro de sus respectivas funciones en el ocx para luego "jalarlas" desde una aplicación.

El código fuente de video_rep y un ejemplo de cómo usarlo está akí.

Este ocx aún puede mejorarse y adaptarse. Quise hacerlo de modo que pudiera usarse con o sin Slider, bueno, yo sólo lo he probado con Slider.

Y ahora, una excelente web con recopilación de trillones de Apis:

Recomiendo mucho bajar el ApiViewer y el Api-Guide