Gstreamer 1.0 暂停信号

Gstreamer 1.0 Pause signal

我需要检测当前播放 audio/video 何时暂停。我找不到 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 有点不同,所以那里的大量示例没有帮助

更新

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

GstMessage* msg = gst_bus_pop(m_bus);
if(msg!=NULL)
{
    g_print ("New Message -- %s\n", gst_message_type_get_name(msg->type));
}

现在我收到了很多 'state-change' 条消息。我仍然想知道该消息是用于暂停、停止、播放还是媒体结束(我的意思是区分这是哪条消息的方法),以便我可以通知 UI.

所以当我现在收到信号时,获取特定信号的基本问题仍未解决。

您必须调用 gst_bus_add_signal_watch()(就像在 0.10 中一样)以启用信号发射。如果没有它,您只能使用其他方式获得有关该总线上 GstMessages 的通知。

另外,为了确保这一点,您需要在默认主上下文中有一个 运行 GLib 主循环才能正常工作。否则你需要做一些不同的事情。

更新后的问题:

查看文档:gst_message_parse_state_changed() 可用于从消息中解析旧的、新的和未决状态。这也仍然与 0.10 中的相同。从应用的角度来看,从概念上讲,0.10 和 1.0

之间确实没有太大变化

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