Lib Video

Programmation d'applications complexes
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Lib Video

Message par Chris »

Petit début pour ma lib vidéo.

Pour le moment, il y a une dizaine de fonctions pour les opérations de base, au final, la lib devrait avoir environ une cinquantaine de fonctions.

Dans la mesure du possible, j'ai repris à peu près la syntaxe de la librairie Movie.

Si vous voulez tester... et surtout me dire si il y a un problème chez vous
http://www.cgsoftwares.com/PureBasic/PrgForum/Video.zip

Le fichier .res dans le dossier Residents, le fichier de lib dans le dossier UserLibraries, bref, c'est comme d'habitude
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

C'est coool ! #good Je suis entrain de la mettre a la place des procedures MCI
Si j'utilise ta lib j'aurai le problème des fenetres pas fraiches qui se rafraichissent pas ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, la lib ne prendra pas en charge le rafraichissement des fenêtres. C'est à toi de le faire.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Mais euuh !
Moi j'ai po envie de le faire d'abord en plus ! :P
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, mais si je fais une lib qui prends tout en charge, ça ne serai plus une lib, ce sera un player. Si c'est pour faire ça, autant aller sur telecharger.com, il y a tout un tas de players à télécharger. :)
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Bah non, il sera pas comme les autres, ca sera le player de Chris !
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message par Flype »

de toutes facons ca revient au meme puisqu'en principe chris va nous faire 1) la lib video pour ceux qui veulent programmer leur player et 2) le programme de son cru fait avec sa lib. Chacun prendra donc ce qui l'intéresse. :wink:

la lib video marche très bien chez moi avec l'exemple fournit 8)
et le processeur est à 65% pendant la lecture d'un film :wink:
Dernière modification par Flype le dim. 19/déc./2004 19:38, modifié 1 fois.
Image
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Il y a une nouvelle version en ligne, à la même adresse que la précédente.

J'ai essayé de débugger au maximum, mais j'en ai certainement oublié.

Concernant la fenêtre d'affichage, par exemple, j'ai fait des essais sur la fenêtre par défaut créée par MCI, mais aucun sur une fenêtre créée par le programme.

J'éliminerai les bugs au fur et à mesure, si quelqu'un m'en rapporte. autrement, ça restera comme ça.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

J'ai utilisé la lib dans mon player et ca marche bien avec un UC a 60% environ. Avec l'exemple fourni, 20%.
Mais bon, mon PC est un peu undercloacké (je sais pas si ca se dit) sérieux, c'est vrai ! Meme si ca n'a aucun intéret... :lol:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Je viens de tester en faisant afficher une vidéo dans la fenêtre qui supporte les commandes.

Ca a l'air de plutôt bien fonctionner aussi. :D

Tu peux l'essayer et me dire ce que ça donne??

Pour passer en plein ecran, tu cliques sur le bouton, et pour revenir en mode fenêtre, tu appuies sur Espace.

Utilise ce code, avec la nouvelle version de la lib.

Code : Tout sélectionner

; IncludeFile "VideoLib.pb"
; IncludeFile "Video_Res.pb"

;- Constantes Fenêtres
Enumeration
  #Win_Player
EndEnumeration

;- Constantes Gadgets
Enumeration
  #Btn_Eject
  #Btn_Load
  #Btn_Pause
  #Btn_Stop
  #Txt_Title
  #Progress
  #Frame0
  #Frame1
  #Btn_Play
  #Btn_FullScreen
  #Trk_Seek
  #Trk_LeftVolume
  #Trk_RightVolume
  #Trk_GeneralVolume
EndEnumeration

;- Constantes diverses
#Video = 0
#PBM_SETRANGE32 = #WM_USER + 6
#PBM_GETRANGE   = #WM_USER + 7

;- Constantes StatusBar
Enumeration
  #Status
EndEnumeration

;- Variables
Global hSeek, hProg, hPlayer, Change
Global Re.RECT

