Lib Video
Lib Video
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
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
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. 
la lib video marche très bien chez moi avec l'exemple fournit
et le processeur est à 65% pendant la lecture d'un film

la lib video marche très bien chez moi avec l'exemple fournit

et le processeur est à 65% pendant la lecture d'un film

Dernière modification par Flype le dim. 19/déc./2004 19:38, modifié 1 fois.
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.
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.
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.
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.
Ca a l'air de plutôt bien fonctionner aussi.

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
;
Mais la fenêtre ne se rafraichit pas par la lib, elle se rafraichit avec cette partie du code.
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.
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
En plus, ce n'est pas un rafraichissement de l'affichage, mais plutot protection contre l'effacement.
Ouais, j'avais compris le principe, meme si j'ai pas compris le code en lui meme 
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é.

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

Ca doit être parce que ta structure RECT est mal remplie.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 toujoursJ'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é.
Dans le code que j'ai posté juste au dessus, il y a ça:
Code : Tout sélectionner
Global Re.RECT
Code : Tout sélectionner
Re\left = 0 : Re\top = 150
Re\right = WindowWidth(): Re\bottom = WindowHeight()-27
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_()
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
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