Python mit Gstreamer - warten auf EOF signal

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
caco3
User
Beiträge: 3
Registriert: Dienstag 5. April 2011, 09:14

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
  
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!?
caco3
User
Beiträge: 3
Registriert: Dienstag 5. April 2011, 09:14

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
caco3
User
Beiträge: 3
Registriert: Dienstag 5. April 2011, 09:14

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.
Antworten