【问题标题】:Playing Videos in PyGame 2 [duplicate]在 PyGame 2 中播放视频 [重复]
【发布时间】:2019-11-21 17:15:32
【问题描述】:

Pygame 1.x 有一个电影模块,可以让播放电影变得非常简单。互联网上充满了this SO question中提供的答案的变体

但是,我使用的是 Pygame 2,并且电影模块似乎已被删除。或者可能只是还没有实施?我在current docs 中找不到对它的引用,也没有任何在线示例。

我发现 this example 使用 pygame.Overlay 和 pymedia,但似乎 pymedia 不能在 Python 3 上运行。

我是 Python 生态系统的新手,不知道所有的角落、缝隙和惯用工具。我希望有人能指出我正确的方向。谢谢!

【问题讨论】:

    标签: python-3.x pygame


    【解决方案1】:

    编辑,2021 年 11 月 9 日: - 我在下面的回答将完成工作,但有一个更惯用的答案(即,更少的黑客攻击)here


    感谢pygame discordthis example 的人们使用带有子进程的FFMPEG,我有一个可行的解决方案。希望这对将来的人有所帮助。

    import pygame
    from lib.constants import SCREEN_WIDTH, SCREEN_HEIGHT
    from viewcontrollers.Base import BaseView
    import subprocess as sp
    
    FFMPEG_BIN = "ffmpeg"
    BYTES_PER_FRAME = SCREEN_WIDTH * SCREEN_HEIGHT * 3
    
    class AnimationFullScreenView(BaseView):
    
        def __init__(self):
            super(AnimationFullScreenView, self).__init__()
    
            command = [
                FFMPEG_BIN,
                '-loglevel', 'quiet',
                '-i', 'animations/__BasicBoot.mp4',
                '-f', 'image2pipe',
                '-pix_fmt', 'rgb24',
                '-vcodec', 'rawvideo', '-'
            ]
            self.proc = sp.Popen(command, stdout = sp.PIPE, bufsize=BYTES_PER_FRAME*2)
    
        # draw() will be run once per frame
        def draw(self):
            raw_image = self.proc.stdout.read(BYTES_PER_FRAME)
            image = pygame.image.frombuffer(raw_image, (SCREEN_WIDTH, SCREEN_HEIGHT), 'RGB')
            self.proc.stdout.flush()
            self.surf.blit(image, (0, 0))
    
    
    

    【讨论】:

    • 哇,这是一种非常有趣的方法。 PyGame 方面会不会很慢?我想知道ffmpeg 是否可以将视频解码为特定大小,然后它可以利用视频硬件来加快速度,并使 PyGame 不必重新调整大小等。
    • 还不知道。这是一个特殊的小项目,只需要在一个显示器上运行,而且只有 12fps。我正在做一些改进,我可以预先注册所有视频剪辑并将它们传送到临时文件中,然后使用搜索/读取播放它们。子流程文档警告不要在其标准输出上使用read 以避免死锁问题。到目前为止,它正在奏效。
    • 嗯,您可以预先计算后续帧之间的“差异块”,并将 (x, y, bitmap) 存储在新流中。我想这使它像一个动画 .GIF
    • 谢谢。我有点不在我的元素这里。我没有做过大量的非 Web GUI 编程,基本上也没有进行过游戏开发。如果您有任何资源可以指点我计算差异块,我会把它们放在我的后口袋里,以备将来需要优化时使用。
    猜你喜欢
    • 2023-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 2014-05-01
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    相关资源
    最近更新 更多