IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez Discussion :

FFPlayer pour WD16 à WD26


Sujet :

Contribuez

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut FFPlayer pour WD16 à WD26
    Ci-joint

    Projet modifié du player vidéo pour qu'il puisse fonctionner avec les versions WinDev 16 à 26 y compris 100j

    N'oubliez pas de mettre FFplay.exe dans le dossier "Exe" du projet, et d'utiliser le mode 64-bit.

    J'espère n'avoir rien oublié, car j'ai été obligé de convertir le code "à la main" pour qu'il marche sous WD16...
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 959
    Points : 9 300
    Points
    9 300
    Par défaut
    hello,
    premiers tests :
    1 - je n'ai pas une configuration 64 bits en utilisant les fichiers du zip -> création d'une configuration 64 bits.
    2 - Le redimensionnement ne semble pas fonctionner -> les champs ne suivent pas le redimensionnement (pourtant il y a bien les ancrages dans les champs).

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J.P

    Il faut enlever le code qui se trouve dans

    Changement de taille (WM_SIZE) de WIN_Main
    //WindowRedraw(gP.hMain)
    //RESULT 1


    C'est un oubli.

    J'ignore pourquoi WD16 ne reste pas en config 64-bit (ce qui est obligatoire) peut être parce que je n'ai pas copié le dossier FFP_16.cpl, pour réduire la taille du zip...

    Note : Il faut également débrancher tous les gadgets de type FAA, GFI et télémétrie.

  4. #4
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 959
    Points : 9 300
    Points
    9 300
    Par défaut
    OK cela fonctionne maintenant. Par contre si pendant que l'on joue une vidéo on iconifie la fenêtre et qu'on la restaure la vidéo n'est plus présente.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J.P

    J'ai testé en 16, çà marche chez moi.

    Par contre j'ai fait une modif, qui correspond au cas suivant :

    1 - Fenêtre gP.hMain maximizée avec une vidéo entrain de jouer.
    2 - On presse BTN_FullScreen ou la touche "F" depuis la vidéo.
    3 - Dans la vidéo on presse "F" pour revenir en mode fenêtré.
    4 - La caption bar de la fenêtre gP.hPlayer devient visible

    Pour corriger ce problème modifier le code de TimerProc de la façon suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    PROCEDURE TimerProc()
    IF gP.IsIconize THEN RETURN
    
    IF gP.hPlayer THEN
    	IF IsWindow(gP.hPlayer) THEN	
    		rM is RECT
    		rP is RECT
    		GetWindowRect(gP.hMain, rM)
    		GetWindowRect(gP.hPlayer, rP)
    		IF Height(rP) >= Height(rM) THEN
    			IF IsWindowVisible(gP.hMain) THEN ShowWindow(gP.hMain, SW_HIDE)
    		ELSE
    			IF IsWindowVisible(gP.hMain) = 0 THEN
    				ShowWindow(gP.hMain, SW_SHOW)
    				ResizeWindow(gP.hPlayer)
    				BringWindowToTop(gP.hPlayer)
    			END
    		END
    		
    		IF gP.duration THEN ReadSeekerPos()
    		
    	ELSE // FFplayer has been closed ...
    		gP.hPlayer = 0
    		IF BTN_Pause..Visible THEN BTN_Pause..Visible = False
    		IF BTN_Step..Visible THEN BTN_Step..Visible = False
    		IF BTN_Mute..Visible THEN BTN_Mute..Visible = False
    		IF BTN_Quit..Visible THEN BTN_Quit..Visible = False
    		LIB_Duration = DURATION_NUL; LIB_Seeker = DURATION_NUL; gP.duration = 0; gP.seeker = 0; Gauge..Value = 0
    		BringWindowToTop(gP.hMain)
    	END
    END
    FocusChange(0,0,0)
    CenterDialog()
    A titre d'exemple, j'ai créé une vidéo avec FFmpeg pour documenter une application (la capture vidéo fera l'objet d'un autre projet).
    La vidéo est enregistrée au format "webm" pour réduire la taille tout en préservant la qualité
    Voici le lien pour la tester (à ne pas faire aux heures de pointes)
    http://www.objreader.com/download/video/Mbox64.webm

    Note : MBox64 est un projet GDImage écrit en C++

  6. #6
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 182
    Points : 278
    Points
    278
    Par défaut
    bonjour,

    tout fonctionne correctement mise à part le phénomène décrit ci-dessous

    • Double clic sur la barre de titre
    • Clic sur le bouton agrandissement de la fenêtre
    • "Tirez" la fenêtre avec la souris par la barre de titre


    la fenêtre se redimensionne (réduction de taille) et une barre blanche apparait tout en haut au dessus voir image jointe

    Nom : 2021-07-30 10_15_58-Window.png
Affichages : 127
Taille : 4,8 Ko

    on peut aussi voir que le fait d'agrandir la fenêtre en double-clic sur le titre de la fenêtre que le design des boutons ne suit pas ci-après la fenêtre est non maximisée suite au test ci-dessus

    Nom : 2021-07-30 10_20_13-Window.png
