【发布时间】:2017-03-20 12:10:05
【问题描述】:
我有一个 Qt 应用程序,它在单独的线程中执行与 GStreamer 相关的工作。虽然我认为我遵循了设置信号回调的规则,但我指定的回调函数似乎没有被调用。
回调函数如下,它试图做的只是将一些内容记录到控制台以进行调试:
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 信号,我也没有得到任何输出。
我不确定这是否会成为问题,但为了以防万一,上面的代码稍微简化了一些。实际上有 两个 流正在播放,所以上面代码的第一个 sn-p 发生了两次,每个 playbin 一次(每个 playbin 的序列都是准确的,我只是看到没有必要使代码复杂化)。
然后主循环被创建并运行。
如上所述,我没有看到回调函数的输出,那么我的消息去哪里了?
附录:对于它的价值,我还尝试了gst_bus_add_watch 方法来捕获所有消息而不是特定信号,但仍然没有任何显示。我还应该提到,作为一个 Qt 应用程序,我在代码中没有 gtk_init - 我只是从主线程调用 gst_init。
【问题讨论】:
-
我假设您正在检查实际代码中所有调用函数(尤其是 g_signal_connect)的返回值?
-
标准输出可能由于某种原因被重定向。您是否尝试过在
Cb()函数中放置断点? -
我遇到了同样的问题。我认为问题来自在线程中运行的 Gstreamer。这帮助我解决了我的问题:gstreamer-devel.966125.n4.nabble.com/…
标签: c++ qt callback gstreamer-1.0