Point() sur AVI ??

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Point() sur AVI ??

Message par Fortix »

Bonsoir,

je n'arrive pas à comprendre pourquoi la lecture des pixels sur une vidéo donne des valeurs nulle !

Code : Tout sélectionner

If InitMovie() = 0
    MessageRequester("Error", "Can't initialize movie playback !", 0) 
    End
EndIf


MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie files|*.avi;*.mpg;*.asf", 0)

If MovieName$
    If LoadMovie(0, MovieName$)
  
        H = MovieHeight(0)       
        L = MovieWidth(0)                                
;{                            
        If H<>400 And L<>400
            If L>H Or L=H
                If H > 400 Or H < 400 
                    S=400*100
                    SS=S/H
                    H=400
                                                    
                    T=L*SS
                    L=T/100
                    ff=1                               
                EndIf
                                    
                If L > 400 Or L < 400
                    d=400*100
                    dd=d/L
                    L=400
                                                    
                    T=H*dd
                    H=T/100
                    ww=1                                                                                   
                EndIf  
            Else
                If L > 400 Or L < 400
                    d=400*100
                    dd=d/L
                    L=400
                                                    
                    T=H*dd
                    H=T/100 
                    w=1                                                                                
                EndIf 
                                    
                If H > 400 Or H < 400 
                    S=400*100
                    SS=S/H
                    H=400
                                                    
                    T=L*SS
                    L=T/100
                    f=1                               
                EndIf                              
            EndIf  
        EndIf
;}
        If w And f Or ww And ff
            Round(L,0):Round(H,0)
        EndIf 
  
        ResizeMovie(0, 0, 0, L, H)
        
        If OpenWindow(1,600,100,L,H,"TABclr")
            ImageGadget(1, 0, 0, L,H, ImageID(0))
        EndIf
        
        OpenWindow(0, 100, 150,420, 450, "PureBasic - Movie ["+Str(L)+" "+Str(H)+"] "+Str(MovieLength(0)))
        PlayMovie(0, WindowID(0))
        
        c=1
        
        For t=150 To 160-1
            MovieSeek(0, t)
            PauseMovie(0)
;--------------------------------------------------------------------------            
           ;Debug c
           CreateImage(c, L, H)                                               
                        StartDrawing(WindowOutput(0))
                            ;DrawImage(ImageID(1), 0, 0)            
                                For y=0 To H;-1 
                                    For x=0 To L;-1
                                        Nv=Point(x,y)
                                        h$=UCase(Hex(Nv))
                                        
                                        If h$<>g$
                                            Debug h$
                                            
                                            g$=h$
                                        EndIf
                                                                     
                                    Next x          
                                Next y  
                        StopDrawing() 

            ResumeMovie(0)
            c=c+1
        Next t
        
        StopMovie(0)
        
        Repeat    
            Event = WaitWindowEvent() 
            WindowID = EventWindow() 
            GadgetID = EventGadget() 
            EventType = EventType()
        Until Event = #PB_Event_CloseWindow
    Else
        MessageRequester("Error", "Can't load the movie...", 0)
    EndIf
EndIf 
bref jne comprends pas!
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Point() sur AVI ??

Message par Thyphoon »

tu peux utiliser la fonction point() sur un sprite dans le quel tu joue le film avec la fonction RenderMovieFrame(#Film, SpriteID)
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: Point() sur AVI ??

Message par Fortix »

Bien vu mais nan, il n'y a rien à faire car sa marche po, et sa aurait dût marcher mais les points ne prennent pas!
sinon j'ais fais appel au DC (l'API) , et non plus, bizar, bizar

donc la seule solution serait d'enregistrer sur le disque Fram par Fram, mais sa me fait chier à l'idée d'enregistrer
une gros quantitée d'images en BMP en plus (très lourd !)
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Point() sur AVI ??

Message par djes »

La lecture des films se fait souvent sur une couche spéciale, en overlay (recouvrement quoi), et ça exploite parfois directx ou opengl. Tu devrais pouvoir régler ça quelque part dans tes configurations système.
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: Point() sur AVI ??

Message par Fortix »

Ah interessant, jvais voir ça
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Point() sur AVI ??

Message par Thyphoon »

une question qu'elle est le but du jeu ? qu'est ce que tu cherches a faire, car peut être y a t'il une autre solution pour la même finalité !
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: Point() sur AVI ??

