PC SOFT

PROFESSIONAL NEWSGROUPS
WINDEVWEBDEV and WINDEV Mobile

Home → WINDEV 2024 → Classe de controle de VLC v2.1.x (VideoLAN) par LibVLC
Classe de controle de VLC v2.1.x (VideoLAN) par LibVLC
Started by Pat 16, Feb., 17 2017 11:05 AM - 8 replies
Registered member
351 messages
Popularité : +13 (17 votes)
Posted on February, 17 2017 - 11:05 AM
Bonjour à vous,

Pour lire des mp4 dans une appli j'utilise la classe LibVLC. qui est géniale.
Pour lire / Pause arrêter etc.. Ça marche d'enfer.

Le seul souci c’est quand j'ai voulu faire des positionnements dans la vidéo.
Pendant la lecture si je fais un :
oVLC:Timeset(nPos) // Avec nPos en milliseconde . Cela ne fonctionne pas la vidéo redémarre à 0.
Pourtant un oVLC:TimeGet() me retour bine une valeur cohérente!.

J'ai donc essayé avec oVLC:PositionSet(rReel) rReel entre 0 et 100 ... j'ai trouve sur le net que ce doit être un pourcentage !.
Et là aussi cela me redémarre la vidéo au départ. Et d'ailleurs la fonction oVLC:PositionGet() me retourne toujours 6 !!
J’ai fais les test avec la dernière version dispo ici
http://www.developpez.net/forums/d1106111/environnements-developpement/windev/contribuez/classe-clibvlc-videolan-windev/…

Quant au VLC j’ai le 2.2.4.
Alors c’est ou que je me trompe ??

Merci et BON DEV.
Registered member
945 messages
Popularité : +102 (110 votes)
Posted on February, 17 2017 - 3:21 PM
bonjour,
je ne sais pas si cela peut vous aider mais j'ai fait un test avec les dll (Win 7 - WD 20 - VLC 2.2.4)

hndDLL1, hndDLL2 sont des entiers système
i, vlcInstance, vlcMedia, vlcMediaPlayer est un entier
dllName1, dllName2 sont des chaînes

dllName1 = "C:\Program Files\VideoLAN\VLC\libvlccore.dll"
dllName2 = "C:\Program Files\VideoLAN\VLC\libvlc.dll"

hndDLL1 = LoadDLL(dllName1)
IF hndDLL1 = 0 THEN
Erreur(ErreurInfo(errComplet))
RETOUR
END

hndDLL2 = LoadDLL(dllName2)
IF hndDLL1 = 0 THEN
Erreur(ErreurInfo(errComplet))
DéchargeDLL(hndDLL1)
RETOUR
END

// create new vlc instance
vlcInstance = API(dllName2, "libvlc_new", 0, Null)
IF vlcInstance = 0 THEN
Erreur("Erreur d'exécution de : libvlc_new.")
DéchargeDLL(hndDLL2)
DéchargeDLL(hndDLL1)
RETOUR
END

// create new vlc media from file
vlcMedia = API(dllName2, "libvlc_media_new_path", vlcInstance, "c:\temp\test.mkv")
IF vlcMedia = 0 THEN
Erreur("Erreur d'exécution de : libvlc_media_new_path.")
IF vlcInstance <> 0 THEN API(dllName2, "libvlc_release", vlcInstance)
DéchargeDLL(hndDLL2)
DéchargeDLL(hndDLL1)
RETOUR
END

// create new vlc media player
vlcMediaPlayer = API(dllName2, "libvlc_media_player_new_from_media", vlcMedia)
IF vlcMedia = Null THEN
Erreur("Erreur d'exécution de : libvlc_media_player_new_from_media.")
API(dllName2, "libvlc_media_release", vlcMedia)
API(dllName2, "libvlc_release", vlcInstance)
DéchargeDLL(hndDLL2)
DéchargeDLL(hndDLL1)
RETOUR
END

// now no need the vlc media, free it
API(dllName2, "libvlc_media_release", vlcMedia)
vlcMedia = Null

// play media
API(dllName2, "libvlc_media_player_play", vlcMediaPlayer)

Multitâche(-200)

FOR i=1 _TO_ 6

Trace("--------------------------> "+i)
Multitâche(-50)

IF i = 4 THEN
API(dllName2, "libvlc_media_player_set_time", vlcMediaPlayer, 1000)
END

// Get the current movie length (in ms).
Movielength est un entier système = API(dllName2, "libvlc_media_player_get_length", vlcMediaPlayer)
Trace(ChaîneConstruit("Movie length : %1 ms", Movielength))

// Get the current movie time (in ms).
MovieTime est un entier système = API(dllName2, "libvlc_media_player_get_time", vlcMediaPlayer)
Trace(ChaîneConstruit("Movie time : %1 ms", MovieTime))
END

STOP

// Toggle pause
API(dllName2, "libvlc_media_player_pause", vlcMediaPlayer)
// run
API(dllName2, "libvlc_media_player_pause", vlcMediaPlayer)

// stop vlc media player
API(dllName2, "libvlc_media_player_stop", vlcMediaPlayer)

// and wait until it completely stops
WHILE API(dllName2, "libvlc_media_player_is_playing", vlcMediaPlayer) = 1
Multitâche(-100);
END;

API(dllName2, "libvlc_release", vlcInstance); vlcInstance = Null
DéchargeDLL(hndDLL2); hndDLL2 = Null
DéchargeDLL(hndDLL1); hndDLL1 = Null
Registered member
351 messages
Popularité : +13 (17 votes)
Posted on February, 17 2017 - 5:03 PM
Merci pour le réponse,,mais comme j'utilise déjà la classe LibVLC, suis pas très chaud pour refaire tous le code !
Mais je vais regarder de près quand votre code. Peut être ça va me donner une direction.

