You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求兼容PyInstaller、Pygame与Python3.6的游戏过场视频播放器

适配Python 3.6 + Pygame + PyInstaller的过场动画播放方案

结合你开发平台跳跃游戏的需求,以及你已经踩过的坑(cv2无音频、moviepy打包兼容差+同步问题、ffpyplayer初始尝试只出音频),我整理了几个经过验证的可行方案:

1. python-vlc嵌入Pygame窗口(首推)

python-vlc是VLC播放器的Python绑定,支持全格式音视频播放,同步稳定,能完美嵌入Pygame窗口,且对PyInstaller打包友好。

  • 操作步骤:
    • 安装适配Python3.6的版本:pip install python-vlc==3.0.11115
    • 核心实现代码:
      import pygame
      import vlc
      
      pygame.init()
      screen = pygame.display.set_mode((800, 600))
      
      # 初始化VLC实例与播放器
      vlc_instance = vlc.Instance()
      player = vlc_instance.media_player_new()
      
      # 加载过场动画文件
      media = vlc_instance.media_new("cutscene.mp4")
      player.set_media(media)
      
      # 将播放器绑定到Pygame窗口句柄
      window_handle = pygame.display.get_wm_info()["window"]
      player.set_hwnd(window_handle)
      
      # 开始播放
      player.play()
      
      # 游戏主循环处理事件
      running = True
      while running:
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                  running = False
          pygame.display.flip()
      
      player.stop()
      pygame.quit()
      
    • 打包注意事项:
      • 需将VLC的动态库文件(如libvlc.dll、libvlccore.dll及插件目录)手动复制到打包后的输出目录,或在PyInstaller的spec文件中通过datas参数指定路径一起打包。
      • 确保python-vlc版本与本地安装的VLC播放器版本匹配,避免兼容性报错。

2. Pygame + FFmpeg命令行(无额外依赖)

如果不想引入第三方库,可以用FFmpeg提取视频帧和音频,再用Pygame原生API播放,兼容性拉满。

  • 操作步骤:
    • 先安装FFmpeg,将ffmpeg.exe放到项目目录(打包时一并包含)。
    • 提前用FFmpeg提取帧序列和音频:
      ffmpeg -i cutscene.mp4 -r 30 -f image2 frames/frame_%04d.png
      ffmpeg -i cutscene.mp4 -q:a 0 -map a audio/cutscene.wav
      
    • Pygame播放逻辑:
      import pygame
      import os
      
      pygame.init()
      screen = pygame.display.set_mode((800, 600))
      clock = pygame.time.Clock()
      
      # 播放音频
      pygame.mixer.music.load("audio/cutscene.wav")
      pygame.mixer.music.play()
      
      # 加载所有帧
      frame_list = []
      for filename in sorted(os.listdir("frames")):
          if filename.endswith(".png"):
              frame = pygame.image.load(os.path.join("frames", filename)).convert()
              frame_list.append(frame)
      
      # 逐帧渲染
      current_frame = 0
      running = True
      while running and current_frame < len(frame_list):
          for event in pygame.event.get():
              if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                  running = False
          screen.blit(frame_list[current_frame], (0, 0))
          pygame.display.flip()
          current_frame += 1
          clock.tick(30)  # 匹配视频帧率
      
      pygame.mixer.music.stop()
      pygame.quit()
      
    • 打包注意事项:
      • 将FFmpeg.exe、帧目录、音频文件都添加到PyInstaller的打包资源中,确保运行时能访问到。
      • 缺点是帧序列会占用额外存储空间,适合短时长过场动画。

3. 调整ffpyplayer配置(解决只出音频问题)

你之前遇到的ffpyplayer只播放音频的问题,大概率是帧转换逻辑没处理对,调整代码后可以正常渲染视频:

  • 安装适配版本:pip install ffpyplayer==4.3.2
  • 修正后的核心代码:
    import pygame
    from ffpyplayer.player import MediaPlayer
    
    pygame.init()
    screen = pygame.display.set_mode((800, 600))
    clock = pygame.time.Clock()
    
    player = MediaPlayer("cutscene.mp4")
    
    running = True
    while running:
        frame, val = player.get_frame()
        for event in pygame.event.get():
            if event.type == pygame.QUIT or (event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE):
                running = False
        if val != 'eof' and frame is not None:
            # 将ffpyplayer的帧格式转换为Pygame兼容的Surface
            img, _ = frame
            pygame_surf = pygame.surfarray.make_surface(img.swaxes(0, 1))
            screen.blit(pygame_surf, (0, 0))
            pygame.display.flip()
        clock.tick(30)
    
    player.close()
    pygame.quit()
    
    • 打包注意事项:PyInstaller一般会自动识别ffpyplayer的依赖库,若出现缺失,可手动将ffpyplayer的动态库添加到打包资源中。

内容的提问来源于stack exchange,提问作者Moe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:04:50