Affichages : 130
Taille : 4,3 Ko
    Cordialement JeAn-PhI

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Merci pour le retour

    Il faut éviter le traitement par défaut et modifier les 2 procédures ci-dessous de la façon suivante :

    Survol souris (WM_MOUSEMOVE de WIN_Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    p is POINT
    param is int = 0; Transfer(&param, &_EVE.lParam, 4)
    p.x = LOINT(param); p.y = HIINT(param)
    IF p.y < Caption_bar..Height AND p.y > 0 THEN
    	IF IsLButtonDown() THEN
    		SendMessageA(gP.hMain, WM_NCLBUTTONDOWN, HTCAPTION, 0)
    		ResizeWindow(gP.hPlayer)
    		RESULT 1
    	END
    END
    Bouton gauche double-clic (WM_LBUTTONDBLCLK) de WIN_Main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    p is POINT
    param is int = 0; Transfer(&param, &_EVE.lParam, 4)
    p.x = LOINT(param); p.y = HIINT(param)
    IF p.y < Caption_bar..Height AND p.y > 0 THEN
    	IF BTN_Maximize..Visible THEN
    		ExecuteProcess(BTN_Maximize, trtClick)
    	ELSE
    		ExecuteProcess(BTN_Restore, trtClick)
    	END
    	RESULT 1
    END
    RESULT 1, bloque le traitement par défaut qui met la zone.

  8. #8
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 182
    Points : 278
    Points
    278
    Par défaut
    tout à l'air fonctionnel de mon côté en WD19
    Cordialement JeAn-PhI

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Tant mieux, merci !

    J'ai fait, une petite modif pour pouvoir cliquer sur la barre de progression WinDev.

    Bouton gauche enfoncé (WM_LBUTTONDOWN) de Gauge
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    IF gP.hPlayer THEN
    	p is POINT
    	param is int = 0; Transfer(&param, &_EVE.lParam, 4)
    	p.x = LOINT(param); p.y = HIINT(param)
    	param = MAKLNG(p.x + 20, p.y + 100)
    	API(USER32, "PostMessageA", gP.hPlayer, WM_RBUTTONDOWN, 0x0002, param)
    	API(USER32, "PostMessageA", gP.hPlayer, WM_RBUTTONUP, 0, param)
    END

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 182
    Points : 278
    Points
    278
    Par défaut
    fonction MAKLNG inconnue
    Cordialement JeAn-PhI

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    A mettre dans Flat_APi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FUNCTION MAKLNG(LOCAL nLow is 2-byte int, LOCAL nHigh is 2-byte int)
    nRet is int = 0 //MakeInteger(nHigh, nLow)
    Transfer(&nRet, &nLow, 2)
    Transfer(&nRet + 2, &nHigh, 2)
    RESULT nRet

  12. #12
    Membre actif
    Homme Profil pro
    Inscrit en
    Janvier 2003
    Messages
    182
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 182
    Points : 278
    Points
    278
    Par défaut
    ok merci ce n'est pas super précis mais cela fonctionne
    Cordialement JeAn-PhI

  13. #13
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 959
    Points : 9 300
    Points
    9 300
    Par défaut
    hello,
    Patrice cela marche bien chez toi le positionnement de la vidéo par le clic sur la gauge ? Moi ça fait un peu n'importe quoi (même quand j'utilise le clic droit dans la vidéo). Peut être à cause de ma vidéo qui ne fait que 416x224 comme taille d'origine et qui donc est étirée.

    EDIT : Dans la doc de FFPlay c'est écrit :
    right mouse click
    Seek to percentage in file corresponding to fraction of width.
    si c'est un positionnement par rapport au fichier et pas à la durée ça risque de ne pas être juste si le bitrate vidéo n'est pas constant.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J.P

    Je fais mes tests avec des vidéos de films en full HD (Alita, Avatar, etc).
    Je simule une pression sur le bouton droit de la souris, puisque c'est ce qui est indiqué dans la doc de FFplay.
    Chez moi le clic droit souris sur la vidéo fonctionne bien.

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Je pense qu'il est peut être possible d'améliorer la précision du déplacement en utilisant l"API
    Mouse_Event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0)
    Mouse_Event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0)
    en liaison avec SetCursorPos.

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    Je viens de faire un test avec le code ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    IF gP.hPlayer THEN
    //	p is POINT
    //	param is int = 0; Transfer(&param, &_EVE.lParam, 4)
    //	p.x = LOINT(param); p.y = HIINT(param)
    //	param = MAKLNG(p.x + 20, p.Y + 100)
    //	API(USER32, "PostMessageA", gP.hPlayer, WM_RBUTTONDOWN, 0x0002, param)
    //	API(USER32, "PostMessageA", gP.hPlayer, WM_RBUTTONUP, 0, param)
     
    	lp is POINT
    	GetCursorPos(lp)
    	SetCursorPos(lp.x + 5, lp.y + 100)
    	SetFocusAPI(gP.hPlayer)
    	mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, Null)
    	mouse_event(MOUSEEVENTF_RIGHTUP,   0, 0, 0, Null)
    	SetCursorPos(lp.x, lp.y)
    END
    Mais il semble que ce soit le code de FFplay.exe qui détecte le clic sur le bouton droit qui manque de précision, et sur çà je ne peux pas faire grand chose.

    Pour tester ajouter dans Flat_API

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PROCEDURE mouse_event(LOCAL dwFlags is unsigned int, LOCAL dx is int, LOCAL dy is int, LOCAL dwData is unsigned int, dwExtraInfo is system int)
    API(USER32, "mouse_event", dwFlags, dx, dy, dwData, dwExtraInfo)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    FUNCTION SetCursorPos(LOCAL x is int, LOCAL y is int)
    nRet is int = API(USER32, "SetCursorPos", x, y)
    RESULT nRet

  17. #17
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 959
    Points : 9 300
    Points
    9 300
    Par défaut
    hello,
    il semblerait que le problème de précision sur le positionnement de la vidéo soit dû à FFPlay. En effet il semblerait que ffplay quand on lui demande de se positionner à un instant donné, se positionne à la trame de référence en cours (keyframe I). En voici la preuve :
    J'ai une vidéo qui a les keyframes suivantes au début :
    frame|key_frame=1|pkt_pts_time=0.000000
    frame|key_frame=1|pkt_pts_time=2.502500
    frame|key_frame=1|pkt_pts_time=5.005000
    frame|key_frame=1|pkt_pts_time=6.506500
    frame|key_frame=1|pkt_pts_time=9.009000
    frame|key_frame=1|pkt_pts_time=10.885875
    frame|key_frame=1|pkt_pts_time=13.388375
    frame|key_frame=1|pkt_pts_time=15.015000
    frame|key_frame=1|pkt_pts_time=17.392375
    si je lance la commande suivante qui doit positionner la vidéo à 9 secondes :
    ffplay -ss 00:09 -hide_banner jurassicpark.mp4
    et bien la vidéo part à 6.5 secondes ce qui correspond à la keyframe en cours à 9 secondes.
    Le phénomène sera plus marqué sur une vidéo courte et dépendra des keyframes présentes dans le fichier vidéo.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J.P

    Merci pour le retour.

    Je pense que pour une application pilotée de l'extérieur le résultat n'est pas trop mal.
    Surtout qu'on peut jouer un très large éventail de formats vidéo.
    Et le mode fenêtré (GUI) est plus simple à utiliser que le mode pure console.
    J'ai quelques idées pour rendre le player encore plus convivial, mais çà impliquerait l'utilisation de GDImage qui peut fonctionner en mode composé (DWM), ce qui n'est pas le cas de WinDev.

    Note : On peut améliorer un peu plus l'affichage de la barre de progression, si on utilise des valeurs bornes à la place du pourcentage.
    bone..min = 0, borne..max = gP.duration et qu'on utilise la variable T pour gP.seeker

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    486
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 486
    Points : 875
    Points
    875
    Par défaut
    J'ai fait quelques tests avec GDImage en mode composited et çà marche nickel !

    Du coup je peux faire du drag and drop depuis l'explorateur et afficher des informations ou des images par dessus la vidéo.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    FUNCTION GDImageCallback(LOCAL hWnd is system int, LOCAL Msg is int, LOCAL wParam is unsigned int, LOCAL lParam is system int)
    nRet is int = False
    IF Msg = WM_DROPFILES THEN
    	IF (DragQueryFile(wParam, 0xFFFFFFFF, Null, 0) > 0) THEN
    		szFile is string UNICODE on MAX_PATH
    		IF DragQueryFile(wParam, 0, &szFile, MAX_PATH) THEN
    			sfile is string = UnicodeToAnsi(szFile)
    			sExt is string = Lower(fExtractPath(sfile, fExtension)) + Dot				
    			IF StringCount(".mp4.wmv.avi.webm.mkv.mov.", sExt) THEN
    				EDT_video = sfile
    				StartPlayer(Quote + sfile + Quote)
    				IF gP.hPlayer THEN
    					IF BTN_Play..Visible = False THEN BTN_Play..Visible = True
    					IF BTN_Pause..Visible = False THEN BTN_Pause..Visible = True
    					IF BTN_Step..Visible = False THEN BTN_Step..Visible = True
    					IF BTN_Mute..Visible = False THEN BTN_Mute..Visible = True
    					IF BTN_Quit..Visible = False THEN BTN_Quit..Visible = True
    					SetFocusAPI(gP.hPlayer)
    				END
    			END
    		END
    	END
    	DragFinish(wParam);	
    	nRet = 1
    END
    hWnd = 0; Msg = 0; wParam = 0; lParam = 0;
    RESULT nRet

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/06/2021, 11h41
  2. Réponses: 3
    Dernier message: 08/11/2011, 15h48
  3. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  4. Tutoriels et liens pour le Borland Database Engine
    Par Community Management dans le forum Paradox
    Réponses: 0
    Dernier message: 25/03/2002, 10h23
  5. Réponses: 2
    Dernier message: 20/03/2002, 23h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo