2016-07-05 2 views
0

J'ai du code écrit en python qui devrait lire un fichier vidéo. La question est la vidéo jouée n'est pas lisse par rapport aux joueurs de base. J'ai essayé d'implémenter l'indicateur FPS mais cela ne reflète pas la réalité. S'il vous plaît aider quelqu'un.pyglet - la vidéo ne fonctionne pas smootly

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

Vous rencontrez quelques problèmes lors de la vérification. La plupart des vidéos que j'ai en train de traîner finissent en noir et ne montrent rien du tout (les fichiers vidéo sont codés un peu ombragés et en essayant de les passer à travers ffmpeg me donne un tas d'erreurs). Avez-vous une vidéo que vous avez testée avec laquelle nous pouvons nous télécharger? – Torxed

Répondre

0

J'ai effectivement remarqué beaucoup d'études dans votre vidéo.
Je suppose que c'est en raison de l'utilisation de blit() au lieu de draw() + window.flip() qui serait beaucoup plus efficace à la mise à jour du tampon graphique.

Il est également possible de mettre la texture de player dans un objet pyglet.sprite.Sprite() et la texture en elle-même sera mise à jour à chaque image, mais à un taux plus élevé.

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() 

Ce doublé le taux de trame pour moi, mais je vais avoir d'autres pépins avec ma .mp4 vidéo ainsi que des problèmes de pilote sur ma machine Windows, mais ça fonctionne mieux que l'exemple de code que vous avez trouvé.

+1

Vous devez admettre que j'ai déjà résolu ce problème en utilisant des liaisons VLC. Cependant j'ai voulu apprécier votre effort et essayer votre code mais cela ne fonctionne pas pour moi. Quand je lance une vidéo, elle lit l'audio mais n'affiche pas de vidéo - seulement un écran noir. –

+0

@ TomášVavřinka J'ai vérifié sur ma boîte de Windows à la maison, je reçois la même chose que vous décrivez, mais quand je déplace la fenêtre (remuez-la autour) les graphiques fonctionne. Je vais devoir vérifier cela et voir pourquoi cela arrive. – Torxed

+0

Je ne suis pas sûr si cela a un effet mais va sur Ubuntu –