Seite 1 von 1

Python mit Gstreamer - warten auf EOF signal

Verfasst: Dienstag 5. April 2011, 09:18
von caco3
Hallo zusammen

Ich habe einen einfachen mp3 Player gebaut mit Python und Gstreamer.
Nun benötige ich ein Signal, wenn der Dateistream fertig ist.
Gemäss Beispielen sollte unterstehender Code funktionieren, aber ich kriege nie eine Messsage :(

Hat irgend jemand einen Tip dazu?

Code: Alles auswählen

import pygst
pygst.require("0.10")
import gst

from time import *

file = "~/aaa.mp3"


def on_message(bus, message):
  print "message"
  t = message.type
  if t == gst.MESSAGE_EOS:
      gstream_player.set_state(gst.STATE_NULL)
      print "MESSAGE_EOS"
  elif t == gst.MESSAGE_ERROR:
      gstream_player.set_state(gst.STATE_NULL)
      print "MESSAGE_ERROR"
      err, debug = message.parse_error()
      logger.error("ERROR: %s, %s" % (err, debug) )




gstream_player = gst.element_factory_make("playbin2", "player")
fakesink = gst.element_factory_make("fakesink", "fakesink")
gstream_player.set_property("video-sink", fakesink)

bus = gstream_player.get_bus()
bus.add_signal_watch()
bus.connect("message", on_message)
#bus.connect("message::eos", on_message)



gstream_player.set_property("uri", "file://" + file)
gstream_player.set_state(gst.STATE_PLAYING)


i=0
while(1):
  sleep(1)
  i=i+1
  print i
  

Re: Python mit Gstreamer - warten auf EOF signal

Verfasst: Dienstag 5. April 2011, 11:06
von BlackJack
@caco3: Der Dateiname existiert wahrscheinlich nicht. Die Tilde ('~') ist etwas was normalerweise von der Shell zum Benutzerverzeichnis expandiert wird. Ausserhalb ist das einfach nur ein Zeichen wie jedes andere auch. Wenn Du also kein Verzeichnis mit dem Namen '~' hast, in dem eine MP3-Datei liegt, dann geht das so nicht.

Ansonsten muss man doch sicher den ganzen GObject/Glib-Kram drumherum machen, also zum Beispiel eine Glib-Hauptschleife laufen lassen, damit die Nachrichten und Ereignisse überhaupt "transportiert" werden!?

Re: Python mit Gstreamer - warten auf EOF signal

Verfasst: Dienstag 5. April 2011, 11:13
von caco3
Die Datei wird abgespielt, an einem falschen Dateipfad kann es also nicht liegen.

Gut möglich, dass es noch mehr code braucht.
Ich habe dies hier als Minimalbeispiel aus einem anderen Programm extrahiert.
Werde mal schauen, ob da noch was anderes dazukommen muss.

Danke für die Info

[Solved] Python mit Gstreamer - warten auf EOF signal

Verfasst: Dienstag 5. April 2011, 13:35
von caco3
Habs jetzt hingekriegt.

Musste noch das Modul glib importieren.

Dann am Ende der main funktion in die Schlaufe gehen:

Code: Alles auswählen

glib.MainLoop().run()
Und das Programm zu beenden, muss dieser Loop beendet werden:

Code: Alles auswählen

glib.MainLoop().quit()

In meinem richtigen Softwareprojekt hatte ich allerdings schon eine andere Main-Schlaufe:

Code: Alles auswählen

sys.exit(app.exec_())
Diese musste ich dann auskommentieren.

Soweit ich sehe funktioniert jetzt alles wie es soll.