Avatar billede rajensen Nybegynder
03. april 2016 - 14:34 Der er 1 løsning

Python2.7 & G-Streamer-1.0: tcpclientsrc: Not linked (-1)

Hej, er der en Python - G-Streamer kender, der kan hjælpe mig med at få min pipeline til at rulle..?
Er ret grøn inden for Python & G-Steamer med kodningen, men jeg kan få opsætningen til at køre med gst-launch-1.0. i begge ender.
Scriptet er oprindeligt fra pygst-tutorial-org. fundet på Git-hub.
Setup: Pipeline(A = tcpserversink streamer til Pipeline(B = tcpclientsrc.
Server sender Caps.  Den ruller med gst-launch-1.0
Jeg hat så prøvet at lave Pipeline(B) i Python.
Først med videokilde lokalt og det kørte, så programmet er Ok. Så ændrede jeg til tcpclientsrc og så gik det knap så godt...
Mit problem er at når Pipelinen skal rulle, bliver den sat på pause og jeg får fejlmeddelsen:
Error: gst-stream-error-quark: Intern datastrømsfejl. (1) gstbasesrc.c(2943): gst_base_src_loop (): /GstPipeline:player/GstTCPClientSrc:tcpclientsrc_1:
streaming task paused, reason not-linked (-1)

Jeg hat læst gst-docs, Dev-mailling list, forummer, guides og examples, men ingen steder er der en løsning med tcpclientsink og jeg er ikke blevet klogere af læsningen, andet end jeg tror at jeg måske mangler en pad til tcpclientsrc uden helt at kunne afkode hvordan eller om det er fejlen.
Så jeg bliver mægtig glad hvis der en der kan fortælle mig, hvad der er gået galt i scriptet
På forhånd tak.

#!/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.entry_host_1 =
self.builder.get_object("entry_host_1")
        self.entry_port_1 = self.builder.get_object("entry_port_1")

        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 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())
            self.tcpclientsrc_1.set_property("host", self.tcpiphost_1)
            self.tcpclientsrc_1.set_property("port", self.tcpport_1)
            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()
Avatar billede rajensen Nybegynder
09. april 2016 - 16:59 #1
Problem Løst.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester