9

別のスレッドで 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::eosmessage::errorおよびmessage::elementシグナルもキャッチしても、出力が得られません。

これが問題になるかどうかはわかりませんが、念のため、上記のコードは少し簡略化されています。実際には2 つのストリームが再生されているため、上記のコードの最初のスニペットはプレイビンごとに 1 回ずつ、2 回発生します (シーケンスは各プレイビンで正確です。コードを不必要に複雑にする必要はありません)。

次に、メイン ループが作成されて実行されます。

述べたように、コールバック関数からの出力が表示されないので、メッセージはどこに行くのでしょうか?

補遺: 価値のあるものとして、特定のシグナルではなくすべてのgst_bus_add_watchメッセージをキャプチャする方法も試しましたが、まだ何も表示されません。また、Qt アプリケーションであるため、コードには何もありません。メイン スレッドから呼び出すだけです。gtk_initgst_init

4

1 に答える 1