我需要检测当前播放的音频/视频何时暂停。 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));
}
现在,我得到了很多“状态变化”的消息。不过,我想知道,如果该消息是用于暂停或停止或播放或媒体结束(我的意思是区分哪些消息是这样的),以便我可以通知用户界面。
所以,虽然我现在得到信号,但获取特定信号的基本问题仍未解决。
我后来发现GLib主循环问题(我使用wxWidgets mainloop),我用计时器来弹出Gst。我正在更新我的问题,以便清除我没有想到的新问题 –
检查文档:gst_message_parse_state_changed()可用于解析消息中的旧的,新的和挂起的状态。这仍然与0.10相同。从应用角度来看,在概念上0.10和1.0之间确实没有什么变化。 –
此外,你不应该这样做超时等待,因为它会阻止你的wxwidget主循环。最简单的解决方案是使用同步总线处理程序(您已经拥有)并将所有消息从那里分派到wxwidget主循环中的一些回调。 –