Gstreamer 1.0暂停信号

时间:2015-04-12 12:45:20

标签: 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)
{
    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计时器,时间跨度为500ms,每次计时器触发我都会调用

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

现在我得到了许多“状态改变”#39;消息。我仍然想知道该消息是用于暂停还是停止或播放或媒体结束(我的意思是区分哪个消息是这样的),以便我可以通知用户界面。

因此,当我现在获得信号时,获得特定信号的基本问题仍然没有解决。

1 个答案:

答案 0 :(得分:2)

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

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

有关更新的问题:

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

之间没有太多变化

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