Début d'un lecteur de vidéos avec les commandes MCI

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

Message par Chris »

Tu fais un copier/coller des trois codes qui sont dans le message
Le nom du fichier est en haut de chaque code, tu sauvegardes sous ce nom dans le même dossier, et tu lances Video2.pb.

J'avais pas tout lu:

Voilà le fichier. Tu le sauvegardes dans le même dossier que les codes sous le nom : VideoProcs2.pb.declare, ou alors, tu retires le IncludeFile "VideoProcs2.pb.declare" et tu colles les lignes qui commencent par 'Declare' à la place

Code : Tout sélectionner

;Autogenerated -- start of section automatically generated from VideoProcs2.pb
;  with jaPBe 2.4.9.25
Declare FullScreen(IdFilm)
Declare SeekFilm()
Declare StopFilm(IdFilm, FlagStop)
Declare EjectFilm(IdFilm)
Declare PauseFilm(IdFilm)
Declare LoadFilm(Movie$, IdFilm)
Declare ShowTaskBar(Bar.b) ; 0 cache la barre de taches, 1 la montre
Declare TimerProc(hwnd.l, uMsg.l, idEvent.l, dwTime.l)
Declare Open_Win_Command()                    ; Fenêtre de commandes
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Merci beaucoup !
Il est cool ton programme ! Aucun probleme de codec ! Tu as la progression et la durée de la video meme avec les mov ! Le mode plein écran est impec !
Est-ce possible de jouer la video dans une fenetre comme avec la lib Movie ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Normalement, il démarre dans une fenêtre qui fait la taille d'origine du film. Il passe en plein ecran quand tu appuie sur Espace.
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Est il possible de jouer le film dans une fenetre qui existe déja ?
Comme ca il y a une seule fenetre avec les boutons Play, Stop,.... et le film.
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Oui, mais c'est un peu plus compliqué à expliquer.

Regarde dans le fichier MCI_Procs, il y a une procédure
MCI_Parent(Nb, Hnd)
Tu lui passe en paramètres l'id de ton film, 0 normalement, et le handle de la fenêtre que tu veux utiliser.
Par contre, il faudra gérer toi même le rafraichissement de la fenêtre pour que le film reste affiché, même après avoir été recouvert par une autre fenêtre.

Avant de lancer ton film, il faudra redimensionner ta fenêtre en fonction de la taille de la vidéo pour que ton film et tes boutons tiennent dans la fenêtre.

Je n'ai pas trop poussé les essais à ce niveau là, alors je ne peux pas t'en dire beaucoup plus
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

J'arrive a le faire avec la lib Movie et j'aimerais bien pouvoir le faire avec l'MCI.
Par contre, pour cette histoire de rafraichissement de la fenetre j'ai pas trop compris. 8O
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Quand ton film va être lu sur ta fenêtre, si tu ne gères pas le rafraichissement et que tu ouvres une autre fenêtre par dessus celle du lecteur, quand tu la refermeras, les images de ton film auront disparues.
Si tu bouges un peu la fenêtre, elles réapparaitront.

Il faut donc que tu fasse une procédure de rafraichissement pour que tes images reviennent dès que la fenêtre est revenue au premier plan.

Mais je ne souviens plus de la commande :lol:

Ca va me revenir, mais pour le moment, c'est le trou de mémoire
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

En gros, je suis mal barré #aieaieaie
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Ben ouais :lol:

Fred, y aurait pas moyen de faire quelque chose pour que la lib Movie retourne des valeurs correctes dans tous les fichiers audio et vidéo?

Maintenant que t'as fini avec Marcus :lol:

(Remarque, Marcus a attendu deux ans, .... on est pas arrivé) :lol:
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Marcus ?? hein ? j'ai raté quelquechose ?

C'est vrai que si on fait un player video en pb et que la video bug, c'est le petit bug qui gache tout non ? C'est comme si votre télé avait un bug d'affichage ou votre baladeur CD un probleme de driver son :lol:
J'arrive a utiliser le MCI_Parent ! Un petit pas pour le purebasicien, un grand pas pour le Pingtix !
Comment je récupère les dimensions de la video ? Et comment je la déplace/redimensionne ?
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Please Help

Message par Pingtix »

