使用Python捕获gstreamer网络视频

问题描述 投票:2回答:1

我正在尝试使用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

它需要网络摄像头输入并通过UDP端口进行流式传输。我可以使用以下命令捕获流并显示它:

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

现在我试图用Python脚本做同样的(捕获),但不缺乏。这是我的代码:

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)

我得到的错误是:

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

有任何想法吗? :-(

python video-streaming gstreamer
1个回答
2
投票

今天我在Debian 9.3(延伸)上也遇到了同样的错误。明确地调用Gst.init解决了这个问题。

下面的代码在我的系统上弹出了一个xvimagesink窗口,同时包含python 2.7和3.5。

#!/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()

我认为有必要调用Gst.init并运行mainloop将gst-launch命令行转换为PyGObject的python脚本。

© www.soinside.com 2019 - 2024. All rights reserved.