我需要檢測當前播放的音頻/視頻何時暫停。 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主循環中的一些回調。 –