Page 1 sur 1

Point() sur AVI ??

Publié : jeu. 10/sept./2009 1:12
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!

Re: Point() sur AVI ??

Publié : jeu. 10/sept./2009 4:40
par Thyphoon
tu peux utiliser la fonction point() sur un sprite dans le quel tu joue le film avec la fonction RenderMovieFrame(#Film, SpriteID)

Re: Point() sur AVI ??

Publié : sam. 12/sept./2009 15:56
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 !)

Re: Point() sur AVI ??

Publié : sam. 12/sept./2009 16:06
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.

Re: Point() sur AVI ??

Publié : sam. 12/sept./2009 22:40
par Fortix
Ah interessant, jvais voir ça

Re: Point() sur AVI ??

Publié : sam. 12/sept./2009 22:52
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é !

Re: Point() sur AVI ??

Publié : dim. 13/sept./2009 23:08
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 !

Re: Point() sur AVI ??

Publié : dim. 13/sept./2009 23:25
par Anonyme
et si tu utilises grabsprite() pour capturer la zone voulue pour faire tes point/plot ?

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 1:00
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:

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 7:18
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é ...

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 7:54
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

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 9:21
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

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 18:18
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

Re: Point() sur AVI ??

Publié : mar. 15/sept./2009 18:34
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