Python 2.7 Python Gstreamer从头开始:tcpclientsrc未链接

Python 2.7 Python Gstreamer从头开始:tcpclientsrc未链接,python-2.7,gstreamer,Python 2.7,Gstreamer,是否有Python-G-Streamer专家可以帮助med使用我的小脚本? 作为一个新手,要想弄清楚这里出了什么问题并不容易 设置:从A:tcpserversink到B:tcpclientsrc的流 CAP设置在服务器端。 问题:在B上:当管道开始滚动时,流暂停。错误:tcpclientsrc:未链接(-1) 我可以使用gst-launch-1.0制作一个将运行的管道,并且我知道我的流是正确的,因为如果:tcpserversink未运行,我将从gst获得expectet错误消息,即连接被拒绝。

是否有Python-G-Streamer专家可以帮助med使用我的小脚本?
作为一个新手,要想弄清楚这里出了什么问题并不容易

设置:从A:tcpserversink到B:tcpclientsrc的流 CAP设置在服务器端。
问题:在B上:当管道开始滚动时,流暂停。错误:tcpclientsrc:未链接(-1)
我可以使用gst-launch-1.0制作一个将运行的管道,并且我知道我的流是正确的,因为如果:tcpserversink未运行,我将从gst获得expectet错误消息,即连接被拒绝。 我怀疑这可能是因为tcpclientsrc缺少pad。 我的脚本基于一个正在工作的播放器,所以我只尝试将源代码更改为tcpclientsrc。布局也已从Gtk硬代码更改为带有Glade的布局,并可工作到。不幸的是,最初的脚本使用的是playbin,所以没有太多关于pad之类的东西。 如果任何人都准备好了一个基于tcpclientsrc的脚本,我很乐意看看,这样我就可以修改我的脚本了。
我在web上找不到一个使用tcpserversink/tcpclientlink的示例:-o

谢谢你的帮助。我真的很感激

#!/usr/bin/env python

import os, platform

try:
  import gi
except:
  print("No GI")
try:
  gi.require_version('Gtk', '3.0')
  from gi.repository import GObject,Gtk as Gtk
except:
  print("No Gtk")
try:
  gi.require_version ('Gst', '1.0')
  from gi.repository import Gst
except:
  print("No Gst")
try:
# Needed for window.get_xid(), xvimagesink.set_window_handle(), respectively:
  gi.require_version('GdkX11', '3.0')
  from gi.repository import GdkX11
except:
  print("No GdkX11 3.0")
try:
  gi.require_version('GstVideo', '1.0')
  from gi.repository import GstVideo
except:
  print("No GstVideo 1.0")
  sys.exit(1)


class GTK_Main(object):

def __init__(self):
    ## Create a window,
    self.gladefile = ("hello_Gstream_tcpclient_work.glade")
    self.builder = Gtk.Builder()
    self.builder.add_from_file(self.gladefile)
    self.builder.connect_signals(self)

    ## Create objects by name from Glade
    self.window = self.builder.get_object("window")
    self.movie_window = self.builder.get_object("movie_window")
    self.button1 = self.builder.get_object("button1")
    self.button2 = self.builder.get_object("button2")
    self.button3 = self.builder.get_object("button3")
    self.entry_host_1 = self.builder.get_object("entry_host_1")
    self.entry_host_2 = self.builder.get_object("entry_host_2")
    self.entry_host_3 = self.builder.get_object("entry_host_3")
    self.entry_port_1 = self.builder.get_object("entry_port_1")
    self.entry_port_2 = self.builder.get_object("entry_port_2")
    self.entry_port_3 = self.builder.get_object("entry_port_3")
    self.window.show_all()

    ## Create pipeline & connect bus
    self.player = Gst.Pipeline.new("player")
    bus = self.player.get_bus()
    bus.add_signal_watch()
    bus.enable_sync_message_emission()
    bus.connect("message", self.on_message)
    bus.connect("sync-message::element", self.on_sync_message)

    ## Create tcpclientsr, gdpdepay, rtph264depay, h264parse, decodebin,
    ## videoconvert, autovideosink
    self.tcpclientsrc_1 = Gst.ElementFactory.make("tcpclientsrc", "tcpclientsrc_1")
    self.gdpdepay_1 = Gst.ElementFactory.make("gdpdepay", "gdpdepay_1")
    self.rtph264depay_1 = Gst.ElementFactory.make("rtph264depay", "rtph264depay_1")
    self.h264parse_1 = Gst.ElementFactory.make("h264parse", "h264parse_1")
    self.decodebin_1 = Gst.ElementFactory.make("decodebin", "decodebin_1")
    self.videoconvert_1 = Gst.ElementFactory.make("videoconvert", "videoconvert_1")
    self.autovideosink = Gst.ElementFactory.make("autovideosink", "autovideosink")

    ## Add elements to pibeline
    self.player.add(self.tcpclientsrc_1)
    self.player.add(self.gdpdepay_1)
    self.player.add(self.rtph264depay_1)
    self.player.add(self.h264parse_1)
    self.player.add(self.decodebin_1)
    self.player.add(self.videoconvert_1)
    self.player.add(self.autovideosink)

    ## Link elements
    self.tcpclientsrc_1.link(self.gdpdepay_1)
    self.gdpdepay_1.link(self.rtph264depay_1)
    self.rtph264depay_1.link(self.h264parse_1)
    self.h264parse_1.link(self.decodebin_1)
    self.decodebin_1.link(self.videoconvert_1)
    self.videoconvert_1.link(self.autovideosink)