;- Procédures
Procedure Open_Win_Player()
  If OpenWindow(#Win_Player, 299, 97, 490, 600,  #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "Multi_Player")
    ;155
    hWinPlayer = WindowID(#Win_Player)
    
    If CreateStatusBar(#Status, WindowID())
      AddStatusBarField(150)
      AddStatusBarField(150)
      StatusBarText(#Status, 0, "Durée : 00:00:00")
      StatusBarText(#Status, 1, "Ecoulé : 00:00:00")
    EndIf
    
    If CreateGadgetList(WindowID())
      ButtonGadget(#Btn_Eject, 305, 105, 50, 20, "Ejecter")
      GadgetToolTip(#Btn_Eject, "Supprimer le fichier")
      ButtonGadget(#Btn_Load, 355, 105, 50, 20, "Charger")
      GadgetToolTip(#Btn_Load, "Charger un fichier unique")
      ButtonGadget(#Btn_Pause, 160, 105, 50, 20, "Pause")
      GadgetToolTip(#Btn_Pause, "Mettre le fichier en pause")
      ButtonGadget(#Btn_Stop, 210, 105, 50, 20, "Stop")
      GadgetToolTip(#Btn_Stop, "Arrêter la lecture")
      TextGadget(#Txt_Title, 10, 25, 395, 20, "", #PB_Text_Center | #PB_Text_Border)
      hProg = ProgressBarGadget(#Progress, 10, 50, 395, 10, 0, 10, #PB_ProgressBar_Smooth)
      Frame3DGadget(#Frame0, 5, 5, 405, 60, "Fichier en cours")
      Frame3DGadget(#Frame1, 5, 65, 405, 65, "Commandes ")
      ButtonGadget(#Btn_Play, 110, 105, 50, 20, "Lecture")
      GadgetToolTip(#Btn_Play, "Lire le fichier ouvert")
      ButtonGadget(#Btn_FullScreen, 10, 105, 50, 20, "Full")
      GadgetToolTip(#Btn_FullScreen, "Lire la vidéo en mode Plein Ecran")
      hSeek = TrackBarGadget(#Trk_Seek, 10, 80, 395, 20, 0, 10)
      GadgetToolTip(#Trk_Seek, "Déplacer le point de lecture de la vidéo")
      hLVol = TrackBarGadget(#Trk_LeftVolume, 415, 5, 20, 125, 0, 1000, #PB_TrackBar_Vertical)
      GadgetToolTip(#Trk_LeftVolume, "Modifier le volume gauche")
      
      hRVol = TrackBarGadget(#Trk_RightVolume, 435, 5, 20, 125, 0, 1000, #PB_TrackBar_Vertical)
      GadgetToolTip(#Trk_RightVolume, "Modifier le volume droit")
      
      hGVol = TrackBarGadget(#Trk_GeneralVolume, 465, 5, 20, 125, 0, 1000, #PB_TrackBar_Vertical)
      GadgetToolTip(#Trk_GeneralVolume, "Modifier le volume général")
      
    EndIf
    ProcedureReturn hWinPlayer
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
  Select uMsg
    Case #WM_TIMER
      Select idEvent
        Case 1
          StatusBarText(#Status, 1, "Ecoulé : " + GetTime(VideoPosition(#Video)))
          SetGadgetState(#Progress, VideoPosition(#Video))
          SetGadgetState(#Trk_Seek, VideoPosition(#Video))
          
          SetGadgetState(#Trk_LeftVolume, VideoGetLeftVolume(#Video))
          SetGadgetState(#Trk_RightVolume, VideoGetRightVolume(#Video))
          SetGadgetState(#Trk_GeneralVolume,VideoGetVolume(#Video))
          
      EndSelect
  EndSelect
EndProcedure

Procedure CallBack(Hnd,msg,wParam,lParam)
  Resultat = #PB_ProcessPureBasicEvents
  If Hnd = WindowID(#Win_Player)
    Select msg
      Case #WM_MOVE
        InvalidateRect_(Hnd,@Re,#False)
      Case #WM_PAINT
        InvalidateRect_(Hnd,@Re,#False)
    EndSelect
  EndIf
  
  ProcedureReturn Resultat 
EndProcedure 

;- Programme
hPlayer = Open_Win_Player()
If hPlayer = 0 : End : EndIf

SetWindowCallback(@CallBack())

ReportErrors(#True)

Repeat;{
  Select WaitWindowEvent()
    Case #WM_KEYDOWN
      If GetAsyncKeyState_(#VK_SPACE) And Full = 1
        RestoreVideo(#Video)
        Full = 0
      EndIf
      
      
    Case #PB_EventGadget
      Select EventGadgetID()
        Case #Btn_Eject
          If VideoLoaded
            StopVideo(#Video)
            FreeVideo(#Video)
            
            SetGadgetState(#Progress, 0)
            SetGadgetState(#Trk_Seek, 0)
            StatusBarText(#Status, 0, "Durée : 00:00:00")
            StatusBarText(#Status, 1, "Ecoulé : 00:00:00")
            SetGadgetText(#Txt_Title, "")
            
            KillTimer_(hPlayer, 1)
          EndIf
          
        Case #Btn_Load
          Film$ = OpenFileRequester("Ouvrir une vidéo","Fichiers vidéo","Fichiers vidéo|*.wmv;*.avi;*.mpg|Tout type|*.*",0)
          If Film$
            If LoadVideo(#Video, Film$)
              SetVideoFormat(#Video, #VIDEO_MSECONDE)
              StatusBarText(#Status, 0, "Durée : " + GetTime(VideoLength(#Video)))
              SendMessage_(hProg,#PBM_SETRANGE32,0,VideoLength(#Video))
              SendMessage_(hSeek,#TBM_SETRANGEMAX,#True,VideoLength(#Video))
              SetGadgetText(#Txt_Title, GetTitle(Film$))
              
              SetGadgetState(#Trk_LeftVolume, VideoGetLeftVolume(#Video))
              SetGadgetState(#Trk_RightVolume, VideoGetRightVolume(#Video))
              SetGadgetState(#Trk_GeneralVolume,VideoGetVolume(#Video))
              
              Debug VideoWidth(#Video)
              VideoLoaded = 1
              Timer_1 = SetTimer_(hPlayer, 1, 100,  @TimerProc())
            EndIf
          EndIf
          
        Case #Btn_Pause
          If VideoLoaded
            If VideoStatus(#Video)      = #VIDEO_PLAYING
              PauseVideo(#Video)
            ElseIf VideoStatus(#Video)  = #VIDEO_PAUSED
              ResumeVideo(#Video)
            EndIf
          EndIf
          
        Case #Btn_Stop
          If VideoLoaded
            StopVideo(#Video)
          EndIf
          
        Case #Btn_Play
          If VideoLoaded
            PlayVideo(#Video, hPlayer)
            Re\left = 0 : Re\top = 150
            Re\right = WindowWidth(): Re\bottom = WindowHeight()-27
            
            ResizeVideo(#Video, 0,150,WindowWidth(), WindowHeight()-173)
            SetVideoCaption(#Video, GetTitle(Film$))
            
          EndIf
          
        Case #Btn_FullScreen
          ;SetTimer_(hPlayer, 2, 10000, @TimerProc())
          VideoFullScreen(#Video)
          Full = 1
          
        Case #Trk_Seek
          PauseVideo(#Video)
          
          VideoSeek(#Video, GetGadgetState(#Trk_Seek))
          ResumeVideo(#Video)
          
        Case #Trk_GeneralVolume
          VideoSetVolume(#Video, GetGadgetState(#Trk_GeneralVolume))
          
        Case #Trk_LeftVolume
          VideoSetLeftVolume(#Video, GetGadgetState(#Trk_LeftVolume))
          
        Case #Trk_RightVolume
          VideoSetRightVolume(#Video, GetGadgetState(#Trk_RightVolume))
          
      EndSelect
    Case #PB_EventCloseWindow
      Quit = #True
  EndSelect
Until Quit ;}
End
;
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Mais il n'y a pas le bug de la fenetre pas fraiche qui ne se rafraichit pas ?
J'avais fait plus ou moins le meme programme mais en plus beau 8) (merci la lib toolbarxp) mais sans la balance et avec le probleme de fenetre pas fraiche.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Mais la fenêtre ne se rafraichit pas par la lib, elle se rafraichit avec cette partie du code.

Code : Tout sélectionner

Procedure CallBack(Hnd,msg,wParam,lParam) 
  Resultat = #PB_ProcessPureBasicEvents 
  If Hnd = WindowID(#Win_Player) 
    Select msg 
      Case #WM_MOVE 
        InvalidateRect_(Hnd,@Re,#False) 
      Case #WM_PAINT 
        InvalidateRect_(Hnd,@Re,#False) 
    EndSelect 
  EndIf 
  
  ProcedureReturn Resultat 
EndProcedure 
C'est la fameuse callback dont je parlais dans les posts précédents.

En plus, ce n'est pas un rafraichissement de l'affichage, mais plutot protection contre l'effacement.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Ouais, j'avais compris le principe, meme si j'ai pas compris le code en lui meme :lol:
Tu peux donner une petite explication s'il te plait ?
(Je ne suis qu'un débutant)

J'ai essayé d'adapter le callback a mon programme mais ca fait disparaitre les boutons de la libtoolbarxp et ca bug toujours :-( J'ai pt'etre loupé quelquechose, c'est peut etre un probleme de variable globale ou un truc comme ca, mais je vais pas ou je me suis trompé.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pingtix a écrit :J'ai essayé d'adapter le callback a mon programme mais ca fait disparaitre les boutons de la libtoolbarxp et ca bug toujours :-( J'ai pt'etre loupé quelquechose, c'est peut etre un probleme de variable globale ou un truc comme ca, mais je vais pas ou je me suis trompé.
Ca doit être parce que ta structure RECT est mal remplie.

Dans le code que j'ai posté juste au dessus, il y a ça:

Code : Tout sélectionner

Global Re.RECT 
tout en haut, dans les variables globales, et ça:

Code : Tout sélectionner

Re\left = 0 : Re\top = 150 
Re\right = WindowWidth(): Re\bottom = WindowHeight()-27 
dans le code du bouton "Play"

C'est le remplissage de la structure RECT qui contient la zone de la fenêtre utilisée pour l'affichage.
- Left, c'est la gauche de la zone, elle commence à 0
- Top, c'est le haut de la zone, il commence à 150 pour ne pas affecter les boutons.
- Right, c'est la droite de la zone, elle est égale à la largeur de la fenêtre, dans cet exemple
- Bottom, c'est le bas de la zone, il se trouve en bas de la fenêtre, moins la hauteur de la StatusBar.

Cette description définit la zone qui sera protégée par la fonction InvalidateRect_(Hnd,@Re,#False).
Si la zone couvre les boutons, ils ne sont pas redessinés.

Si tu ne mets pas "Global Re.RECT", tu auras le même problème que si tu ne remplis pas la structure, puisque Re est utilisé à la fois dans la callback et dans la boucle, Re sera considéré comme deux variables différentes.
Tous le champs vaudront donc 0 dans la Callback, ce qui revient à faire InvalidateRect_(Hnd,#Null,#False).
Dans ce cas, c'est toute la fenêtre qui est affectée par InvalidateRect_()
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

J'ai corrigé un petit bug, et j'ai ajouté un fichier .chm.
J'ai aussi inclus le chemin des dossiers dans l'archive, il suffit de la décompacter dans le dossier ou se trouve PureBasic.exe

Maintenant, vous pouvez avoir l'aide sur un mot-clé en appuyant sur F1, comme pour les commandes PureBasic.

http://www.cgsoftwares.com/PureBasic/PrgForum/Video.zip
Répondre