0

ビデオを再生しようとしていて、ビデオを新しいものに切り替えるボタンがあり、最初以外のある時点で新しいビデオを開始します。UI や動画関連のコードはあまり書いていません。

私は次のような作品を持っています(非常にトリミングされています):

class Main(gobject.GObject):
  def __init__(self):
    self.player = gst.element_factory_make('playbin', 'VideoPlayer')
    #.. pygtk UI/Button code

  def next_video(self):
    self.player.set_state(gst.STATE_NULL)
    self.player.set_property('uri', 'next_video_path')
    self.player.set_state(gst.STATE_PAUSED)
    end = time.time() + 1
    while time.time() < end:
      pass
    self.player.seek_simple(gst.FORMAT_TIME, gst.SEEK_FLAG_FLUSH, 100000000000)
    self.player.set_state(gst.STATE_PLAYING)

if __name__ == "__main__":
  Main(sys.argv)
  gtk.main()

いくつかのポイント:

  • 定期的に何かを発生させる必要があるため、gobject.timeout_add を使用できるようにしたかったので、GObject を使用しています。別の方法がある場合、私はそれと結婚していません。
  • その 1 秒待たないと機能しません。time.sleep() を使用すると、セグ フォールトが発生します。
  • ビデオの冒頭のブリップが表示されることもあれば、最初から始まることもあります。
  • バックグラウンドプレイビンがあり、それらを「ホットスワップ」することが提案されています。これで問題ありません。どうすればよいかわかりません。

明らかに、これを行うには、よりクリーンで信頼性の高い方法が必要です。

TL;DR: ビデオの任意のポイントから始めて、pygtk ウィンドウでビデオからビデオに切り替えるにはどうすればよいですか?

4

1 に答える 1

1

Instead of waiting one second, use something like self.player.get_state(timeout=3*gst.SECOND) to wait for the switch to gst.STATE_PAUSED to complete.

The timeout is used because if an error occurs and GStreamer doesn't succeed at changing the pipeline state, a get_state without a timeout will just get stuck waiting forever.

于 2010-11-28T10:48:13.003 に答える