pygst spielt keine Musik

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
BugsBenny96
User
Beiträge: 3
Registriert: Sonntag 6. Mai 2018, 09:57

Hallo,
ich wollte mit python ein Plugin für einen Mediaserver bauen um die Musik direkt vor ort abzuspielen. Als ich geschaut habe wie ich Musik abspielen kann bin ich auf folgenden Link gestoßen

http://guzalexander.com/2012/08/17/play ... ython.html

Die methode mit gstreamer fand ich interessant, weil ich mich sowieso damit beschäftigen wollte. Also lautet mein Code momentan wie folgt

Code: Alles auswählen

import pygst
pygst.require('0.10')
import gst
import gobject
import os

mainloop = gobject.MainLoop()
pl = gst.element_factory_make("playbin","player")
pl.set_property('uri','file://'+os.path.abspath('1MG.ogg'))
pl.set_state(gst.STATE_PLAYING)
mainloop.run()
Als ich dann noch die nötigen dependencies installiert habe lief das Programm auch ohne Fehler. Aber ich habe immernoch keine Musik gehört.

Wenn ich das Programm zeile für Zeile durchgehe, meldet er bei

Code: Alles auswählen

pl.set_state(gst.STATE_PLAYING)
den Fehler/die Warnung

Code: Alles auswählen

<enum GST_STATE_CHANGE_ASYNC of type GstStateChangeReturn>
Damit kann ich leider auch nicht viel anfangen und stundenlanges Googlen hat mir nicht weitergeholfen.

Was ich gefunden habe ist
Some elements might need to return GST_STATE_CHANGE_ASYNC and complete the state change when they have enough information. It is a requirement for sinks to return GST_STATE_CHANGE_ASYNC and complete the state change when they receive the first buffer or GST_EVENT_EOS (preroll). Sinks also block the dataflow when in PAUSED.
Aber das hilft mir jetzt in der Form auch nicht weiter, weil ich immernoch nicht weis was falsch sein soll.

Ich arbeite mit Python2 auf Ubuntu und ja die OGG datei existiert ;) ich hoffe mir kann jemand helfen :)

MfG Benny
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ist schon wieder eine Weile her, aber wenn ich mich recht erinnere muss manchmal der mainloop schon laufen bevor man ein State change auslösen kann. Wenn du dir andere Beispiele anschaust, die zb mit GUI & einem Start Button arbeiten (https://github.com/brettviren/pygst-tut ... example.py ) dann ist das da implizit so. Weitere Debugging Möglichkeiten: gst-launch verwenden, und schauen, ob das tut.
BugsBenny96
User
Beiträge: 3
Registriert: Sonntag 6. Mai 2018, 09:57

__deets__ hat geschrieben:Ist schon wieder eine Weile her, aber wenn ich mich recht erinnere muss manchmal der mainloop schon laufen bevor man ein State change auslösen kann. Wenn du dir andere Beispiele anschaust, die zb mit GUI & einem Start Button arbeiten (https://github.com/brettviren/pygst-tut ... example.py ) dann ist das da implizit so. Weitere Debugging Möglichkeiten: gst-launch verwenden, und schauen, ob das tut.
Hmm. Erst mainloop starten hat nicht geholfen, aber das GUI Programm funktioniert erstmal. Damit kann ich arbeiten.
Vielen Danke :)
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na wenn du einfach nur den mainloop vorziehst geht das natürlich nicht. Dann stoppt der Code da. Dein Play muss dann ein Ereignis werden, zb per timer. Oder wie im Fall der GUI eine userinteraktion.
BugsBenny96
User
Beiträge: 3
Registriert: Sonntag 6. Mai 2018, 09:57

__deets__ hat geschrieben:Na wenn du einfach nur den mainloop vorziehst geht das natürlich nicht. Dann stoppt der Code da. Dein Play muss dann ein Ereignis werden, zb per timer. Oder wie im Fall der GUI eine userinteraktion.

Code: Alles auswählen

import pygst
pygst.require('0.10')
import gst
import gobject
import os
import threading

mainloop = gobject.MainLoop()
pl = gst.element_factory_make("playbin","player")
pl.set_property('uri','file://'+os.path.abspath('1MG.ogg'))
threading.Timer(1.0, pl.set_state(gst.STATE_PLAYING)).start()
mainloop.run()
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Soll mir das sagen, dass das das ist, was du probiert hast, aber nicht geklappt hat? Ein bisschen weniger Ratespiel waere nett.

Und wenn es nicht klappt, dann mag das daran liegen, dass du threading benutzt. Das vertraegt sich nicht so gut mit GUIs bzw. dem glib-Mainloop. Das hier ist das was ich meinte:

https://developer.gnome.org/glib/stable ... imeout-add

Wie man das in Python ausdrueckt - kA. Ich mag gtk genau wegen diesem C-API nicht so gerne.

Und ein Nachtrag: dein Code ist obendrein falsch, weil du statt einem callable in den Timer zu geben direkt die Methode aufrufst, und deren Rueckgabewert dann als callback benutzt wird. Wahrscheinlich None, womit nix passiert. Wenn muesste sowas wie

threading.Timer(1.0, lambda: pl.set_state(gst.STATE_PLAYING)).start()

da stehen, aber wie gesagt: dass das klappt glaube ich eh nicht.
Antworten