PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 22 → Classe de controle de VLC v2.1.x (VideoLAN) par LibVLC
Classe de controle de VLC v2.1.x (VideoLAN) par LibVLC
Débuté par Pat 16, 17 fév. 2017 11:05 - 5 réponses
//hostimage.webdev.info/avatars/9snccOz9j5C6hZiqJAHNGg
Membre enregistré
177 messages
Popularité : +3 (3 votes)
Posté le 17 février 2017 - 11:05
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.
//hostimage.webdev.info/avatars/VkjX08eqaaf0QMrNfQBw
Membre enregistré
307 messages
Popularité : +3 (5 votes)
Posté le 17 février 2017 - 15:21
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
//hostimage.webdev.info/avatars/9snccOz9j5C6hZiqJAHNGg
Membre enregistré
177 messages
Popularité : +3 (3 votes)
Posté le 17 février 2017 - 17:03
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.
//hostimage.webdev.info/avatars/384GgB4ahdbQbxdRHXazQ
Membre enregistré
618 messages
Popularité : +13 (13 votes)
Posté le 18 février 2017 - 08:06
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
//hostimage.webdev.info/avatars/9snccOz9j5C6hZiqJAHNGg
Membre enregistré
177 messages
Popularité : +3 (3 votes)
Posté le 18 février 2017 - 14:14
Merci JP, comme toujours rapide et efficace !
Un grand merci ça va bien m'aider.

BON DEV
//hostimage.webdev.info/avatars/EpzPwcGoKwsj1Ec6cjc6Cg
Membre enregistré
177 messages
Posté le 28 mars 2017 - 17:39
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