Personne ne sait ?
Pour le rafraichissement de la fenetre, j'ai essaya d'afficher ma video dans un fenetre existante et ca déconne autant dans ton player qui l'affiche dans une nouvelle fenetre alors que je ne me suis pas occupé de cette histoire de refraichissement. Ca veut dire que dans une nouvelle fenetre aussi il faut rafraichir l'affichage ?
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Comment je récupère les dimensions de la video ? Et comment je la déplace/redimensionne ?
Pour récupérer les dimensions, il y a une fonction MCI_GetRect.
Ca te retourne une chaine avec la largeur, un espace, et la hauteur.

Il suffit d'utiliser Val(StringField()) pour avoir les valeurs.

Pour la redimensionner, j'ai pas réussi à trouver.

Pour le rafraichissement, si tu utilises la fenêtre créée par défaut à l'ouverture, tu n'as pas besoin de t'en occuper.

Par contre, si tu crée une fenêtre toi même, c'est à toi de le faire dans une callback.

J'ai trouvé un truc pour rafraichir, mais ça n'a pas l'air trop top.

Voilà déjà ce que ça donne.

Code : Tout sélectionner

IncludeFile "MCI_Procs.pb"

;- Window Constants
Enumeration
  #Win_Main
EndEnumeration

;- Gadget Constants
Enumeration
  #Ecran
  #Progress
  #Trk_Position
  #Btn_Load
  #Btn_Eject
  #Btn_Pause
  #Btn_Stop
  #Btn_Play
  #Cont_Commands
EndEnumeration

#PBM_SETRANGE32   = #WM_USER + 6
#PBM_GETRANGE     = #WM_USER + 7
#PBM_SETBARCOLOR  = #WM_USER + 9

