Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - gaulois94

Pages: [1] 2 3 ... 11 Suivante »
1
Python / Re : Créer un sf.Pixels
« le: Avril 29, 2014, 10:56:26 am »
Je mes ici le code source "final" d'un VideoManager avec gstreamer et SFML (elle utilise quelques élement "négligeable" de ma lib : le code reste compréhensible sans):

#!/usr/bin/python

import time
from PIL import Image
from gi.repository import GObject
from gi.repository import Gst
import sfml as sf
import io
from Widget import Widget

GObject.threads_init()
Gst.init(None)

class VideoManager(Widget):
    def __init__(self, parent=0, path=None, rect=sf.Rectangle()):

        self._texture = sf.Texture.create(1,1)
        self._sprite = sf.Sprite(self._texture)
        self.path = path

        #The player
        self.player = Gst.ElementFactory.make("playbin", "player")

        #Config the video output
        binVideo = Gst.Bin()
        videoScale = Gst.ElementFactory.make("videoscale", "videoScale")
        videoScale.set_property("method", 0)
        self.videoFilter = Gst.ElementFactory.make("capsfilter", "videoFiltered")
        videoConvert = Gst.ElementFactory.make("videoconvert", "videoConvert")
        self.videoSink=Gst.ElementFactory.make("appsink", "videoSink")
        self.videoSink.set_property("max_buffers", 8)
        self.videoSink.set_property("drop", True)
        self.videoSink.set_property("sync", True)
        self.videoSink.set_property("async", False)
        self.videoSink.set_property("emit-signals", True)
        self.videoSink.connect("new-preroll", self.initTexture)

        videoCaps = Gst.Caps("video/x-raw, format=(string)RGBx")
        self.videoFilter.set_property("caps", videoCaps)
        self.videoCaps = Gst.Caps(videoCaps.to_string())

        #Add and link the elements to the bin video
        binVideo.add(videoScale)
        binVideo.add(self.videoFilter)
        binVideo.add(videoConvert)
        binVideo.add(self.videoSink)
        videoScale.link(self.videoFilter)
        self.videoFilter.link(videoConvert)
        videoConvert.link(self.videoSink)
        pad = videoScale.get_static_pad("sink")
        ghostPad = Gst.GhostPad.new("sink", pad)
        binVideo.add_pad(ghostPad)

        self.player.set_property("video-sink", binVideo)

        if path:
            self.player.set_property("uri", Gst.filename_to_uri(path))
        self.player.set_state(Gst.State.PLAYING)

        #Widget aide entre autre a la gestion de la position et de la taille du VideoManager
        Widget.__init__(self, parent, rect)
        self.pos = rect.position
        self.size = rect.size

        self._speed = 1
        self.requestTime = 10**9*60
        self._canSetSpeed = False

        self.bus = self.player.get_bus()
        self.streamStart = False

    def __del__(self):
        self.player.set_state(Gst.State.NULL)

    #Fonction qui met a jour les textures
    def update(self, render=None):
        videoSample = self.videoSink.get_property("last-sample")
        if videoSample:
            videoBuf = videoSample.get_buffer()
            videoData = videoBuf.extract_dup(0, videoBuf.get_size())

            pixels = sf.Pixels()
            pixels.data = videoData
            pixels.width = self._texture.width
            pixels.height = self._texture.height
            self._texture.update_from_pixels(pixels)

        message = self.bus.pop()
        while message:
            if message.type == Gst.MessageType.STREAM_START:
                self.initVideo()
            message = self.bus.pop()

        Widget.update(self, render)

    def draw(self, render=None):
        if render:
            render.draw(self._sprite)

    def setSize(self, size, resetOrigin=True):
        if size == sf.Vector2(0,0):
            return

        Widget.setSize(self, size, resetOrigin)
        self._texture = sf.Texture.create(self.size.x, self.size.y)
        self._sprite = sf.Sprite(self._texture)
        #On modifie le filter caps pour modifier "en temps reel" la taille de la video lu par gstreamer
        #(sa evite les scales avec self.sprite, et reduit la taille de la texture associe. On a donc un gain de vitesse non negligeable)
        self.videoCaps.set_value("width", self.size.x)
        self.videoCaps.set_value("height", self.size.y)

        self.videoFilter.set_property("caps", Gst.Caps(self.videoCaps.to_string()))

    def setPos(self, pos, withOrigin=True):
        Widget.setPos(self, pos, withOrigin)
        self._sprite.position = self.pos

    #Appeler des le premier buffer de la video. Elle initialise la taille de la texture
    def initTexture(self, appsink):
        videoSample = self.videoSink.get_property("last-sample")
        videoCap = videoSample.get_caps()
        videoStruct = videoCap.get_structure(0)

        self._texture = sf.Texture.create(videoStruct.get_value("width"), videoStruct.get_value("height"))
        self._sprite = sf.Sprite(self._texture)

        return Gst.FlowReturn.OK

    #Appeler des que le flux lu par le playbin commence (voir STREAM_START)
    def initVideo(self):
        self.streamStart = True
        self.setSpeed(self._speed)
        if self.requestTime:
            self.setCurrentTimeInNs(self.requestTime)
            self.requestTime = None

    def setSpeed(self, speed):
        if not self.streamStart:
            return
        self._speed = speed

        seekFlags = Gst.SeekFlags.SKIP | Gst.SeekFlags.ACCURATE | Gst.SeekFlags.FLUSH
        seekEvent = Gst.Event.new_seek(self._speed, Gst.Format.TIME,\
                seekFlags, Gst.SeekType.SET, self.time, \
                Gst.SeekType.NONE, 0)
        self.player.send_event(seekEvent)

    def getCurrentTimeInNs(self):
        return self.player.query_position(Gst.Format.TIME)[1]
   
    def setCurrentTimeInNs(self, time):
        if not self.streamStart:
            self.requestTime = time
            return
        self.player.seek_simple(Gst.Format.TIME, Gst.SeekFlags.SKIP | Gst.SeekFlags.ACCURATE | Gst.SeekFlags.FLUSH, time)

    def getDurationInNs(self):
        return self.player.query_duration(Gst.Format.TIME)[1]

    def setVolume(self, volume):
        self.player.set_property("volume", volume)

    def getVolume(self):
        return self.player.get_property("volume")

    time = property(getCurrentTimeInNs, setCurrentTimeInNs)
    speed = property(lambda self:self._speed, setSpeed)
    volume = property(getVolume, setVolume)

