別のスレッドで GStreamer 関連のものを実行する Qt アプリケーションがあります。シグナル コールバックの設定ルールは守っていると思いますが、指定したコールバック関数が呼び出されていないようです。
コールバック関数は次のとおりです。デバッグのために何かをコンソールに記録するだけです。
static gboolean Cb(GstBus *bus, GstMessage *msg, gpointer data)
{
std::cout << "g_sig, bus = " << (void*)bus
<< ", msg = " << (void*)msg
<< ", data = " << (void*)data
<< std::endl;
return TRUE;
}
ストリーム (IP カメラからのライブ RTSP/H.264 フィード) を開始して監視するために使用しているシーケンスは次のとおりです。
GstElement *playBin = gst_parse_launch("<gstreamer pipeline>");
GstBus *bus = gst_pipeline_get_bus(GST_PIPELINE(playBin));
gst_bus_add_signal_watch(bus);
g_signal_connect(bus, "message::state-changed", (GCallback)Cb, NULL);
gst_element_set_state(playBin, GST_STATE_PLAYING);
GMainLoop *mainLoop = g_main_loop_new(NULL, FALSE);
g_main_loop_run(mainLoop);
現在、ストリームは実際に再生されている (ビデオが表示されている) ので、問題はないと思います。ただし、パイプラインの再生が開始されると、ステータス変更メッセージが投稿されるはずです。からの出力が表示されないため、これは発生していないようですCb()
。
message::eos
、message::error
およびmessage::element
シグナルもキャッチしても、出力が得られません。
これが問題になるかどうかはわかりませんが、念のため、上記のコードは少し簡略化されています。実際には2 つのストリームが再生されているため、上記のコードの最初のスニペットはプレイビンごとに 1 回ずつ、2 回発生します (シーケンスは各プレイビンで正確です。コードを不必要に複雑にする必要はありません)。
次に、メイン ループが作成されて実行されます。
述べたように、コールバック関数からの出力が表示されないので、メッセージはどこに行くのでしょうか?
補遺: 価値のあるものとして、特定のシグナルではなくすべてのgst_bus_add_watch
メッセージをキャプチャする方法も試しましたが、まだ何も表示されません。また、Qt アプリケーションであるため、コードには何もありません。メイン スレッドから呼び出すだけです。gtk_init
gst_init