2015-04-12 136 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主循環中的一些回調。 –