2017-09-11 61 views
0

我使用這個代碼: http://bazaar.launchpad.net/~jderose/+junk/gst-examples/view/head:/video-player-1.0 顯示視頻,再加上一些按鈕,暫停和使用代碼恢復:GStreamer如何獲取當前幀的數量?

def pauseb(self): 
    #code that checks if playing 
    self.player.set_state(Gst.State.PAUSED) 

def playb(self): 
    #code that checks if video is valid and is paused or stoped 
    self.player.set_state(Gst.State.PLAYING) 

當在暫停模式下,我可以用得到的時間位置:

success, position = self.videoplayer.player.query_position(Gst.Format.TIME) 

將時間轉換爲幀並不總是準確的。有沒有辦法找到哪個是當前顯示的幀數(不是通過轉換時間)?

回答

0

GStreamer管道不一定是同步的或線性的。他們可以使用queue元素在多個線程中運行,並使用tee元素分支到多個接收器。因此,當前幀可以在流水線的不同部分中處於不同的值。

您可能有一個相對簡單的管道,想知道當前幀相對於最終輸出。在這種情況下,我會建議只是水槽前加一個標識元素:

... ! identity name=frame_count ! ximagesink

遞增的每個調用回調函數,然後在需要的時候讀它的時間價值。我爲C道歉,但代碼的要點是:

GstElement* frame_count = gst_bin_get_by_name(GST_BIN(your_bin), "frame_count"); 
g_signal_connect(G_OBJECT(frame_count), "handoff", 
       G_CALLBACK(frame_count_callback), 
       some_object_to_accumulate_the_frame_count_in); 
+0

1.添加另一個回調會消耗時間。另外,如果我添加一個按鈕讓用戶去任何點都會破壞該算法。 –

+0

如果您想考慮能夠跳過,那麼您可能需要遍歷整個文件並創建時間戳 - >索引映射。我不確定哪些 - 如果有的話 - 視頻編碼格式將絕對幀索引元數據保存在裏面。 – mpr