求兼容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播放器版本匹配,避免兼容性报错。
- 需将VLC的动态库文件(如
- 安装适配Python3.6的版本:
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的打包资源中,确保运行时能访问到。
- 缺点是帧序列会占用额外存储空间,适合短时长过场动画。
- 先安装FFmpeg,将
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
相关产品推荐
相关产品推荐

