Jouer RTSP avec python-gstreamer

J'utilise gstreamer pour la lecture de flux RTSP de caméras IP (comme Axe.)
J'utilise une ligne de commande comme ceci:

gst-launch-0.10 rtspsrc location=rtsp://192.168.0.127/axis-media/media.amp latency=0 ! decodebin ! autovideosink

et il fonctionne bien.

J'ai envie de le contrôler avec une interface graphique en pygtk donc j'utilise la gstreamer bindings python.
J'ai écrit ce morceau de code:

[...]
self.player = gst.Pipeline("player")
source = gst.element_factory_make("rtspsrc", "source")
source.set_property("location", "rtsp://192.168.0.127/axis-media/media.amp")
decoder = gst.element_factory_make("decodebin", "decoder")
sink = gst.element_factory_make("autovideosink", "sink")

self.player.add(source, decoder, sink)
gst.element_link_many(source, decoder, sink)

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)
[...]

Mais il ne fonctionne pas et quittez avec ce message:

gst.element_link_many(source, decoder,sink)
gst.LinkError: failed to link source with decoder

J'ai aussi essayer d'améliorer mon CLI avec ce que je utilisez uniquement h264:

gst-launch-0.10 -v rtspsrc location=rtsp://192.168.0.127/axis-media/media.amp ! rtph264depay !  ffdec_h264 ! xvimagesink

Et de l'implémenter dans mon code python comme ça:

[...]
self.player = gst.Pipeline("player")
source = gst.element_factory_make("rtspsrc", "source")
depay = gst.element_factory_make("rtph264depay", "depay")
decoder = gst.element_factory_make("ffdec_h264", "decoder")
sink = gst.element_factory_make("xvimagesink", "output")

self.player.add(source, depay, decoder, sink)
gst.element_link_many(source, depay, decoder, sink)
[...]

Mais j'ai eu le même message d'erreur 🙁

gst.LinkError: failed to link source with depay

Il ya quelque chose de mal entre ma source (rtspsrc), car il travailler avec decodebin avec un filesrc (ne fonctionnent pas, bien sûr, avec rtph264depay)

Je ne comprends pas pourquoi cela ne fonctionne pas car il travail dans l'interface de ligne.
Les experts de gstreamer qui peut m'aider ?

Merci d'avance.

Ce qui concerne,

Essayez le gst_parse_launch appel d'api. Il vous permet d'utiliser la tps-syntaxe de lancement dans votre bientôt-à-être-bien-plus court code. En nommant les éléments, vous pouvez définir les paramètres comme nécessaire, sans avoir à faire de chaîne d'interpolation.
Salut, Merci pour votre réponse. J'ai déjà essayé gst_parse_launch, mais mon problème est que mon GstPipeline objet n'a plus de propriété comme emplacement. Je suppose que "nommer les éléments" (comme on dit) peut résoudre mon problème, mais je ne peux pas comprendre comment le faire 🙁

OriginalL'auteur tirlototo | 2010-11-16