2
Python / Re : Créer un sf.Pixels
« le: Avril 27, 2014, 11:59:46 pm »
Je la donne à la texture, en effet, c'est plus simple un update (et sans doute plus rapide :) ). Gstreamer est quand même assez rapide. Pour une video en HD, l'afficher en 60 fps ne me prends que la moitier de mon processeur, c'est plutôt rentable je pense :) . J'essayerai d'optimiser tout sa le moment venu :)

3
Python / Re : Créer un sf.Pixels
« le: Avril 27, 2014, 10:20:02 pm »
Beaucoup mieux que de passer par Image(pixels, width, height) ? (chose que j'ai faites, après modification de code source du binding).

4
Python / Re : Créer un sf.Pixels
« le: Avril 27, 2014, 04:29:16 pm »
Tout simplement un petit lecteur vidéo en utilisant gstreamer (qui est un peu tiré par les cheveux x) ).

5
Python / Re : Créer un sf.Pixels
« le: Avril 27, 2014, 01:42:39 pm »
Bon, je n'ai pas eu d'autre choix que de modifier les sources du binding sfml pour ajouté les setters de Pixels, et retirer l'exception à sa création.

6
Python / Re : Créer un sf.Pixels
« le: Avril 27, 2014, 12:28:37 pm »
J'ai quand même vu la fonction sf.Image.from_pixels qui me fait penser qu'on peut l'utiliser.... Ce que j'ai du faire c'est passé par PIL.Image.frombuffer et utiliser la fonction save pour obtenir un jpeg et enfin la donné à la SFML. C'est assez moche (programmatiquement parlant) et lent (je fait un petit décodeur vidéo pour la SFML avec gstreamer). Avec la SFML, vous avez la fonction create qui prends justement les paramètres width, height et data (ce que j'essaye de faire avec python)

Pour ceux à qui le code peut intéresser, le voici :

#!/usr/bin/python

from PIL import Image
from gi.repository import GObject
from gi.repository import Gst
import sfml as sf
import io
GObject.threads_init()
Gst.init(None)
 
player = Gst.ElementFactory.make("playbin", "player")
player.set_property("uri", "http://docs.gstreamer.com/media/sintel_trailer-480p.webm")

videoSink = Gst.ElementFactory.make("appsink", "videoSink")
videoConvert = Gst.ElementFactory.make("videoconvert", "videoConvert")

caps = Gst.Caps("video/x-raw, format=(string)RGBx")
videoSink.set_property("caps", caps)

player.add(videoConvert)
player.set_property("video-sink", videoSink)
player.set_state(Gst.State.PLAYING)

window = sf.RenderWindow(sf.VideoMode(800, 600, 32), "test")
window.framerate_limit = 60

while window.is_open:
    window.clear()
    for event in window.events:
        if type(event) == sf.CloseEvent:
            window.close()

    if player.get_property("video-sink").get_property("last-sample"):
        sample = player.get_property("video-sink").get_property("last-sample")
        buf = sample.get_buffer()
        cap = sample.get_caps()

        data = buf.extract_dup(0, buf.get_size())
        struct = cap.get_structure(0)

        image = Image.frombuffer("RGBA", (struct.get_value("width"), struct.get_value("height")), data)

        rawImage = io.BytesIO()
        image.save(rawImage, format="jpeg")
        sfImage = sf.Image.from_memory(rawImage.getvalue())

        texture = sf.Texture.from_image(sfImage)
        sprite = sf.Sprite(texture)
        window.draw(sprite)
        window.display()

7
Python / Créer un sf.Pixels
« le: Avril 27, 2014, 02:13:01 am »
Bonsoir,

Voila quand j'essaye de me créer mon propre tableaux de pixels, j'ai l'erreur suivante :

Traceback (most recent call last):
  File "./test.py", line 26, in <module>
    pixels = sf.Pixels()
  File "window.pyx", line 659, in sfml.window.Pixels.__init__ (src/sfml/window.cpp:11621)
UserWarning: This class is not meant to be used directly
 

Tu parles de warning mais lève une exception.... Comprends pas x). J'aurai aimé créer une Image via un "bytes" de donnés d'image. Merci d'avance.

