Gtk Gstreamer 1.0暂停信号

Gtk Gstreamer 1.0暂停信号,gtk,gobject,gstreamer,Gtk,Gobject,Gstreamer,我需要检测当前播放的音频/视频何时暂停。我找不到适用于1.0的任何内容。我的应用程序有点复杂,但这里有浓缩的代码 /* This function is called when the pipeline changes states. We use it to * keep track of the current state. */ static void state_changed_cb(GstBus *bus, GstMessage *msg, CustomData *data) {

我需要检测当前播放的音频/视频何时暂停。我找不到适用于1.0的任何内容。我的应用程序有点复杂,但这里有浓缩的代码

/* This function is called when the pipeline changes states. We use it to
* keep track of the current state. */
static void state_changed_cb(GstBus *bus, GstMessage *msg, CustomData *data)
{
    GstState old_state, new_state, pending_state;
    gst_message_parse_state_changed(msg, &old_state, &new_state, &pending_state);

    if(GST_MESSAGE_SRC(msg) == GST_OBJECT(data->playbin))
    {
        g_print("State set to %s\n", gst_element_state_get_name(new_state));            
    }
}


gst_init(&wxTheApp->argc, &argv);
m_playbin = gst_element_factory_make("playbin", "playbin");
if(!m_playbin)
{
    g_printerr("Not all elements could be created.\n");
    exit(1);
}

CustomData* data = new CustomData(xid, m_playbin);

GstBus *bus = gst_element_get_bus(m_playbin);
gst_bus_set_sync_handler(bus, (GstBusSyncHandler) create_window, data, NULL);//here I do video overly stuffs

g_signal_connect (G_OBJECT (bus), "message::state-changed", (GCallback)state_changed_cb, &data);
我做错了什么?我找不到在Gstreamer 1.0和0.x上连接此类事件的工作示例,因为它们似乎与1.0有点不同,所以这里的大量示例没有帮助

更新

我找到了一种获取信号的方法。我以500毫秒的时间跨度运行wxWidgets定时器,每次定时器触发我调用

GstMessage* msg = gst_bus_pop(m_bus);
if(msg!=NULL)
{
    g_print ("New Message -- %s\n", gst_message_type_get_name(msg->type));
}
现在我收到很多“状态更改”消息。我仍然想知道该消息是否用于暂停、停止、播放或媒体结束(我指的是区分这是哪条消息的方法),以便我可以通知UI


因此,虽然我现在获得信号,但获取特定信号的基本问题仍未解决。

您必须调用gst\u bus\u add\u signal\u watch()。否则,您只能使用其他方式获得关于该总线上GSTMessage的通知

当然,您需要在默认的主上下文上运行glibmain循环,这样才能工作。否则你需要做一些不同的事情

更新后的问题:


检查文档:gst_message_parse_state_changed()可用于解析消息中的旧状态、新状态和挂起状态。这仍然与0.10中的相同。从应用程序的角度来看,从概念上讲,在0.10和1.0之间没有什么变化


另外,您不应该等待超时,因为它会阻塞wxwidget主循环。最简单的解决方案是使用同步总线处理程序(您已经有了),并将所有消息从那里发送到wxwidget主循环上的某个回调。

我后来发现GLib mainloop问题(我使用wxWidgets mainloop),并使用计时器弹出Gst。我正在更新我的问题,以便澄清我没有想到的新问题检查文档:gst_message_parse_state_changed()可用于解析消息中的旧状态、新状态和挂起状态。这仍然与0.10中的相同。从应用程序的角度来看,从概念上讲,在0.10和1.0之间没有什么变化。另外,您不应该等待超时,因为它会阻塞wxwidget主循环。最简单的解决方案是使用一个同步总线处理器(您已经有了),并将所有消息从那里发送到wxwidget主循环上的某个回调。请在关于使用同步总线处理程序和解析状态的回答中添加您的评论