2011-08-10 15 views
5

मैं एक परियोजना पर pygst का उपयोग कर रहा हूं और यह ठीक काम कर रहा है। मैं इसे नए आत्मनिरीक्षण प्रणाली (जीआई) में माइग्रेट करने की कोशिश कर रहा हूं, लेकिन मुझे एक अलग व्यवहार मिल रहा है।जीस्ट्रीमर बस भेजता है कोई संदेश नहीं

वर्ष pygst में मैं कुछ इस तरह है:

... # other imports 
import pygst 
pygst.require('0.10') 
import gst 
... # other imports 

gobjects.threads_init() 

... 

def my_handler(bus, message): 
    # handle the message 

... 

player = gst.element_factory_make('playbin2', 'my_player') 
bus = player.get_bus() 
bus.connect('message', my_handler) 
bus.add_signal_watch() 
... 
player.set_state(gst.STATE_PLAYING) 
# start the main Glib loop 

संदेश पैरामीटर एक विशेषता .type जो चयनात्मक प्रसंस्करण के लिए इस्तेमाल किया जा सकता (मैं केवल के अंत में दिलचस्पी रखता हूँ है धारा (ईओएस) और त्रुटि)। नई प्रणाली का उपयोग करते हुए मेरे पास है:

... # other imports 
from gi.repository import Gst 
import glib 
import gobject 
.... # other imports 

gobject.threads_init() 

loop = glib.MainLoop(None, False) 

def bus_handler(bus, message): 
    print message 
    # handle the message 
... 

Gst.init_check(None) 
player = Gst.ElementFactory.make('playbin2', 'my_player') 
player.set_property('uri', 'file:///home/kenji/button.ogg') 
bus = player.get_bus() 
bus.connect('message', bus_handler) 
bus.add_signal_watch() 
player.set_state(Gst.State.PLAYING) 
# start the main loop 

हालांकि, हैंडलर हमेशा कोई नहीं के रूप में पैरामीटर संदेश प्राप्त करता है। मैंने इन्हें फ़िल्टर करने का प्रयास किया है, लेकिन मुझे अभी भी कुछ भी नहीं मिला है (यानी सभी संदेश कोई नहीं)।

मैंने बहुत सारे जीस्ट्रीमर दस्तावेज़ (विशेष रूप से GstBus, add_signal_watch() और playbin2 पर पढ़ा है) लेकिन मुझे इस व्यवहार से संबंधित कुछ भी नहीं मिला। मैंने GST gir फ़ाइल की जांच की है और मैंने देखा है कि add_watch() को आत्मनिरीक्षण नहीं किया जा सकता है, इसलिए यह एक मृत अंत है। इस उपरोक्त उदाहरण में ग्लिब मुख्य लूप केवल पूर्ण जीटीके उदाहरण के बिना चीजों को कम करने के लिए है, लेकिन वास्तविक चीज़ Gtk.main() (बिल्कुल वही व्यवहार दे रही है) का उपयोग करती है।

मैं आर्क लिनक्स 64 पर जीस्ट्रीमर 0.10.35.0 (जैसा कि Gst.version() द्वारा सूचित किया गया है) का उपयोग कर रहा हूं, लेकिन मैंने उबंटू 11.04 32-बिट पर जीस्ट्रीमर 0.10.32.0 पर एक ही व्यवहार का परीक्षण किया है।

क्या बस.कनेक्ट() के लिए कोई विकल्प है? क्या मैं इसे गलत तरीके से उपयोग कर रहा हूं? मैंने इस बग को शिकार करने में काफी कुछ घंटे बिताए हैं, मैं वास्तव में इस पर किसी अंतर्दृष्टि की सराहना करता हूं। धन्यवाद! =)

+0

मुझे यह बग मिला: https://bugzilla.gnome.org/show_bug.cgi?id=631901 असल में, यह अभी तक लागू नहीं हुआ है। –

+0

मैं पुष्टि कर सकता हूं कि यह gstreamer 1.0 में तय है। –

उत्तर

1

