Kleiner Videorekorder mit GStreamer + GTK. Sehr langsam

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Barabbas
User
Beiträge: 349
Registriert: Dienstag 4. März 2008, 14:47

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
Antworten