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()
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