मैं add_signal_watch_full() का उपयोग कर समाप्त हुआ, जो दुर्भाग्य से अधिक वर्बोज़ है। हालांकि यह ठीक काम करता है, और मैं अपने हैंडलर पर संदेश प्राप्त कर सकता हूं।

+0

दुर्भाग्य से, यह मेरे लिए काम नहीं किया। क्या आप शायद कुछ नमूना कोड प्रदान कर सकते हैं? –

+0

मुझे पूरा यकीन है कि यह उत्तर गलत है। निचे देखो। – skagedal

+0

add_signal_watch_full (1) मेरे लिए काम करता है। मुझे नहीं पता कि क्यों "1" तर्क की आवश्यकता है। – mnrl

0

यदि आप प्रोग्राम के साथ जीटीके का उपयोग करने की योजना नहीं बनाते हैं, तो आपको बस से संदेश प्राप्त करने के लिए gobject.Mainloop() चलाने होंगे। यह किसी भी अन्य mainloop की तरह, पूरे कार्यक्रम फ्रीज होगा (अगर यह पिरोया नहीं है), तो मैं आमतौर पर की तरह कुछ कुछ डाल: एक प्रोग्राम है जो एक जीयूआई की जरूरत नहीं है के अंत में

g_loop = threading.Thread(target=gobject.MainLoop().run) 
g_loop.daemon = True 
g_loop.start() 

, लेकिन Gstreamer की आवश्यकता है।

+0

यह सवाल का जवाब नहीं देता है। नमूना कोड की आखिरी पंक्ति से, टिप्पणी इंगित करती है कि केंजी को पता है कि मेनलोप की आवश्यकता है। और आपका समाधान इस मुद्दे को ठीक नहीं करता है। –

1

मुझे पूरा यकीन है कि स्वीकृत उत्तर गलत है। add_signal_watch_full और add_signal_watch के बीच एकमात्र अंतर यह है कि पूर्व में आप ईवेंट स्रोत की प्राथमिकता सेट कर सकते हैं, जबकि उत्तरार्द्ध केवल G_PRIORITY_DEFAULT के साथ पूर्व को कॉल करता है। आप इसे सी source code, लाइन संख्या 940 में सत्यापित कर सकते हैं। प्राथमिकता स्तर केवल निकाले गए कार्यक्रमों के क्रम को प्रभावित करता है, इस पर प्रभाव नहीं डालना चाहिए कि सिग्नल संदेश की सामग्री को निश्चित रूप से नहीं किया गया है और निश्चित रूप से नहीं है, जो यहां समस्या है। मैंने इसे प्राथमिकता के लिए विभिन्न मूल्यों के साथ भी परीक्षण किया है, अगर यह काम करता है तो मैं अपनी टोपी खाऊंगा। :-)

असली जवाब यह है कि यह काम नहीं करता है। PyGObject और GStreamer 0.10 अच्छी तरह से काम नहीं करते हैं। देखें:

बाद कहते हैं: "ध्यान दें कि यद्यपि आप तरह-की PyGI साथ उपयोग GStreamer0.10, कुंजी कार्यक्षमता मौलिक टूट गया है सकते हैं और अभ्यस्त कभी तय किया GStreamer0.10 में (क्योंकि यह होगा एपीआई टूटने की आवश्यकता है)। "

दिखाई देने वाले विकल्प है, तो, कर रहे हैं:

  • आवश्यकता GStreamer 1.0।
  • पुरानी पीईजीएसटी बाइंडिंग का उपयोग करें।
  • GStreamer 0.10 के साथ PyGObject का उपयोग करें, लेकिन ईओएस जैसे संदेशों की जांच करने की क्षमता के बिना। केवल बहुत ही बुनियादी चीजें काम करते हैं।
0

मैं इस सटीक एक ही समस्या है, लेकिन सी

में

डिबगिंग की लंबी दिनों के बाद हो रही थी, मैंने पाया कि इस वजह से मेरी निष्पादन अन्य साझा पुस्तकालयों द्वारा दोनों 0.10 और 1.0, परोक्ष रूप से को जोड़ने था हो रहा था मैं उपयोग।

0.10 से जुड़ी साझा लाइब्रेरी को हटाकर मेरी समस्या हल हो गई।

संबंधित मुद्दे