2017-05-04 2 views
2

Ich versuche, mit Python einen Netzwerk-Video-Stream zu erfassen und anzuzeigen. Der Strom wurde angelegt (auf meinem Laptop) mit dem folgenden Befehl:Capture gstreamer Netzwerk-Video mit Python

gst-launch-1.0 v4l2src ! videorate ! video/x-raw,framerate=2/1,width=640,height=480 ! x264enc pass=qual quantizer=20 tune=zerolatency ! rtph264pay config-interval=10 pt=96 ! udpsink host=127.0.0.1 port=5000 

Es nimmt die Webcam Eingang und Ströme sie über einen UDP-Port. Ich kann den Strom erfassen und sie mit folgendem Befehl angezeigt werden:

gst-launch-1.0 udpsrc port=5000 ! "application/x-rtp, payload=127" ! rtph264depay ! avdec_h264 ! xvimagesink sync=false 

Jetzt versuche ich, den gleiche (Capture) mit einem Python-Skript zu tun, aber ohne Mangel. Hier ist mein Code:

import gi 
gi.require_version('Gst', '1.0') 
from gi.repository import Gst 

udpPipe = Gst.pipeline("player") 
source = Gst.ElementFactory.make('udpsrc', None) 
source.set_property("port", 5000) 
source.set_property("host", "127.0.0.1") 

rdepay = Gst.ElementFactory.make('rtph264depay', 'rdepay') 
vdecode = Gst.ElementFactory.make('avdec_h264', 'vdecode') 
sink = Gst.ElementFactory.make('xvimagesink', None) 

udpPipe.add(source, rdepay, vdecode, sink) 
gst.element_link_many(source, rdepay, vdecode, sink) 
udpPipe.set_state(gst.STATE_PLAYING) 

Der Fehler Ich erhalte ist:

/usr/lib/python2.7/dist-packages/gi/overrides/Gst.py:56: Warning: /build/glib2.0-prJhLS/glib2.0-2.48.2/./gobject/gsignal.c:1674: parameter 1 of type '<invalid>' for signal "GstBus::sync_message" is not a value type 
    Gst.Bin.__init__(self, name=name) 
/usr/lib/python2.7/dist-packages/gi/overrides/Gst.py:56: Warning: /build/glib2.0-prJhLS/glib2.0-2.48.2/./gobject/gsignal.c:1674: parameter 1 of type '<invalid>' for signal "GstBus::message" is not a value type 
    Gst.Bin.__init__(self, name=name) 
Traceback (most recent call last): 
    File "getUdp.py", line 13, in <module> 
    source = Gst.ElementFactory.make('udpsrc', None) 
    File "/usr/lib/python2.7/dist-packages/gi/overrides/Gst.py", line 217, in make 
    return Gst.ElementFactory.make(factory_name, instance_name) 
TypeError: unbound method fake_method() must be called with ElementFactory instance as first argument (got str instance instead) 

Irgendwelche Ideen?

:-(
+0

ich nur in das gleiche Problem ausgeführt haben. ich sehe, dass Sie benutze Python 2.7 als bin Ich habe Gst in einer Python 3 Umgebung getestet und es hat funktioniert. Jetzt möchte ich es in einer Python 2-Anwendung implementieren und habe diesen Fehler bekommen. Ich bin mir noch nicht sicher, wie das behoben werden kann. Aber ich wollte sowieso die Anwendung auf Python 3 portieren. Aber das wird Zeit brauchen. Wenn es funktioniert und ich diesen Link bis dahin nicht vergessen habe, werde ich Ihnen ein Update geben. – exhuma

Antwort

2

Ich habe auch den gleichen Fehler auf Debian 9.3 (Strecke) heute. Explizit Gst.init das Problem behoben Aufruf.

folgenden Code ein xvimagesink Fenster auf meinem System sowohl mit Python 2.7 und 3.5 aufgetaucht.

#!/usr/bin/python 
import sys 
import gi 
gi.require_version('GLib', '2.0') 
gi.require_version('Gst', '1.0') 
from gi.repository import GLib, Gst 

Gst.init(sys.argv) 

udpPipe = Gst.Pipeline("player") 
source = Gst.ElementFactory.make('udpsrc', None) 
source.set_property("port", 5000) 
#source.set_property("host", "127.0.0.1") 
caps = Gst.caps_from_string("application/x-rtp, payload=127") 
source.set_property("caps", caps) 

rdepay = Gst.ElementFactory.make('rtph264depay', 'rdepay') 
vdecode = Gst.ElementFactory.make('avdec_h264', 'vdecode') 
sink = Gst.ElementFactory.make('xvimagesink', None) 
sink.set_property("sync", False) 

udpPipe.add(source, rdepay, vdecode, sink) 

#Gst.element_link_many(source, rdepay, vdecode, sink) 
source.link(rdepay) 
rdepay.link(vdecode) 
vdecode.link(sink) 

udpPipe.set_state(Gst.State.PLAYING) 

GLib.MainLoop().run() 

ich denke, es notwendig ist, Gst.init anrufen und mainloop laufen gst-Start-Befehlszeile in python-Skript mit pygobject zu konvertieren.