2011-08-10 14 views
5

私はプロジェクトで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()の代替手段はありますか?私は間違った方法でそれを使用していますか?私はこのバグを見つけてかなりの時間を費やしてきましたが、これについての洞察を本当にありがとうと思います。ありがとう! =)

+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

あなたがプログラムでGTKを使用する予定がない場合は、バスからメッセージを取得するためにgobject.Mainloop()を実行する必要があります。 (それがスレッド化されていない場合)これは、他のメインループと同様に、プログラム全体を凍結するので、私は通常のようなものが何かを入れて:GUIを必要としないプログラムの終了時に

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

を、しかし、 Gstreamerが必要です。

+0

これは質問に答えません。サンプルコードの最後の行から、このコメントは、Kenjiがメインループが必要であることを認識していることを示しています。そして、あなたの解決策は問題を解決しません。 –

1

私は確かに受け入れられた答えが間違っています。 add_signal_watch_fulladd_signal_watchの唯一の違いは、前者ではイベントソースの優先度を設定でき、後者では前者をG_PRIORITY_DEFAULTと呼び出す点です。これは、C source codeの行番号940で確認できます。優先レベルは発生したイベントの順序に影響を与えますが、ここで問題となる信号メッセージの内容には影響しません。私は優先順位のために様々な値でそれをテストしました、私はこの方法がある場合、私の帽子を食べるでしょう。 :-)

本当の答えはうまくいきません。 PyGObjectとGStreamer 0.10はうまく機能しません。参照:

後者は言う:「それはなるので、(あなたはソートのPyGIと使用GStreamer0.10をすることができますが、キーの機能は基本的に壊れていると文句を言わない、これまでGStreamer0.10で修正されることに注意してくださいAPIの破損が必要)。

あなたのオプション、そして、以下のとおりです。

  • は、GStreamerの1.0が必要です。
  • 古いPyGSTバインディングを使用します。
  • PyGObjectをGStreamer 0.10で使用しますが、EOSなどのメッセージをチェックする機能はありません。非常に基本的なものだけが動作します。デバッグの長い日後、私はこれと同じ問題を有するがC.

    でた

0

私の実行ファイルが0.10と1.0の両方にリンクされたので、私は間接的に他の共有ライブラリで、これが起こっていたことがわかったIつかいます。

0.10にリンクされている共有ライブラリを削除すると、私の問題が解決しました。

関連する問題