Libvlc.dll Working
Posted: Mon Oct 20, 2025 7:44 pm
Hola a Todos :
despues de 2 semanas luchando con hb_LibLoad("libvlc.dll") en 64 bits y que sus funciones den error , intentar con crear librerias estaticas "libvlc.a" teniendo el mismo resultado...no funciona.
usando ChatGPT pedi que me ayudara a usar libvlc con hb_libload sin ningun resulto con todos los ejemplos simples compilando Harbour 64 + Mingw 64 que se encuentra en la instalacion HMG 64.. todo sin resultado alguno..
procedí pedirle que que me hiciera un simple con de hb_loadlib() y entrego como resultado vlc_loadlib() que me devuelve correctamente todos los punteros de las funciones exportadas de libvlc.dll
.
al hacer vemos las funciones como ya tenia lo principal fue pedirle que me diga como usar esas funciones para poder usarla en el proyecto Camara que estoy implementando con el IDE de HMG y me da el resultado que agregue al Main.prg dentro del bloque
ya contento con el funcioanamiento correcto de libvlc voy a seguir con recuperar el video que esta encapsulado en RSP (todavia lo estoy implementado) , si quieren ver el proyecto lo voy a subir a Drive en un momento y compartirlo con uds para agegrar nuevas funciones
despues de 2 semanas luchando con hb_LibLoad("libvlc.dll") en 64 bits y que sus funciones den error , intentar con crear librerias estaticas "libvlc.a" teniendo el mismo resultado...no funciona.
usando ChatGPT pedi que me ayudara a usar libvlc con hb_libload sin ningun resulto con todos los ejemplos simples compilando Harbour 64 + Mingw 64 que se encuentra en la instalacion HMG 64.. todo sin resultado alguno..
procedí pedirle que que me hiciera un simple con de hb_loadlib() y entrego como resultado vlc_loadlib() que me devuelve correctamente todos los punteros de las funciones exportadas de libvlc.dll
al hacer vemos las funciones
Code: Select all
dumpbin /exports libvlc.dll | find "vlc_"Code: Select all
#pragma BEGINDUMP
#include "hbapi.h"
#include <windows.h>
#include <stdint.h> // para tipos enteros fijos
// --- Tipos básicos equivalentes ---
typedef int64_t libvlc_time_t;
// --- Funciones de libVLC ---
typedef void * (__cdecl *PFN_LIBVLC_NEW)(int, const char *const *);
typedef void (__cdecl *PFN_LIBVLC_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIA_NEW_PATH)(void *, const char *);
typedef void (__cdecl *PFN_LIBVLC_MEDIA_RELEASE)(void *);
typedef void * (__cdecl *PFN_LIBVLC_MEDIAPLAYER_NEW)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_RELEASE)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA)(void *, void *);
typedef int (__cdecl *PFN_LIBVLC_MEDIAPLAYER_PLAY)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_STOP)(void *);
typedef void (__cdecl *PFN_LIBVLC_MEDIAPLAYER_SETHWND)(void *, void *);
typedef libvlc_time_t (__cdecl *PFN_LIBVLC_MEDIAPLAYER_GET_TIME)(void *);
static HMODULE hVlc = NULL;
static PFN_LIBVLC_NEW pLibVLC_New = NULL;
static PFN_LIBVLC_RELEASE pLibVLC_Release = NULL;
static PFN_LIBVLC_MEDIA_NEW_PATH pLibVLC_Media_New_Path = NULL;
static PFN_LIBVLC_MEDIA_RELEASE pLibVLC_Media_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_NEW pLibVLC_MediaPlayer_New = NULL;
static PFN_LIBVLC_MEDIAPLAYER_RELEASE pLibVLC_MediaPlayer_Release = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA pLibVLC_MediaPlayer_Set_Media = NULL;
static PFN_LIBVLC_MEDIAPLAYER_PLAY pLibVLC_MediaPlayer_Play = NULL;
static PFN_LIBVLC_MEDIAPLAYER_STOP pLibVLC_MediaPlayer_Stop = NULL;
static PFN_LIBVLC_MEDIAPLAYER_GET_TIME pLibVLC_MediaPlayer_GetTime = NULL;
static PFN_LIBVLC_MEDIAPLAYER_SETHWND pLibVLC_MediaPlayer_SetHwnd = NULL;
// --- Carga la DLL y obtiene punteros ---
HB_FUNC( VLC_LOADLIB )
{
const char * path = hb_parc( 1 );
hVlc = LoadLibraryA( path ? path : "libvlc.dll" );
if( !hVlc )
{
hb_retl( HB_FALSE );
return;
}
pLibVLC_New = (PFN_LIBVLC_NEW) GetProcAddress( hVlc, "libvlc_new" );
pLibVLC_Release = (PFN_LIBVLC_RELEASE) GetProcAddress( hVlc, "libvlc_release" );
pLibVLC_Media_New_Path = (PFN_LIBVLC_MEDIA_NEW_PATH) GetProcAddress( hVlc, "libvlc_media_new_path" );
pLibVLC_Media_Release = (PFN_LIBVLC_MEDIA_RELEASE) GetProcAddress( hVlc, "libvlc_media_release" );
pLibVLC_MediaPlayer_New = (PFN_LIBVLC_MEDIAPLAYER_NEW) GetProcAddress( hVlc, "libvlc_media_player_new" );
pLibVLC_MediaPlayer_Release = (PFN_LIBVLC_MEDIAPLAYER_RELEASE) GetProcAddress( hVlc, "libvlc_media_player_release" );
pLibVLC_MediaPlayer_Set_Media = (PFN_LIBVLC_MEDIAPLAYER_SET_MEDIA) GetProcAddress( hVlc, "libvlc_media_player_set_media" );
pLibVLC_MediaPlayer_Play = (PFN_LIBVLC_MEDIAPLAYER_PLAY) GetProcAddress( hVlc, "libvlc_media_player_play" );
pLibVLC_MediaPlayer_Stop = (PFN_LIBVLC_MEDIAPLAYER_STOP) GetProcAddress( hVlc, "libvlc_media_player_stop" );
pLibVLC_MediaPlayer_GetTime = (PFN_LIBVLC_MEDIAPLAYER_GET_TIME) GetProcAddress( hVlc, "libvlc_media_player_get_time" );
hb_retl( pLibVLC_New != NULL );
}
// --- Libera la DLL ---
HB_FUNC( VLC_UNLOADLIB )
{
if( hVlc )
{
FreeLibrary( hVlc );
hVlc = NULL;
}
}
// --- Obtiene dirección de símbolo ---
HB_FUNC( VLC_GETSYMBOLADDRESS )
{
const char * name = hb_parc(1);
FARPROC addr = NULL;
if( hVlc && name )
addr = GetProcAddress( hVlc, name );
hb_retnll( (HB_LONGLONG)(LONG_PTR) addr );
}
// --- Crea una instancia de VLC ---
HB_FUNC( VLC_NEW )
{
void *inst = NULL;
if( pLibVLC_New )
inst = pLibVLC_New( 0, NULL );
hb_retnll( (HB_LONGLONG)(LONG_PTR) inst );
}
// --- Libera instancia ---
HB_FUNC( VLC_RELEASE )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_Release && inst )
pLibVLC_Release( inst );
}
// --- Reproduce un archivo ---
HB_FUNC( VLC_PLAYPATH )
{
void *inst = (void *)(LONG_PTR) hb_parnll(1);
const char *path = hb_parc(2);
void *media = NULL;
void *mp = NULL;
if( !inst || !path || !pLibVLC_Media_New_Path )
{
hb_retnll(0);
return;
}
media = pLibVLC_Media_New_Path( inst, path );
mp = pLibVLC_MediaPlayer_New( inst );
if( media && mp )
{
pLibVLC_MediaPlayer_Set_Media( mp, media );
pLibVLC_Media_Release( media );
pLibVLC_MediaPlayer_Play( mp );
}
hb_retnll( (HB_LONGLONG)(LONG_PTR) mp );
}
// --- Devuelve tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERGETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
hb_retnll( (pLibVLC_MediaPlayer_GetTime && mp) ?
(HB_LONGLONG)pLibVLC_MediaPlayer_GetTime( mp ) : 0 );
}
// --- Detiene reproducción ---
HB_FUNC( VLC_MEDIAPLAYERSTOP )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Stop && mp )
pLibVLC_MediaPlayer_Stop( mp );
}
// --- Libera reproductor ---
HB_FUNC( VLC_MEDIAPLAYERRELEASE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
if( pLibVLC_MediaPlayer_Release && mp )
pLibVLC_MediaPlayer_Release( mp );
}
// --- Asocia la ventana de reproducción (HWND) ---
// Permite reproducir el video dentro de un control HMG (ej. FrameVideo)
HB_FUNC( VLC_MEDIAPLAYERSETHWND )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1); // MediaPlayer
HWND hWnd = (HWND)(LONG_PTR) hb_parnll(2); // Handle de control HMG
if( pLibVLC_MediaPlayer_SetHwnd == NULL && hVlc )
{
// obtener dirección si no se cargó aún
pLibVLC_MediaPlayer_SetHwnd = (PFN_LIBVLC_MEDIAPLAYER_SETHWND)
GetProcAddress( hVlc, "libvlc_media_player_set_hwnd" );
}
if( pLibVLC_MediaPlayer_SetHwnd && mp && hWnd )
{
pLibVLC_MediaPlayer_SetHwnd( mp, (void *)hWnd );
}
}
/* ============================================================
Enlaces Harbour ↔ libVLC para controlar MediaPlayer
============================================================ */
HB_FUNC( VLC_MEDIAPLAYERSETMEDIA )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
void *pMedia = ( void * ) ( HB_PTRUINT ) hb_parnll( 2 );
if( pLibVLC_MediaPlayer_Set_Media != NULL && pMediaPlayer && pMedia )
pLibVLC_MediaPlayer_Set_Media( pMediaPlayer, pMedia );
}
HB_FUNC( VLC_MEDIAPLAYERPLAY )
{
void *pMediaPlayer = ( void * ) ( HB_PTRUINT ) hb_parnll( 1 );
if( pLibVLC_MediaPlayer_Play != NULL && pMediaPlayer )
hb_retni( pLibVLC_MediaPlayer_Play( pMediaPlayer ) );
else
hb_retni( -1 );
}
// --- Pausa la reproducción ---
HB_FUNC( VLC_MEDIAPLAYERPAUSE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pPause = GetProcAddress(hVlc, "libvlc_media_player_pause");
if( pPause && mp )
((void (__cdecl *)(void *))pPause)(mp);
}
// --- Verifica si está reproduciendo ---
HB_FUNC( VLC_MEDIAPLAYERISPLAYING )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pIsPlaying = GetProcAddress(hVlc, "libvlc_media_player_is_playing");
hb_retni( (pIsPlaying && mp) ? ((int (__cdecl *)(void *))pIsPlaying)(mp) : 0 );
}
// --- Ajusta el volumen ---
HB_FUNC( VLC_AUDIOSETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
int vol = hb_parni(2);
FARPROC pSetVol = GetProcAddress(hVlc, "libvlc_audio_set_volume");
if( pSetVol && mp )
((void (__cdecl *)(void *, int))pSetVol)(mp, vol);
}
// --- Obtiene el volumen actual ---
HB_FUNC( VLC_AUDIOGETVOLUME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetVol = GetProcAddress(hVlc, "libvlc_audio_get_volume");
hb_retni( (pGetVol && mp) ? ((int (__cdecl *)(void *))pGetVol)(mp) : -1 );
}
// --- Devuelve la duración total ---
HB_FUNC( VLC_MEDIAPLAYERGETLENGTH )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pLen = GetProcAddress(hVlc, "libvlc_media_player_get_length");
hb_retnll( (pLen && mp) ? ((libvlc_time_t (__cdecl *)(void *))pLen)(mp) : 0 );
}
// --- Cambia el tiempo actual ---
HB_FUNC( VLC_MEDIAPLAYERSETTIME )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
libvlc_time_t t = (libvlc_time_t)hb_parnll(2);
FARPROC pSetTime = GetProcAddress(hVlc, "libvlc_media_player_set_time");
if( pSetTime && mp )
((void (__cdecl *)(void *, libvlc_time_t))pSetTime)(mp, t);
}
// --- Cambia posición relativa (0.0–1.0) ---
HB_FUNC( VLC_MEDIAPLAYERSETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
float pos = (float)hb_parnd(2);
FARPROC pSetPos = GetProcAddress(hVlc, "libvlc_media_player_set_position");
if( pSetPos && mp )
((void (__cdecl *)(void *, float))pSetPos)(mp, pos);
}
// --- Obtiene posición relativa actual ---
HB_FUNC( VLC_MEDIAPLAYERGETPOSITION )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetPos = GetProcAddress(hVlc, "libvlc_media_player_get_position");
hb_retnd( (pGetPos && mp) ? ((float (__cdecl *)(void *))pGetPos)(mp) : 0.0 );
}
// --- Devuelve estado del reproductor ---
HB_FUNC( VLC_MEDIAPLAYERGETSTATE )
{
void *mp = (void *)(LONG_PTR) hb_parnll(1);
FARPROC pGetState = GetProcAddress(hVlc, "libvlc_media_player_get_state");
hb_retni( (pGetState && mp) ? ((int (__cdecl *)(void *))pGetState)(mp) : -1 );
}
#pragma ENDDUMP