8
Fenêtrage / Re : Forcé un resize
« le: Novembre 03, 2013, 01:43:01 pm »
Après un tour sur le code source de la SFML j'ai trouvé l'erreur. Dans ImplWindowWin32.cpp , tu ne lances l'event "Resized" uniquement si la FENÊTRE est resizé, et non le Widgets lié à sf::RenderWindow. Je pense que tu devrais faire une condition pour vérifier si m_size est différents de la taille alloué à sf::RenderWindow.

9
Fenêtrage / Forcé un resize
« le: Novembre 01, 2013, 08:56:19 pm »
Bonsoir,

Alors voila sous Windows (et uniquement sous Windows), lorsque je lie un sf.RenderWindow avec une fenêtre Gtk3 (je suppose que ma version de Gtk3 est correct, pas envie de tout recompiler ! ), sf.RenderWindow n'arrive pas à recevoir l'événement "Resized".

Ce qui est dérangeant c'est que les render.setSize() ne sont pas pris en compte si la fenêtre n'arrive pas à capturer cette événement..... Je voudrai donc la forcé à se resizer, et ma question est comment faire ?

Merci d'avance :)

édit : je me demande si on peut appeler la fonction "onResize" de tel sorte à ce que la fenêtre SFML se remettre à jour (j'ai essayé de faire des "create" mais c'est juste trop lent et inbuvable ! ).

édit 2 : J'ai encore mieux (essayé avec deux scripts python : un pour gérer la fenêtre Gtk, et l'autre pour gérer la SFML).

J'ai créé une fenêtre Gtk (bien que se soit du python, le code est suffisament simple pour être compréhensible):
>>> from gi.repository import Gtk, GdkWin32
>>> window=Gtk.Window()
>>> window.get_window()
>>> window.show_all()
>>> GdkWin32.Win32Window.get_handle(window.get_window())
5112470
>>> GdkWin32.Win32Window.get_impl_hwnd(window.get_window())
5112470
>>> Gtk.main()