## Create handles
def on_window_destroy(self, object, data=None):
    Gtk.main_quit()

def on_button1_clicked(self, object, data=None):
    w = self.entry_host_1.get_text().strip()
    self.start_stop(w)

def on_button2_clicked(self, object, data=None):
    a = ""

def on_button3_clicked(self, object, data=None):
    a = ""

def start_stop(self, w):
    if self.button1.get_label() == "Start":
        self.tcpiphost_1 = self.entry_host_1.get_text().strip()
        self.tcpport_1 = int(self.entry_port_1.get_text().strip())
        #print tcpiphost_1
        #print tcpport_1
        self.tcpclientsrc_1.set_property("host", self.tcpiphost_1)
        self.tcpclientsrc_1.set_property("port", self.tcpport_1)
        print self.tcpclientsrc_1.get_property("host")
        print self.tcpclientsrc_1.get_property("port")
        self.button1.set_label("Stop")
        self.player.set_state(Gst.State.PLAYING)
    else:
        self.player.set_state(Gst.State.NULL)
        self.button1.set_label("Start")

def on_message(self, bus, message):
    t = message.type
    if t == Gst.MessageType.EOS:
        self.player.set_state(Gst.State.NULL)
        self.button1.set_label("Start")
    elif t == Gst.MessageType.ERROR:
        self.player.set_state(Gst.State.NULL)
        err, debug = message.parse_error()
        print "Error: %s" % err, debug
        self.button1.set_label("Start")

def on_sync_message(self, bus, message):
    if message.get_structure().get_name() == 'prepare-window-handle':
        imagesink = message.src
        imagesink.set_property("force-aspect-ratio", True)
        imagesink.set_window_handle(self.movie_window.get_property('window').get_xid())


GObject.threads_init()
Gst.init(None)        
GTK_Main()
Gtk.main()

注:仅此处缩进不正确。脚本中的所有内容都是正确的。:-)

我建议首先使用gst-launch-1.0实现这一点。。gst启动用于测试/运行壳牌公司的管道。。您可以运行此命令:
gst-launch-1.0 tcpclientsrc host=192.168.1.123 port=8888!gdpdepay!rtph264depay!h264parse!德克宾!视频转换!自动视频接收器
。。就个人而言,我觉得您设置主机/端口之类的属性太晚了。。你可以尝试这种方法1创建元素,设置属性,链接..嘿,Otopolsky我已经用Gst启动器运行了管道,以确保管道正在滚动,并且流是可访问的。我的目标是用Python创建一个G-streamer,而不仅仅是简单地完成它。启动器有一些技巧,另一种方法是使用launchparser。但是我想从a->z创建和控制管道。所以我进一步研究了剧本,我离我的目标越来越近了。事实上,我已经考虑关闭这个线程12小时前,随着项目正在步入正轨。