Message par Fortix »

En fait se que j'éssais de faire depuis un moment c'est tout simplement appliquer un filtre (quelconques) sur chaques images de la vidéo pour ensuite recréer la vidéo mais cette fois avec les images filtrés (points par points)

voici la séquence:

1)chargement vidéo
2)redimention 400*400(facultatif !)
3)traitement Image/Image boucle jusqu'à images max vidéo
4)création vidéo

et voilà

il faut pouvoir défragmenter la vidéo chaques image de la vidéo les modifier puis les rassembler !
Anonyme

Re: Point() sur AVI ??

Message par Anonyme »

et si tu utilises grabsprite() pour capturer la zone voulue pour faire tes point/plot ?
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: Point() sur AVI ??

Message par Fortix »

Salut :D , je trouves que ton idée est chouette (Grabsprite) :idea: , mais là encore sa ne donne rien :cry: , Attention: il est possible
que j'ais mal utilisé cette fonction étant donné que je n'ais jamais utilisé "Grabsprite" ne ma vie :lol: !!

Code : Tout sélectionner

If InitMovie() And InitSprite()
    MovieName$ = OpenFileRequester("Choose the movie to play", "", "Movie files|*.avi;*.mpg;*.asf", 0)
    
    If MovieName$
        If LoadMovie(0, MovieName$)
            
            H = MovieHeight(0)       
            L = MovieWidth(0)                                
    ;{                            
            If H<>400 And L<>400
                If L>H Or L=H
                    If H > 400 Or H < 400 
                        S=400*100
                        SS=S/H
                        H=400
                                                        
                        T=L*SS
                        L=T/100
                        ff=1                               
                    EndIf
                                        
                    If L > 400 Or L < 400
                        d=400*100
                        dd=d/L
                        L=400
                                                        
                        T=H*dd
                        H=T/100
                        ww=1                                                                                   
                    EndIf  
                Else
                    If L > 400 Or L < 400
                        d=400*100
                        dd=d/L
                        L=400
                                                        
                        T=H*dd
                        H=T/100 
                        w=1                                                                                
                    EndIf 
                                        
                    If H > 400 Or H < 400 
                        S=400*100
                        SS=S/H
                        H=400
                                                        
                        T=L*SS
                        L=T/100
                        f=1                               
                    EndIf                              
                EndIf  
            EndIf
    ;}
            If w And f Or ww And ff
                Round(L,0):Round(H,0)
            EndIf 
      
            ResizeMovie(0, 0, 0, L, H)
            
            OpenWindow(0, 0, 0,420, 450, "PureBasic - Movie ["+Str(L)+" "+Str(H)+"] "+Str(MovieLength(0)))
                StickyWindow(0,1)  
                OpenWindowedScreen(WindowID(0), 0, 0, 400, 400, 0, 0, 0)
;     
                If CreateImage(0, L,H )
                    StartDrawing(ImageOutput(0)) 
                        Box(0, 0, L,H, $000000 )
                        ;DrawText(100, 120, Str(0), $00FF00,$00A5FF) 
                    StopDrawing()
                EndIf

