2017-09-11 2 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

関連する問題