Seite 1 von 1

Kleiner Videorekorder mit GStreamer + GTK. Sehr langsam

Verfasst: Montag 15. März 2010, 09:52
von Barabbas
Hallo zusammen,

ich möchte einen kleinen "Videorekorder" zimmern. Zutaten sind meine TV-Karte, V4L2, GStreamer und GTK.
Warum die Frage hier bei GTK steht: Aus irgendwelchen Gründen ist die Bildwiedergabe *extrem* langsam. Ich würde sagen, ich bekomme ca. 8 FPS hin. Weiß jemand, wo das Problem liegt?

Hier mal mein Code:

Code: Alles auswählen

#!/usr/bin/python
import pygtk
import pygst
pygst.require("0.10")

import gtk
import gst

class Main:
    def __init__(self):

        #GUI
        self.window = gtk.Window()
        self.vbox = gtk.VBox()
        self.drawingarea = gtk.DrawingArea()
        self.buttonbox = gtk.HButtonBox()
        self.drawingarea.set_size_request(300,150)
        
        self.btnPlay = gtk.Button(stock='gtk-media-play')
        self.btnPlay.connect("clicked", self.btnPlay_clicked_cb)
        self.btnStop = gtk.Button(stock='gtk-media-stop')
        self.btnStop.connect("clicked", self.btnStop_clicked_cb)
        self.btnQuit = gtk.Button(stock='gtk-quit')
        self.btnQuit.connect("clicked", self.btnQuit_clicked_cb)
        self.vbox.pack_start(self.drawingarea, True, True)
        self.buttonbox.add(self.btnPlay)
        self.buttonbox.add(self.btnStop)
        self.buttonbox.add(self.btnQuit)
        
        self.vbox.pack_start(self.buttonbox, False, False)
        self.window.add(self.vbox)

        self.pipeline = gst.Pipeline("player")
        
        self.v4l = gst.element_factory_make("v4l2src", "device=/dev/video0")
        self.deinterlace = gst.element_factory_make("ffdeinterlace", "deinterlace")
        self.videoscale = gst.element_factory_make("videoscale", "scale")
        self.ffmpeg = gst.element_factory_make("ffmpegcolorspace", "ffmpeg")
        caps = gst.Caps("video/x-raw-rgb,width=640,height=480,fps=25")
        self.filter = gst.element_factory_make("capsfilter", "filter")
        self.filter.set_property("caps", caps)
        self.videosink = gst.element_factory_make("xvimagesink", "videosink")
        
        self.pipeline.add(self.v4l, self.filter, self.videoscale, self.ffmpeg, self.videosink)
        gst.element_link_many(self.v4l, self.filter, self.videoscale, self.ffmpeg, self.videosink)
        
        self.osssrc = gst.element_factory_make("osssrc", "device=/dev/dsp")
        self.osssink = gst.element_factory_make("osssink", "audiosink")
        self.pipeline.add(self.osssrc, self.osssink)
        gst.element_link_many(self.osssrc, self.osssink)
        
        
        self.window.show_all()



    def btnPlay_clicked_cb(self, widget):
        print "play"
        self.videosink.set_xwindow_id(self.drawingarea.window.xid)
        self.pipeline.set_state(gst.STATE_PLAYING)

    def btnStop_clicked_cb(self, widget):
        print "stop"
        self.pipeline.set_state(gst.STATE_READY)
        
    def btnQuit_clicked_cb(self, widget):
        gtk.main_quit()

start=Main()
gtk.main()
Ich vermute stark, dass hier immer auf der DrawingArea gezeichnet wird und das Bild nicht einfach im Overlay angezeigt wird. Weiß jemand, wie ich das ändern kann?

Danke schonmal!

brb

//edit:
In meinem Rechner werkeln übrigens zwei Kerne mit jeweils 3 GHz - daran kann es doch eigentlich nicht liegen, oder? RAM habe ich ein GB. Mit anderen TV-Programmen läuft es auch bestens.
//edit2:
Die entsprechende GST-Pipe gibt bei mir aber auch ein ruckelndes Bild aus. Ist vll. die Pipe sogar falsch?
gst-launch-0.10 v4l2src device=/dev/video0 ! video/x-raw-rgb,width=640,height=480 ! ffmpegcolorspace ! xvimagesink \ osssrc device=/dev/dsp ! osssink

Verfasst: Montag 15. März 2010, 13:07
von Barabbas
Hallo!

Ich habe das Problem gelöst. Es müssen mehr Queue-Elemente eingefügt werden. Leider hat sich mein Code schon etwas weiterentwickelt, so dass ich gerade nicht mehr sagen kann, wo im obigen Beispiel die Queues fehlten. Ich vermute, nach dem FFMPEG-Element. Ich werde das nochmal nachreichen, damit andere auch davon profitieren.

Gruß,

brb