Je créé donc une sf.RenderWindow avec lequel je donne ce nombre (5112470). Lorsque je fais un setSize, la fenêtre Gtk est resizé, mais la zone de dessin reste à sa valeur initiale. Je m'explique : initialement, la fenêtre fait (200, 200). Si je fais un render.SetSize(sf::Vector2(300, 300)) (où render est un sf.RenderWindow), la zone de dessin reste à (200, 200) mais la fenêtre Gtk fait (300, 300) :o . Cela peut-il venir du code python ou celui de la SFML ? (j'ai relu l'implémentation python, il fait simplement le lien entre l'interpréteur et la SFML codé en C++).

Je tiens à dire que se problème ne se trouve que sous Window (ici Window XP dans une virtual box). Merci d'avance :) .

10
Python / Re : Débutant avec pySFML
« le: Août 14, 2013, 01:40:33 am »
sf.Clock.elapsed_time.microseconds ne correspond pas à tes besoin ? Sa te retourne le temps qu'il s'est écoulé entre le dernier restart et le moment où tu appel le getter. Ensuite tu fait :

text = sf.Text(str(1/(10**-6*self.time), sf.Font.from_file("ta font"))

et voila, tu as tout ce qu'il faut :)

11
Graphique / Re : GTK3 et la SFML
« le: Août 03, 2013, 12:40:57 pm »
Merci.
En réalité, c'était plus un problème de binding qu'autre choses (je programme avec python et j'exporte  mon code sous windows). À la compilation, il avait oublié de compiler GdkWin32 qui contient la classe Win32Window qui elle même contient get_handle :) (ce fut une guerre insurmontable pour obtenir ce trucs :) ).

12
Graphique / Re : GTK3 et la SFML
« le: Août 02, 2013, 01:41:09 am »
C'est exact : sous Linux, j'utilise GdkX11 qui me permettais de faire un get_xid().
Sous windows, quand j'ai essayé la command, je suis tombé sur un Gtk.Win32Window !

13
Graphique / GTK3 et la SFML
« le: Août 02, 2013, 12:22:31 am »
Bonsoir (oui il est tard :) )

Alors voila, sous linux, je peux facilement dir à une fenêtre SFML de s'intégrer à GTK à l'aide de SFMLArea.get_property("window").get_xid() où SFMLArea est un DrawingArea.

Seul soucis, get_xid() ne fonctionne que pour les fenêtres tournant sous X11 !!! J'aimerai donc connaître son équivalent Window si possible (ou alors une façon plus propre d'intégrer SFML à GTK).

Merci d'avance :) .

14
Python / Re : pysfml et gtk3
« le: Juillet 30, 2013, 11:25:23 pm »
J'ai essayé de rajouter quelques property, mais il en manque énormément. Aujourd'hui je suis bloqué avec la property "events".
J'ai essayé ceci :
        property events:
                def __get__(self):
                        return Window.events_generator(self)
dans la classe HandledWIndow, le code compile, mais à l'utilisation, j'ai ce message d'erreur : TypeError: descriptor 'events_generator' requires a 'sfml.window.Window' object but received a 'sfml.graphics.HandledWindow

Je ne comprends pas pourquoi sa ne fonctionne pas, pourtant les attributs sont compatible !

15
Python / pysfml et gtk3
« le: Juillet 28, 2013, 09:56:56 pm »
Salut,

voila j'utilise le binding de Sonkun, et j'ai un tout petit soucis : il manque un constructeur pour pouvoir créé une RenderWindow depuis une fenêtre GTK existante !!!

J'utilise pour le moment GTK3 (présent dans gi.repository). Toutes propositions est la bienvenue.

Merci d'avance :D

édit : en touchant un peu au code cython, j'ai remarqué une classe que je en trouvais pas dans la documentation : HandledWindow. Pourrais-tu (Sonkun) la rajouté dans la documentation ? Ah oui, j'ai aussi vu qu'elle ne gère que sf.RenderWindow (j'ai de la chance, c'était ce que je voulais). Mais si un jour une personne aurait besoin d'un sf.WIndow, se serait bien de l'avoir :) . Merci d'avance :D

Pages: [1] 2 3 ... 11 Suivante »