Seite 1 von 1

pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 10:08
von BugsBenny96
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

Re: pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 10:33
von __deets__
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.

Re: pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 10:38
von BugsBenny96
__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 :)

Re: pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 10:43
von __deets__
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.

Re: pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 11:06
von BugsBenny96
__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()

Re: pygst spielt keine Musik

Verfasst: Sonntag 6. Mai 2018, 11:12
von __deets__
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.