gpt4 book ai didi

c++ - GStreamer 似乎没有调用我的回调

转载 作者:可可西里 更新时间:2023-11-01 16:40:12 25 4
gpt4 key购买 nike

我有一个 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::eosmessage::errormessage::element 信号,我也没有得到任何输出好吧。

我不确定这会不会是个问题,但为了以防万一,上面的代码略有简化。实际上有 两个 流正在播放,所以上面的第一个代码片段发生了两次,每个播放箱一次(每个播放箱的顺序都是准确的,我只是认为没有必要使代码不必要地复杂化)。

然后创建并运行主循环。

如前所述,我没有看到回调函数的输出,那么我的消息去哪儿了?

附录:就其值(value)而言,我还尝试了 gst_bus_add_watch 方法来捕获所有 消息而不是特定信号,但仍然没有任何显示。我还应该提到,作为一个 Qt 应用程序,我的代码中没有 gtk_init - 我只是从主线程调用 gst_init

最佳答案

我对 gstreamer 的了解有限,我很久以前就把它弄乱了。

我做了一个小测试,这似乎有效:

#include <stdio.h>
#include <gstreamer-1.0/gst/gst.h>

static gboolean Cb(GstBus *bus, GstMessage *msg, gpointer data)
{
printf("g_sig, bus = %x, msg = %s, data = %x\n",
bus,
gst_message_type_get_name(GST_MESSAGE_TYPE(msg)),
data);

return TRUE;
}

int main(int argc, char *argv[]) {
GstElement *pipeline;
GstBus *bus;
GstMessage *msg;

/* Initialize GStreamer */
gst_init (&argc, &argv);

/* Build the pipeline */
pipeline = gst_parse_launch ("playbin uri=https://www.freedesktop.org/software/gstreamer-sdk/data/media/sintel_trailer-480p.webm", NULL);

/* Wait until error or EOS */
bus = gst_element_get_bus (pipeline);

/* use the sync signal handler to link elements while the pipeline is still
* doing the state change */
gst_bus_set_sync_handler (bus, gst_bus_sync_signal_handler, pipeline, NULL);
g_object_connect (bus, "signal::sync-message::state-changed", G_CALLBACK (Cb), pipeline, NULL);

/* Start playing */
gst_element_set_state (pipeline, GST_STATE_PLAYING);

msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);

/* Free resources */
if (msg != NULL)
gst_message_unref (msg);

gst_object_unref (bus);
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);

return 0;
}

但是当 message::state-changed 时:

A message has been posted on the bus. This signal is emitted from a GSource added to the mainloop. this signal will only be emitted when there is a mainloop running.

signal::sync-message::state-changed 改为:

A message has been posted on the bus. This signal is emitted from the thread that posted the message so one has to be careful with locking.

因此同步消息也在主循环之外发出。

docs对于这两个信号。

关于c++ - GStreamer 似乎没有调用我的回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40460274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com