Page 1 sur 1

pb lecteur multimedia

Publié : sam. 09/mai/2009 22:44
par Blue Fire
Bonjour je suis nouveau ici et je débute dans le PureBasic ça fais 5 mois que je code en pure basic et je viens de faire mon lecteur multimédia en 3h et je suis dans un morceau de code pour pouvoir enchainer les chanson dans un playlist mais il se trouve que j'utilise "resultat = moviestatus(#film)" et j'arrive pas a avoir les trame de mon *.avi
pouvez vous m'aider SVP et j'aimerais aussi faire une barre de progression du fichier qui est en action afin de pouvoir amener ce fichier au temps ou moment voulu...
je vous donne mon code qui marche et qui reste lisible car je code sans commentaire et le code a évolué car je suis en train de coder la playlist...
merci d'avance

Code : Tout sélectionner

InitMovie()

a=0
b=0
x=0
vol = 50

OpenWindow(0,100,100,220,130,"Serial_Media",#PB_Window_MinimizeGadget)

CreateGadgetList(WindowID(0))

ButtonGadget(0,10,40,60,20,"Open")
ButtonGadget(1,10,10,60,20,"Play")
ButtonGadget(2,80,10,60,20,"Pause")
ButtonGadget(3,150,10,60,20,"Stop")
TextGadget(4,10,70,200,50,"",#PB_Text_Border)
TrackBarGadget(5,80,50,130,20,0,100)
TextGadget(6,115,35,100,15,"Volume: " + Str(vol) + "%")

SetGadgetColor(4,#PB_Gadget_BackColor, $000000)
SetGadgetColor(4,#PB_Gadget_FrontColor, $00FF00)
SetGadgetState(5,vol)

Repeat
  event = WaitWindowEvent()
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            multiname$ = OpenFileRequester("Fichier Multimedia","","All Files|*.*",0)
           
            If multiname$
           
              If x <> 0 And a=0
              StopMovie(x-1)
              ElseIf x <> 0 And a=1
              ResumeMovie(x-1)
              StopMovie(x-1)
              EndIf
           
           
            LoadMovie(x,multiname$)
            name$ = multiname$
           
           
            Repeat
              If FindString(name$,"\",0)
              start = FindString(name$,"\",0) +1
              name$ = Mid(name$,start, Len(name$))
              b=0
              Else
              b=1
              EndIf
            Until b=1         
            SetGadgetText(4, name$)
            x=x+1
            EndIf
           
          Case 1
            If a=1 And x <> 0
            ResumeMovie(x-1)
            ElseIf x <> 0
            PlayMovie(x-1,0)
            EndIf
         
          Case 2
            If x <> 0
            PauseMovie(x-1)
            a=1
            EndIf
         
          Case 3
            If x <> 0
            StopMovie(x-1)
            a=0
            EndIf
           
          Case 5
            vol = GetGadgetState(5)
            SetGadgetText(6, "Volume: " + Str(vol) + "%")
           
        EndSelect
     EndSelect
If x <> 0
MovieAudio(x-1, vol, 0)
EndIf

Until event = #PB_Event_CloseWindow 

Publié : dim. 10/mai/2009 0:17
par Ollivier
Bonsoir, et bienvenu donc sur ce forum,

Grâce à Fr3ak et à la mise à jour de Dige, voici un code qui invite à ouvrir un film (AVI ou WMV), et à prélever et afficher la millième frame.

Ce code est composé de 3 parties espacées:
  • Une structure pour la procédure de capture
  • La procédure de capture
  • Le code principal qui sert d'exemple d'utilisation de la procédure
La procédure s'accède grâce à la fonction CaptureFrame(x, y)
où x est le numéro du film source ouvert et y le numéro de l'image de destination.

La taille de l'image doit correspondre à la taille du film. Valeurs déterminées grâce à MovieWidth() et MovieHeight().


Pour le ProgressBarGadget, c'est un gadget qui se crée facilement, comme un bouton ou autre et que l'on modifie dans la boucle principal grâce à la fonction SetGadgetState().

Pour ProgressBarGadget, il faut préciser le minimum et le maximum:
Minimum = 0
Maximum = Nombre total de frames dans le film. Valeur déterminée par MovieLength().

Pour SetGadgetState(), il ne reste qu'à préciser le numéro de frame et le compilateur se charge du reste (affichage de la progression).

Code : Tout sélectionner




Structure PB_StructureMovie
  Movie.IGraphBuilder
  MediaControl.IMediaControl
  MediaEvent.IMediaEventEx
  Window.IVideoWindow
  Audio.IBasicAudio
  Video.IBasicVideo
  MediaSeeking.IMediaSeeking
  state.l
EndStructure




Procedure.l CaptureFrame(MovieNumber, ImageNumber)
  Protected *Movie.PB_StructureMovie
  Protected *Video.IBasicVideo
  Protected *Window.IVideoWindow
  Protected *ImageData.BITMAPINFOHEADER
  Protected DataSize.I
  Protected Parent.I
  Protected Result.I
 
  *Movie  = IsMovie(MovieNumber) 
  *Movie  + MovieNumber * SizeOf(PB_StructureMovie)
  *Window = *Movie\Window
  *Video  = *Movie\Video
 
  Result  = 0
   
  If *Video\GetCurrentImage(@DataSize, 0) = #S_OK
   
    *ImageData = AllocateMemory(DataSize)
    If *ImageData
     
      If *Video\GetCurrentImage(@DataSize, *ImageData) = #S_OK
       
        If IsImage( ImageNumber )
          hBmp  = ImageID( ImageNumber )
         
          w = ImageWidth(ImageNumber)
          h = ImageHeight(ImageNumber)
         
          bmi.BITMAPINFO
          bmi\bmiHeader\biSize   = SizeOf(BITMAPINFOHEADER)
          bmi\bmiHeader\biWidth  = w
          bmi\bmiHeader\biHeight = h
          bmi\bmiHeader\biPlanes = 1
         
          bmi\bmiHeader\biBitCount = ImageDepth(ImageNumber)
          bmi\bmiHeader\biBitCount = 32
          bmi\bmiHeader\biCompression = #BI_RGB
         
          hdc = StartDrawing(ImageOutput(ImageNumber) )
          If hdc
            SetDIBits_(hdc, hBmp, 0, h, *ImageData, @bmi, #DIB_RGB_COLORS)
            StopDrawing()
          EndIf
        EndIf
      EndIf
     
      FreeMemory(*ImageData)
    EndIf
   
  EndIf   
 
  *Window\get_Owner(@Parent)
  RedrawWindow_(Parent,0,0,#RDW_INVALIDATE)
  ProcedureReturn Result
EndProcedure




   InitMovie()
   File$ = OpenFileRequester("Ouvrir un film", "", "*.*", 0)
   LoadMovie(0, File$)
   Width = MovieWidth(0)
   Height = MovieHeight(0)
   OpenWindow(0, 10, 10, Width, Height, "", $cf0001)
   CreateImage(0, Width, Height)
   Delay(300)
   ImageGadget(0, 0, 0, Width, Height, ImageID(PREM) )
   MovieSeek(0, 1000) ; Va à la millième image
   CaptureFrame(0, 0)
   SetGadgetState(0, ImageID(0) )
   Repeat
   Until WaitWindowEvent() = 16

Publié : dim. 10/mai/2009 7:44
par Ollivier
J'ajoute un petit rappel sur les structures. ça n'est pas pour que tu fasses une analyse immédiate de cette structure, mais pour que tu comprennes qu'il te suffit de copier texto la structure et la procedure dans ton application pour jouir d'une nouvelle fonction ainsi disponible: CaptureFrame(MovieNumber, ImageNumber)
ça calme un peu la difficulté quand on connait le rôle global du code qui nous intéresse.

Bonne journée dominicale!

Ollivier

Code : Tout sélectionner

Structure Structuree
   DUnePart.I             ; I c'est un nombre entier (De l'anglais [I]nteger)
   DAutrePart.I
EndStructure





Define UneChose.Structuree


; Version classique 

UneChose\DUnePart   = 88000
UneChose\DAutrePart =    77

Debug UneChose\DUnePart + UneChose\DAutrePart





; Version abrégée avec WITH

With UneChose

   \DUnePart   =    99
   \DAutrePart = 22000
   
   Debug \DUnePart + \DAutrePart

EndWith

Publié : dim. 10/mai/2009 9:32
par Atomo
Je ne pense pas qu'il cherchait à capturer une image provenant d'une vidéo.
Si j'ai bien compris, il voudrait une trackbarre permettant de commencer la lecture du film à partir de n'importe quel point, comme tout lecteur qui se respecte quoi :P

Publié : dim. 10/mai/2009 13:47
par Blue Fire
ok merci et je vien de coder la playlist mais j'ai un pb pour enchainer les musique
ça marche nikel mais pour cela il faut que je passe le curseur sur ma fenetre afin de la rafraichir
et je cherche une solution afin que mon lecteur soit autonome
mais j'arrive pas a trouvé avec la rubrique d'aide.
j'ai la version 4.20 de PureBasic...
pouvez vous m'aider svp
et encore merci pour la barre de progression.

Publié : dim. 10/mai/2009 14:12
par Atomo
Remplace "event = WaitWindowEvent()" par "event = WaitWindowEvent(1)", le problème vient peut-être de là.

Publié : dim. 10/mai/2009 19:54
par Blue Fire
ça marche merci beaucoup de votre aide (pour le "WaitWindowEvent(1)")
et je travail sur la bar de progression...

Publié : dim. 10/mai/2009 20:03
par Blue Fire
par contre quand je fais la fonction "MovieStatus(#film)" il marche nikel sur une chanson mais pas sur un *.avi
il me stop le film...

Publié : lun. 11/mai/2009 1:29
par Ollivier
Je pense qu'il est plus judicieux de remplacer

Code : Tout sélectionner

Evt = WaitWindowEvent(1)
par

Code : Tout sélectionner

Evt = WindowEvent()
Delay(1)
Le delay(1) laisse correctement les autres tâches se dérouler à chaque exécution de boucle, notamment le transfert des infos pour un film...

A+++

Ollivier

Publié : lun. 11/mai/2009 10:58
par Atomo
Il me semble justement que

Code : Tout sélectionner

Evt = WaitWindowEvent(1)
est l'équivalent de

Code : Tout sélectionner

Evt = WindowEvent() 
Delay(1)
La doc dit :
Evenement = WaitWindowEvent([Timeout])
Bloque l'exécution du programme jusqu'à ce qu'un évènement intervienne. Le paramètre optionnel 'Timeout' permet de spécifier le temps maximal (en millisecondes) durant lequel la fonction sera bloquante si aucun évènement ne survient.

Publié : lun. 11/mai/2009 11:05
par Backup
Atomo a écrit :Il me semble justement que

Code : Tout sélectionner

Evt = WaitWindowEvent(1)
est l'équivalent de

Code : Tout sélectionner

Evt = WindowEvent() 
Delay(1)
La doc dit :
Evenement = WaitWindowEvent([Timeout])
Bloque l'exécution du programme jusqu'à ce qu'un évènement intervienne. Le paramètre optionnel 'Timeout' permet de spécifier le temps maximal (en millisecondes) durant lequel la fonction sera bloquante si aucun évènement ne survient.

ben non c'est pas pareil !!

Code : Tout sélectionner

Evt = WindowEvent() 
Delay(1)
rend la main de façon reguliere (multitache) au systeme
le delay() ici ne bloque pas réellement le prg, il permet la mise en ecoute de ce que va decider le systeme !!!
si le system doit s'occuper d'une tache longue , et que le delay() se finis
le prg purebasic va faire une demande au system de pourvoir continuer
et le systeme fera tout son possible pour ça !

alors que :

Code : Tout sélectionner

Evt = WaitWindowEvent(1)
bloque l'apli de façon reguliere !! c'est strictement le contraire !!

a cette instruction , le prg purebasic, va s'arreter quoiqu'il arrive pour attendre que le system lui rende la main !!
si le systeme met 3 heure a finir son travail , notre application attendra tout ce temps !!!

WaitWindowEvent(1) bloque le prg , mais ne force pas window a lui rendre la main !!

alors que le delay(2) bloque la prg durant 2 milliseconde , mais a la fin de cette periode, le prg purebasic passera a la fonction suivante, et fera une demande au system d'exploitation, pour continuer son boulot



c'est subtile , mais ça donne pas le meme effet !!

Olivier a entierement raison !! :)

Publié : lun. 11/mai/2009 15:24
par Blue Fire
ben même avec un

Code : Tout sélectionner

delay(1)
mon programme ne continue pas a faire se qu'il doit faire, il se remet a marcher si je passe le curseur sur la fenêtre mais avec

Code : Tout sélectionner

waitwindowevent(1)
il marche nickel

et j'ai un petit pb pour mon film avec

Code : Tout sélectionner

moviestatus(#film)
pour mes *.avi il le stop et me renvoie la valeur "0"
normal puisqu'il est stoppé
mais j'arrive pas a avoir le status du film sans l'arrêter...
avez vous une solution a mon pb SVP?

Publié : lun. 11/mai/2009 15:46
par Backup
Blue Fire a écrit :ben même avec un

Code : Tout sélectionner

delay(1)
mon programme ne continue pas a faire se qu'il doit faire, il se remet a marcher si je passe le curseur sur la fenêtre mais avec
c'est pas delay(1) qu'il faut faire c'est

Code : Tout sélectionner

Evt = WindowEvent()
Delay(1)

Publié : lun. 11/mai/2009 16:00
par Backup
j'ai peut etre dit une connerie au dessus :?

(ça sera pas la premiere :lol: )

apres test :
il semblerai que waitwindowevent(1) soit bien plus rapide que le couple
windowevent() +delay(x)

voici mon code de test :


voir ligne 66 ,pour echanger les 2 systemes

sur mon nc10, le waitwindowevent(1) est carrement plus rapide 8O

Code : Tout sélectionner


; Codé par Dobro
; en purebasic 4.02



;- Window Constants
;
Declare Open_Window_0()
Enumeration
      #Window_0 ; numero de la fenetre
      #sprite ; numero du sprite
      #Button_0 ; numero du bouton 
EndEnumeration

Structure sprite
      num.l ; numero du sprite
      x.l ; la coordonée x du sprites
      Y.l ; la coordonée y du sprites
      sensx.l ; le sens du deplacement x du sprite
      sensy.l  ; le sens du deplacement y du sprite
      coul.l ; la couleur du sprite
EndStructure

nombre_de_Sprite=80
Dim sprite.sprite(nombre_de_Sprite)


For i=1 To nombre_de_Sprite
     
      sprite(i)\x=Random(200) +32; on donne une coordonée de depart au sprite
      sprite(i)\Y=Random(200)+32
      de=Random(1)
      If de=1
            sprite(i)\sensx=10 ; on donne un sens de deplacement par defaut au sprite
            sprite(i)\sensy=10 ; ce chiffre correspond a la vitesse de deplacement du sprite
      Else
            sprite(i)\sensx=-10 ; on donne un sens de deplacement par defaut au sprite
            sprite(i)\sensy=10 ; ce chiffre correspond a la vitesse de deplacement du sprite
      EndIf
      sprite(i)\coul = RGB(Random(200)+50,Random(200)+50,Random(200)+50) ; attribut une couleur 
Next i
;


InitSprite()
Open_Window_0() ; appel de la procedure qui ouvre la fenetre

; ****** creation des sprites *********
For i=1 To nombre_de_Sprite
      CreateSprite(i,16,16) ; creation d'une cellule vide (un sprite)
      StartDrawing( SpriteOutput(i)) ; on va dessiner dans notre sprite un carre coloré
            Box(1,1,16,16,sprite(i)\coul) ; voila le dessin du carre vert dans notre sprite
      StopDrawing()
Next i
;**************************************
; ********************* creation du sprite de fond ********************
CreateSprite(0,512,512) ; creation d'une cellule vide (un sprite)
StartDrawing( SpriteOutput(0)) ; on va dessiner dans notre sprite un carre coloré
    Box(1,1,16,16,RGB(0,0,0)) ; voila le dessin du carre vert dans notre sprite
StopDrawing()


Repeat ; boucle principale , qui gere les affichages dans l'ecran graphique et les evenement de la fenetre
      
 ;  Event = WindowEvent() ; attends de recevoir un evenements de la fenetre 
  ; Delay (1)
    Event =WaitWindowEvent(1)
    
    
      WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
      
      GadgetID = EventGadget() ; Is it a gadget event?
      
      EventType = EventType() ; The event type
      
      ;You can place code here, and use the result as parameters for the procedures
      
      If Event = #PB_Event_Gadget 
            If GadgetID = #Button_0
                  Debug "appuis sur le bouton ok"
                  End
            EndIf 
        EndIf
        
        DisplaySprite(0,0,0)
      For i=1 To nombre_de_Sprite
            sprite(i)\x= sprite(i)\x+sprite(i)\sensx  ; on lance le sprite
            sprite(i)\Y=sprite(i)\Y+sprite(i)\sensy
            
            ; on va tester les sortie de l'ecran pour creer des rebonds
            
            ;  les verticales
            If sprite(i)\Y<0 ; sort par le haut !!
                  sprite(i)\sensy=-sprite(i)\sensy ; on inverse le deplacement vertical
            EndIf
            If sprite(i)\Y>350-16 ; sort par le bas !!
                  sprite(i)\sensy=-sprite(i)\sensy ; on inverse le deplacement vertical
            EndIf
            
            ; les horizontales
            If sprite(i)\x<0 ; sort par la gauche
                  sprite(i)\sensx=-sprite(1)\sensx ;on inverse le deplacement horizontal
            EndIf
            If sprite(i)\x>400-16 ; sort par la droite
                  sprite(i)\sensx=-sprite(i)\sensx ;on inverse le deplacement horizontal
            EndIf
            ; ********** fin des test de sorti d'ecran *****************
            
            ; **************Affichage du sprite ***********
            DisplaySprite(i,sprite(i)\x,sprite(i)\Y)
      Next i
      
      
      
      FlipBuffers()
  ;    ClearScreen(RGB(0,0,0)) ; on nettoie l'ecran pour le prochain affichage
      
      ; *****************************************
      
Until Event = #PB_Event_CloseWindow ; End of the event loop

End
;


Procedure Open_Window_0()
      If OpenWindow(#Window_0, 363, 117, 472, 423, "test",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar ) ; on ouvre une fenetre
            OpenWindowedScreen(WindowID(#Window_0), 50, 10, 400, 350, 0, 1, 1) ; on creer un ecran graphique dedans
            If CreateGadgetList(WindowID(#Window_0)) ; la liste gadget pour la gestion des gadgets (ici un bouton)
                  ButtonGadget(#Button_0, 30, 370, 70, 30, "ok")  ; voila le bouton
            EndIf
      EndIf
EndProcedure

Publié : mar. 12/mai/2009 12:15
par Blue Fire
bonjour je travail sur mon code et quelque problèmes sont là mais je vais les regler...

voici mon code pour l'instant

Code : Tout sélectionner

InitMovie()

a=0
b=0
x=0
tour = 0
play = 0
vol = 50
status = 0

OpenWindow(0,100,100,220,155,"Serial_Media",#PB_Window_MinimizeGadget)

CreateGadgetList(WindowID(0))

ButtonGadget(0,10,40,60,20,"Add")
ButtonGadget(1,10,10,60,20,"Play")
ButtonGadget(2,80,10,60,20,"Pause")
ButtonGadget(3,150,10,60,20,"Stop")
ListViewGadget(4,10,75,200,70)
TrackBarGadget(5,80,50,130,20,0,100)
TextGadget(6,115,35,100,15,"Volume: " + Str(vol) + "%")

SetGadgetColor(4,#PB_Gadget_BackColor, $000000)
SetGadgetColor(4,#PB_Gadget_FrontColor, $00FF00)
SetGadgetState(5,vol)

Repeat
  event = WaitWindowEvent(1)
    Select event
      Case #PB_Event_Gadget
        Select EventGadget()
          Case 0
            multiname$ = OpenFileRequester("Fichier Multimedia","","All Files|*.*",0)
            
            If multiname$
            
            name$ = multiname$
            
            
            Repeat
              If FindString(name$,"\",0)
              start = FindString(name$,"\",0) +1
              name$ = Mid(name$,start, Len(name$))
              b=0
              Else 
              b=1
              EndIf
            Until b=1          
            AddGadgetItem(4,-1,name$ + "          !!~" + multiname$)
            EndIf
            
            
            
          Case 1
            If a = 1 And x = 1
            ResumeMovie(x)
            ElseIf tourne <> 0
            ;nop
            Else
            musicload$ = GetGadgetItemText(4,0)
              If musicload$
              x = 1
              start = FindString(musicload$, "!!~", 0) +3
              load$ = Mid(musicload$, start, Len(musicload$))
              name$ = Mid(musicload$, 0, Len(musicload$) - start - 10)
              LoadMovie(x, load$)
              PlayMovie(x, 0)
              play = 1
              EndIf
            

            
            EndIf
            
          
          Case 2
            If x = 1
            PauseMovie(x)
            a=1
            EndIf
          
          Case 3
            If x = 1
            StopMovie(x)
            a=0
            EndIf
            play = 0
                        
          Case 5
            vol = GetGadgetState(5)
            SetGadgetText(6, "Volume: " + Str(vol) + "%")
            
        EndSelect
     EndSelect
     

If x = 1
tourne = MovieStatus(x)
tour = tour + 1
If play = 1
MovieAudio(x, vol, 0)
If tourne = 0 And tour > 10
tour = 0
RemoveGadgetItem(4,0)
FreeMovie(x)
musicload$ = GetGadgetItemText(4,0)
              If musicload$
              x = 1
              start = FindString(musicload$, "!!~", 0) +3
              load$ = Mid(musicload$, start, Len(musicload$))
              name$ = Mid(musicload$, 0, Len(musicload$) - start - 10)
              LoadMovie(x, load$)
              PlayMovie(x,0)
              play = 1
              Else
              x = 0
              EndIf
EndIf
EndIf

EndIf




Until event = #PB_Event_CloseWindow
et ma playlist marche mais quand il y a qu'une chanson le programme ne marche pas mais c'est pas grave ça je peux le regler tout seul
j'ai surtout besoin d'aide au niveau des *. avi SVP