我试图通过将每个帧保存为图像来捕获我的游戏视频,而不是使用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运行时会失败。如果没有注释该行,我只会得到一系列空白的黑色图像。
知道出了什么问题吗?
答案 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。