在Pygame中,如何在无头模式下保存屏幕图像?

时间:2013-01-23 05:02:33

标签: pygame

我试图通过将每个帧保存为图像来捕获我的游戏视频,而不是使用ffmpeg将它们拼接在一起。我按照这些脚本的例子进行了操作:

这是我的代码的基本逻辑:

os.environ['SDL_VIDEODRIVER'] = 'dummy'
pygame.init()
pygame.display.set_mode((1,1))
screen = pygame.Surface((400, 400)).convert()

# screen becomes attribute of game object: game.screen
game = MyGame(screen)

while game.running:
    game.update()   # <--- updates game.screen
    pygame.display.flip()
    pygame.image.save(game.screen, 'frame-%03d.png' % (game.frame_num))

create_video_using_ffmpeg() 

如果我将第一行设置视频驱动程序注释为“虚拟”,则图像会按预期结果显示。但它会打开一个(小)窗口,因此脚本在作为cronjob运行时会失败。如果没有注释该行,我只会得到一系列空白的黑色图像。

知道出了什么问题吗?

1 个答案:

答案 0 :(得分:2)

我能够通过在作为我的屏幕的基础图像表面上绘制一个矩形来解决这个问题:

os.environ['SDL_VIDEODRIVER'] = 'dummy'
pygame.init()
pygame.display.set_mode((1,1))

# surface alone wouldn't work so I needed to add a rectangle
screen = pygame.Surface((400, 400), pygame.SRCALPHA, 32)
pygame.draw.rect(screen, (0,0,0), (0, 0, 400, 400), 0)

# screen becomes attribute of game object: game.screen
game = MyGame(screen)

while game.running:
    game.update()   # <--- updates game.screen
    pygame.display.flip()
    pygame.image.save(game.screen, 'frame-%03d.png' % (game.frame_num))

create_video_using_ffmpeg() 

也许其他人可以解释为什么这会有所作为。 (我最初使用错误的表面参数吗?)

这可以成功地作为一个cronjob。