2015-04-12 137 views
0

我需要检测当前播放的音频/视频何时暂停。 1.0找不到任何东西。我的应用程序有点复杂,但这里是精简代码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不同,所以广大exaples有没有帮助

UPDATE

我已经找到一种方式来获得信号。我跑的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)); 
} 

现在,我得到了很多“状态变化”的消息。不过,我想知道,如果该消息是用于暂停或停止或播放或媒体结束(我的意思是区分哪些消息是这样的),以便我可以通知用户界面。

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

回答

1

您必须调用gst_bus_add_signal_watch()(如0.10所示)才能启用信号发射。没有这个,你只能使用其他方式来获得关于该总线上GstMessages的通知。

另外可以肯定的是,您需要在默认主要上下文中运行GLib主循环以使其工作。否则,你需要做的事情有点不同。

有关更新后的问题:

检查文档:gst_message_parse_state_changed()可被用于从消息解析旧的,新和未决状态。这仍然与0.10相同。从应用的角度来看,在概念上0.10和1.0之间确实没有太大的改变

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

+0

我后来发现GLib主循环问题(我使用wxWidgets mainloop),我用计时器来弹出Gst。我正在更新我的问题,以便清除我没有想到的新问题 –

+1

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

+0

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