2016-07-05 12 views
0

私はビデオファイルを再生する必要があるpythonで書かれたコードを持っています。問題は、再生されたビデオが基本的なプレイヤーに比べて滑らかではないということです。私はFPS指標を実装しようとしましたが、確かに現実を反映していません。誰でも助けてください。pyglet - ビデオがスムーズに動かない

import pyglet 

vidPath="video.avi" 

window = pyglet.window.Window(fullscreen = False, 
           resizable = True, 
           caption = 'Video') 

window.set_mouse_visible(False) 

player = pyglet.media.Player() 

MediaLoad = pyglet.media.load(vidPath) 

player.queue(MediaLoad) 

player.play() 

fps_display = pyglet.clock.ClockDisplay(
    format='%(fps).1f', 
    color=(0.5, 0.5, 0.5, 1) 
    ) 


@window.event 
def on_draw(): 
    window.clear() 
    player.get_texture().blit(0,0) 
    fps_display.draw() 


if __name__ == '__main__': 
    pyglet.app.run() 
+0

これをテストするには若干の問題があります。私が抱いているビデオのほとんどは黒くなり、何も表示されません(ビデオファイルはちょっとした暗いものにエンコードされ、ffmpegを通してそれらを渡そうとするとエラーが発生します)。私たちが自分でダウンロードできるビデオでテストしましたか? – Torxed

答えて

0

私は実際にあなたのビデオのスタッドを気づいた。
これは、draw() + window.flip()の代わりにblit()を使用しているためです。これは、グラフィカルバッファを更新する方がはるかに効率的です。

playerのテクスチャをpyglet.sprite.Sprite()オブジェクトに入れることもできます。テクスチャ自体はすべてのフレームで高いレートで更新されます。

import pyglet 
from pyglet.gl import * 
from threading import * 

# REQUIRES: AVBin 
#pyglet.options['audio'] = ('alsa', 'openal', 'silent') 
key = pyglet.window.key 

class main(pyglet.window.Window): 
    def __init__ (self): 
     super(main, self).__init__(800, 800, fullscreen = False) 
     self.x, self.y = 0, 0 

     self.player = pyglet.media.Player() 
     self.player.queue(pyglet.media.load("video.mp4")) 
     self.sprites = {'video' : None} 

     self.alive = 1 

    def on_draw(self): 
     self.render() 

    def on_close(self): 
     self.alive = 0 

    def on_mouse_motion(self, x, y, dx, dy): 
     pass 

    def on_mouse_release(self, x, y, button, modifiers): 
     pass 

    def on_mouse_press(self, x, y, button, modifiers): 
     pass 

    def on_mouse_drag(self, x, y, dx, dy, button, modifiers): 
     pass 

    def on_key_release(self, symbol, modifiers): 
     pass 

    def on_key_press(self, symbol, modifiers): 
     if symbol == 65307: # [ESC] 
      self.alive = 0 
     elif symbol == key.LCTRL: 
      self.player.play() 

    def render(self): 
     self.clear() 

     if self.player.playing: 
      if self.sprites['video'] is None: 
       texture = self.player.get_texture() 
       if texture: 
        self.sprites['video'] = pyglet.sprite.Sprite(texture) 
      else: 
       self.sprites['video'].draw() 

     self.flip() 

    def run(self): 
     while self.alive == 1: 
      self.render() 

      # -----------> This is key <---------- 
      # This is what replaces pyglet.app.run() 
      # but is required for the GUI to not freeze 
      # 
      event = self.dispatch_events() 

x = main() 
x.run() 

しかし、これは私が私のWindowsマシン上で他のいくつかの私の.mp4ビデオとグリッチなどのドライバの問題を抱えているが、それはあなたが見つけたコード例よりも優れて働いて、私のためにフレームレートを倍増しました。

+1

VLCバインディングを使用してこの問題を解決しました。しかし、私はあなたの努力を感謝し、あなたのコードを試してみたいですが、それは私のためには機能しません。ビデオを再生すると、オーディオは再生されますが、ビデオは表示されず、黒い画面しか表示されません。 –

+0

@TomášVavřinka私は自宅で私のWindowsボックスを調べましたが、私はあなたが説明しているものと同じものを取得しますが、私がウィンドウを動かすと(グラフィックスが動きます)私はこれをチェックして、なぜこれが起こるのか見る必要があります。 – Torxed

+0

効果があるものの、Ubuntuを使っているのかどうか分かりません –

関連する問題