【问题标题】:pyglet - video does not run smootlypyglet - 视频运行不流畅
【发布时间】:2020-06-21 10:39:48
【问题描述】:

我有用 python 编写的代码,应该可以播放视频文件。问题是与基本播放器相比,播放的视频不流畅。我试过实现 FPS 指标,但它绝对不能反映现实。请帮助任何人。

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

【问题讨论】:

  • 在测试时遇到了一些小问题。我放置的大多数视频都是黑色的,根本不会显示任何内容(视频文件的编码有点阴暗,试图通过 ffmpeg 传递它们会给我带来一堆错误)。您是否碰巧有一个您已经测试过的视频,我们可以自己下载?

标签: python-2.7 video pyglet


【解决方案1】:

我实际上注意到你的视频中有很多 studder。
我猜这是因为使用了blit() 而不是draw()+window.flip(),这在更新图形缓冲区时会更有效。

也可以将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()

这使我的帧速率翻了一番,但我的 .mp4 视频还有一些其他故障,以及我的 Windows 机器上的驱动程序问题,但它比您找到的示例代码运行得更好。

【讨论】:

  • 需要承认我已经通过使用 VLC 绑定解决了这个问题。但是,我想感谢您的努力并尝试您的代码,但它对我不起作用。当我运行视频时,它会播放音频但不显示视频 - 只有黑屏。
  • @TomášVavřinka 我在家里检查了我的 Windows 盒子,我确实得到了你所描述的同样的东西,但是当我移动窗口(摆动它)时,图形工作。我必须检查一下,看看为什么会发生这种情况。
  • 我不确定它是否有效果,但在 Ubuntu 上会继续
【解决方案2】:

当我在我的 Mac 上使用 pyglet 1.2.4 播放视频时,它一点也不流畅。升级pyglet到1.5.6后,问题解决,和基本播放器一样流畅。代码sn-p:

import pyglet

source = pyglet.media.load(VIDEO_FILE_PATH)
fmt = source.video_format

player = pyglet.media.Player()
player.queue(source)
player.play()

window = pyglet.window.Window(width=fmt.width, height=fmt.height)

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

pyglet.app.run()

但是,pyglet 1.5.6 不能在我的 Windows 10 上运行,视频在这台机器上运行 1.2.4 版本会稍微不流畅。 所以我目前最好的选择是:Mac + pyglet 1.5.6

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2014-02-08
    • 2021-12-05
    • 2013-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多