首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pyglet - video运行不流畅

pyglet - video运行不流畅
EN

Stack Overflow用户
提问于 2016-07-05 18:52:41
回答 2查看 980关注 0票数 1

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

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

发布于 2016-07-12 04:47:53

实际上,我在你的视频中注意到了很多学生。

我猜这是因为使用了blit()而不是draw()+window.flip(),这在更新图形缓冲区方面会更高效。

也可以将player的纹理放到pyglet.sprite.Sprite()对象中,并且纹理本身将在每一帧上更新,但更新的速率更高。

代码语言:javascript
复制
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机器上也有驱动程序问题,但它比你找到的示例代码工作得更好。

票数 0
EN

Stack Overflow用户

发布于 2020-06-21 10:39:48

当我在mac上用pyglet 1.2.4播放视频时,一点也不流畅。在将pyglet升级到1.5.6之后,问题就解决了,就像基本玩家一样流畅了。代码片段:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38201587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档