S_Width   = GetSystemMetrics_(#SM_CXSCREEN)
S_Height  = GetSystemMetrics_(#SM_CYSCREEN)

Structure FILM_INFO
  Handle.l
  Titre.s
  Largeur.l
  Hauteur.l
EndStructure
Global Info.FILM_INFO
Global hScreen, IsLoaded, S_Width, S_Height, hMain

Procedure Open_Win_Main()
  If OpenWindow(#Win_Main, 350, 69, 340, 330,  #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_SizeGadget | #PB_Window_TitleBar | #PB_Window_ScreenCentered , "Cinéma")
    hMain = WindowID(#Win_Main)
    If CreateGadgetList(WindowID())
      hScreen = ContainerGadget(#Ecran, 0, 0, 340, 265)
      CloseGadgetList()
      
      ContainerGadget(#Cont_Commands, 0, 265, 340, 65)
      ProgressBarGadget(#Progress, 5, 5, 330, 10, 0, 10)
      TrackBarGadget(#Trk_Position, 5, 15, 330, 20, 0, 10)
      ButtonGadget(#Btn_Load, 5, 40, 45, 20, "Load")
      ButtonGadget(#Btn_Eject, 50, 40, 45, 20, "Eject")
      ButtonGadget(#Btn_Pause, 235, 40, 45, 20, "Pause")
      ButtonGadget(#Btn_Stop, 290, 40, 45, 20, "Stop")
      ButtonGadget(#Btn_Play, 190, 40, 45, 20, "Play", #PB_Button_Default)
      CloseGadgetList()
    EndIf
    ProcedureReturn #True
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure LoadFilm(Movie$, IdFilm)
  If MCI_Load(IdFilm, Movie$)
    IsLoaded = 1
    
    MCI_Parent(0,hScreen)
    MCI_SetTimeMSFormat(IdFilm)
    
    t$ = MCI_GetRect(IdFilm)
    Info\Handle  = MCI_GetHandle(IdFilm)
    Info\Largeur = Val(StringField(t$,1," "))
    Info\Hauteur = Val(StringField(t$,2," "))
    Info\Titre   = Left(GetFilePart(Movie$), Len(GetFilePart(Movie$))-Len(GetExtensionPart(Movie$))-1)
    
    ResizeWindow(Info\Largeur, Info\Hauteur +65)
    ResizeGadget(#Ecran, -1,-1,Info\Largeur, Info\Hauteur)
    
    ResizeGadget(#Cont_Commands,-1,Info\Hauteur,WindowWidth(),-1)
    ResizeGadget(#Progress,-1,-1,GadgetWidth(#Cont_Commands)-10,-1)
    ResizeGadget(#Trk_Position, -1,-1,GadgetWidth(#Cont_Commands)-10,-1)
    
    MoveWindow(S_Width/2 - WindowWidth()/2, S_Height/2 - WindowHeight()/2)
    
    SendMessage_(hProg,#PBM_SETRANGE32,0,MCI_GetLength(IdFilm))
    SendMessage_(hSeek, #TBM_SETRANGEMAX,#True,MCI_GetLength(IdFilm))
    ProcedureReturn #True
  Else
    IsLoaded = 0
    MessageRequester("Erreur de chargement","Chargement du fichier impossible")
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure CallBack(Hnd,msg,wParam,lParam)
  Resultat = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_MOVE
      InvalidateRect_(hScreen, 0, #False)
      
    Case #WM_SIZE
      InvalidateRect_(hScreen, 0, #False)
      
      ResizeGadget(#Ecran, -1,-1,WindowWidth(), WindowHeight()-65)
      
      ResizeGadget(#Cont_Commands,-1,WindowHeight()-65,WindowWidth(),-1)
      ResizeGadget(#Progress,-1,-1,GadgetWidth(#Cont_Commands)-10,-1)
      ResizeGadget(#Trk_Position, -1,-1,GadgetWidth(#Cont_Commands)-10,-1)
      Rect$ = "0 0 "+Str(GadgetWidth(#Ecran))+" "+Str(GadgetHeight(#Ecran))
      
    Case #WM_PAINT
      InvalidateRect_(hScreen, 0, #False)
      
  EndSelect
  ProcedureReturn Resultat 
EndProcedure 

If Open_Win_Main()
  SetWindowCallback(@CallBack())
Else
  End
EndIf

Repeat
  Select WindowEvent()
    Case 0
      Delay(20)
      
    Case #PB_EventGadget
      Select EventGadgetID()
        
        Case #Trk_Position
          
        Case #Btn_Load
          Film$ = OpenFileRequester("Ouvrir une vidéo","","Fichiers vidéo|*.wmv;*.avi;*.mpg|Fichiers Audio|*.mp3;*.wav",0)
          If Film$
            LoadFilm(Film$, 0)
          EndIf
          
        Case #Btn_Eject
          
        Case #Btn_Pause
          
        Case #Btn_Stop
          
        Case #Btn_Play
          MCI_Play(0)
          
      EndSelect
    Case #PB_EventCloseWindow
      Quit = #True
      
  EndSelect
Until Quit
End
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Je sais pas ce que c'est un callback :lol:
Avatar de l’utilisateur
Chris
Messages : 3731
Inscription : sam. 24/janv./2004 14:54
Contact :

Message par Chris »

Pour simplifier, une callback, c'est une procédure qui tourne en paralléle de la boucle de ton programme, et qui traite les messages.

Un peu comme ce qu'on a utilisé dans le post sur les timers.

Autre chose, concernant le redimensionnement de la vidéo:
J'ai fait une procédure qui s'appelle MCI_SetSize.

Code : Tout sélectionner

Procedure MCI_SetSize(Nb, Size$) 
  i=mciSendString_("put MCI_"+Str(0)+" destination at  "+Size$,0,0,0)
  ProcedureReturn i
EndProcedure
Il faut coller cette procédure dans le fichier MCI_Procs.pb

Pour l'utiliser, il faut utiliser la procédure CallBack()

Code : Tout sélectionner

Procedure CallBack(Hnd,msg,wParam,lParam)
  Resultat = #PB_ProcessPureBasicEvents
  Select msg
    Case #WM_MOVE
      InvalidateRect_(hScreen, 0, #False)
      
    Case #WM_SIZE
      ResizeGadget(#Ecran, -1,-1,WindowWidth(), WindowHeight()-65)
      
      ResizeGadget(#Cont_Commands,-1,WindowHeight()-65,WindowWidth(),-1)
      ResizeGadget(#Progress,-1,-1,GadgetWidth(#Cont_Commands)-10,-1)
      ResizeGadget(#Trk_Position, -1,-1,GadgetWidth(#Cont_Commands)-10,-1)
      
      Rect$ = "0 0 "+Str(GadgetWidth(#Ecran))+" "+Str(GadgetHeight(#Ecran))
      MCI_SetSize(0, Rect$)
      
      InvalidateRect_(hScreen, 0, #False)
      
    Case #WM_PAINT
      InvalidateRect_(hScreen, 0, #False)
      
  EndSelect
  ProcedureReturn Resultat 
EndProcedure
Tu copie la procédure, et tu la mets dans le code , à la place de la procédure existante
Pingtix
Messages : 159
Inscription : mer. 03/nov./2004 15:30

Message par Pingtix »

Je trouve ca bizarre car dans ton player qui pourtant ouvre la video dans une nouvelle fenetre, il y a aussi le bug.

Ah non.
Répondre