Bon DEV.
Registered member
962 messages
Popularité : +183 (185 votes)
Posted on February, 18 2017 - 8:06 AM
hello,
effectivement il y a un problème sur les fonctions PositionSet, PositionGet et TimeSet :

Pour la fonction PositionSet c'est un mauvais typage du paramètre de position passé :
c'est un float qu'il faut passer donc en WLangage il faut mettre un reel sur 4 octets.

En ce qui concerne les autres problèmes , c'est un mauvais appel de l'api qui semble être en cause.
Pour résoudre ces problèmes il faut passer par une description d' API ( possible à partir de windev 16)
voici ce que cela donne pour les 4 procédures de la classe clibvlc :

Procedure PositionGet()
SI PAS :mp ALORS
RENVOYER -1
FIN
//rRes est un réel sur 4 octets = API(:sDLL,"libvlc_media_player_get_position",:mp)
LibVLC_PositionGet is API Description
LibVLC_PositionGet..DLLName = :sDLL
LibVLC_PositionGet..FunctionName = "libvlc_media_player_get_position"
LibVLC_PositionGet..Parameter[1]..Type = apiSystemInt
LibVLC_PositionGet..TypeRetour = apiRéel_4
LibVLC_PositionGet..CallingConvention = CDECL
rRes est un réel sur 4 octets = LibVLC_PositionGet(:mp)
SI rRes < 0 ALORS
:AddToLog("PositionGet="+:GetError())
SINON
:AddToLog("PositionGet:" + rRes)
FIN
RENVOYER rRes



Procedure PositionSet(rPos est un réel sur 4 octets)
//API(:sDLL,"libvlc_media_player_set_position",:mp,rPos)
LibVLC_PositionSet is API Description
LibVLC_PositionSet..DLLName = :sDLL
LibVLC_PositionSet..FunctionName = "libvlc_media_player_set_position"
LibVLC_PositionSet..Parameter[1]..Type = apiSystemInt
LibVLC_PositionSet..Parameter[2]..Type = apiRéel_4
LibVLC_PositionSet..CallingConvention = CDECL
LibVLC_PositionSet(:mp,rPos)
:AddToLog("PositionSet:" + rPos)
RENVOYER 0


Procedure TimeGet()
// nRes est entier sur 8 octets = API(:sDLL,"libvlc_media_player_get_time",:mp)
LibVLC_TimeGet is API Description
LibVLC_TimeGet..DLLName = :sDLL
LibVLC_TimeGet..FunctionName = "libvlc_media_player_get_time"
LibVLC_TimeGet..Parameter[1]..Type = apiSystemInt
LibVLC_TimeGet..TypeRetour = apiEntier_8
LibVLC_TimeGet..CallingConvention = CDECL
nRes est un réel sur 8 octets = LibVLC_TimeGet(:mp)
:AddToLog("TimeGet:"+nRes)
RENVOYER nRes


Procedure TimeSet(nMSeconds est un entier sur 8 octets )
//API(:sDLL,"libvlc_media_player_set_time",:mp,nmSeconds)
LibVLC_TimeSet is API Description
LibVLC_TimeSet..DLLName = :sDLL
LibVLC_TimeSet..FunctionName = "libvlc_media_player_set_time"
LibVLC_TimeSet..Parameter[1]..Type = apiSystemInt
LibVLC_TimeSet..Parameter[2]..Type = apiInt_8
LibVLC_TimeSet..CallingConvention = CDECL
LibVLC_TimeSet(:mp,nMSeconds)
:AddToLog("TimeSet:" + nMSeconds)
RENVOYER 0


--
Ami calmant, J.P
Registered member
351 messages
Popularité : +13 (17 votes)
Posted on February, 18 2017 - 2:14 PM
Merci JP, comme toujours rapide et efficace !
Un grand merci ça va bien m'aider.

BON DEV
Registered member
945 messages
Popularité : +53 (63 votes)
Posted on March, 28 2017 - 5:39 PM
Bonjour,

j'aurais besoin de vos lumières afin de pouvoir ajouter une liste de fichier, j'ai conscience qu'il faut utiliser libvlc_media_list_add_media mais je ne vois pas comment m'y prendre.

Merci d'avance

jordan
Posted on August, 16 2018 - 10:10 AM
Bonjour,

Je suis confronté au même soucis avec la procédure PositionSet().

Windev me retourne une erreur en me disant que la que la DLL a provoqué une erreur d'execution.

Version de VLC 3.0.3 (32 bits)

merci pour votre aide !
Posted on October, 30 2019 - 5:48 PM
Bonjour,

Savez-vous comment je peux lire un fichier m3u avec le lecteur que vous proposez ?

Merci
Posted on May, 14 2021 - 3:51 AM
Bonjour,
En effet, la commande SetPosition ne fonctionne pas !
J'ai fait les modifications que vous avez mentionné mais cela ne fonctionne toujours pas !

J'ai déjà utilisé dans un de mes projets un ActiveX VLN et ça fonctionne bien mais dans ce nouveau projet, je souhaite faire des captures écran d'une vidéo à des endroits différents et aléatoires :
Je sais qu'il existe une méthode snapshot dans l'activeX VLN mais je ne sais pas comment l'utiliser car je n'ai pas trouvé de documentation :
AX_VLC>>video>>snapshot ...
Où AX_VLC est mon ActiveX

Si vous avez une idée

Je vous remercie d'avance ;)