私はプロジェクトでpygstを使用していますが、正常に動作しています。私はそれを新しいイントロスペクションシステム(GI)に移行しようとしていますが、私は別の動作をしています。GStreamerバスはメッセージを送信しません。
私はこのような何か持っている古い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(私が最後にのみ興味を持っているがストリーム(EOS)とエラー)。新しいシステムを使用して私が持っている:
... # 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
しかし、ハンドラは常になしとしてパラメータメッセージを受け取ります。これらを除外しようとしましたが、何も得られません(つまり、すべてのメッセージはなしです))。
GStreamerのドキュメント(特にGstBus、add_signal_watch()、playbin2)をよく読んだことがありますが、この動作に関連するものは何も見つかりませんでした。私はGST girファイルを確認しましたが、add_watch()はイントロスペクトされていないことが分かりました。この例のglibメインループはGTKの完全な例がなくても短くするためのものですが、実際にはGtk.main()を使用しています(まったく同じ動作をします)。
私は、Arch Linux 64でGStreamer 0.10.35.0(Gst.version()によって通知されました)を使用していますが、GStreamer 0.10.32.0と同じ動作をUbuntu 11.04 32ビットでテストしました。
bus.connect()の代替手段はありますか?私は間違った方法でそれを使用していますか?私はこのバグを見つけてかなりの時間を費やしてきましたが、これについての洞察を本当にありがとうと思います。ありがとう! =)
このバグを発見しました:https://bugzilla.gnome.org/show_bug.cgi?id=631901 基本的にはまだ実装されていません。 –
これはgstreamer 1.0で修正されていることが確認できます。 –