Delay(1500)
            
            PlayMovie(0, WindowID(0))
            RenderMovieFrame(0, #PB_Movie_Rendered)
            c=1
            
            For t=150 To 160-1
                MovieSeek(0, t)
                PauseMovie(0)
                
                If CreateSprite(c, L,H)
                    If GrabSprite(c,  0, 0, L,H)
                        DisplaySprite(c, 0, 0)
                    EndIf
                    ;If CreateImage(0, 400, 400 )
;                     StartDrawing(SpriteOutput(c))
;                         Box(0, 0, L,H, $000000 )
;                     StopDrawing() 
                EndIf
Delay(1000)
                ResumeMovie(0)
                
;                 If IsImage(c)
;                     SetGadgetState(1, ImageID(c))
;                 EndIf
;                 
                c=c+1
            Next t
            
            ;StopMovie(0)
            
            Repeat    
                Event = WaitWindowEvent() 
                WindowID = EventWindow() 
                GadgetID = EventGadget() 
                EventType = EventType()
            Until Event = #PB_Event_CloseWindow
        Else
            MessageRequester("Error", "Can't load the movie...", 0)
        EndIf
    EndIf 
EndIf
Bon, s'est vrai que le code est très brouillon :lol:
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Point() sur AVI ??

Message par Thyphoon »

Si j'étais toi je procèderais totalement différemment ... il existe un bon nombre d'outil (opensource gratuit) tel que FFMPEG ou VLC (et il y en a d'autre) qui lit n'importe quel type de fichier video, et qui permettent de convertir dans d'autre format voir de sortir une image bien particulière. Et tout ça en ligne de commande. Et je pense que la solution est là. beaucoup d'outil travaillant avec les vidéos utilisent ce systèmes. Et sinon un peu plus difficile il existe aussi des libs qui en théorie doivent être capable de décompresser un peu tout et n'importe quoi. Mais c'est bien plus compliquer.

Pour le système avec librairie des tentatives on était faite sur le forum anglais :
http://www.purebasic.fr/english/viewtop ... lit=ffmpeg
mais ce n'était pas encore au point...

Parcontre via les lignes de commande ça ne devait pas poser de problème

Code : Tout sélectionner

ffmpeg -i video.mpg image%d.jpg
ça transforme un film en image( http://www.catswhocode.com/blog/19-ffmp ... -all-needs ). Mais doit y avoir possibilité de déterminer une seul image !

Code : Tout sélectionner

ffmpeg -i "video.flv" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 450x340 -ss 2 "image.jpg"
Pour une image 450x430 capturée au bout de 2 secondes de lecture de la vidéo.

Je me suis toujours dit qu'un jour ça m'amuserais de developper sur cette base un logiciel de montage video en purebasic... mais c'est comme tout! je manque de temps et j'ai plus de projet que de temps pour les réaliser ! :P

J'espère que ça t'aura aidé ...
Avatar de l’utilisateur
Thyphoon
Messages : 2706
Inscription : mer. 25/août/2004 6:31
Localisation : Eragny
Contact :

Re: Point() sur AVI ??

Message par Thyphoon »

Extraire une image d'une vidéo (un peu plus de detail)
mais il faudrait voir si il y a moyen de positioner non pas part le temps (comme -ss) mais part le numero d'image !! :P
Pour extraire une seule image à un instant donné de la vidéo voici la commande :
ffmpeg -i "fichier.avi" -vcodec mjpeg -vframes 1 -an -f rawvideo -s 640x360 -ss 20 "image.jpg"
Quelques explications :
-i "fichier.avi" : spécifie le fichier d'entrée
-vcodec mjpeg : Le codec de sortie sera "mjpeg" pour enregistrer l'image au format standart compressé
-vframes 1 : pour ne capturer qu'une image
-an : désactive le décodage du son
-f rawvideo : force l'utilisation du format en sortie
-s 640x360 : résolution de l'image capturée en sortie
-ss 20 : emplacement dans le temps de l'image à capturer"image.jpg" : spécification du fichier de sortie
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Point() sur AVI ??

Message par Backup »

j'ai fait un convertisseur video a une epoque
en fait il s'agit d'un Gui mais bon :)
il me depanne bien de temps en temps :)

http://michel.dobro.free.fr/download.php?view.19
Avatar de l’utilisateur
Fortix
Messages : 559
Inscription : mar. 30/mai/2006 17:03

Re: Point() sur AVI ??

Message par Fortix »

Merci pour vos soutients @Thyphoon et @Dobro,
je vois que vous êtes autant bleuffé que moi face à ce problème
qui est la capture des fram!, pour ma part je suis quelqu'un de très
têtu car je suis toujours parti du principe qu'un programme doit se
suffir à lui même et que faire appel à des éléments ou programmes externe me
paraits dérisoir dans sa forme car je n'oublis jamais qu'il doit passer de PC en PC

et je me vois mal forcer un utilisateur à générer une grosse quantitée d'image pour
les réutiliser aussitôt par se même programme pour enfin recréer la vidéo!

de mon côté j'ais vraiement touts éssayé même les choses les plus affolantes digne
du plus grand désespoir d'une personne face à un miracle impossible :cry: !!

merci
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Point() sur AVI ??

Message par Backup »

pour info le prg virtualdub permet beaucoups de choses
grace a ces filtres dispo en pluggins et gratuits :)

et VirtualdubMod lui gere les Mpg2
Répondre