使用Pygame显示MoviePy视频预览时无法通过鼠标点击中断的问题
解决MoviePy预览时无法响应Pygame鼠标点击的问题
问题根源
你的代码里vid.preview()是阻塞式函数,调用后会持续占用线程播放视频,后面的pygame.display.update()和事件循环代码根本没有执行的机会,自然检测不到鼠标点击事件。
修复方案
放弃用vid.preview(),改为手动逐帧将视频渲染到Pygame窗口,这样就能在每帧播放间隙处理Pygame事件。修改后的代码示例:
def introscreen(): # 确保已初始化Pygame窗口,尺寸和视频分辨率匹配 screen = pygame.display.set_mode(vid.size) fps = vid.fps frame_delay = int(1000 / fps) # 每帧间隔毫秒数 # 逐帧遍历视频 for frame in vid.iter_frames(fps=fps, dtype='uint8'): # 将MoviePy帧转换为Pygame可识别的表面 pygame_frame = pygame.surfarray.make_surface(frame.swapaxes(0, 1)) screen.blit(pygame_frame, (0, 0)) pygame.display.update() # 处理Pygame事件 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() exit() if event.type == pygame.MOUSEBUTTONDOWN: vid.close() maingame() return # 退出当前函数,进入主游戏 # 控制播放速度,保证帧率一致 pygame.time.delay(frame_delay)
注意事项
- 初始化Pygame窗口时,要设置和视频相同的分辨率(
vid.size),避免画面拉伸。 - 如果视频有音频需求,可以用Pygame的音频模块单独加载并播放视频音频,MoviePy的
iter_frames()不会处理音频。
内容的提问来源于stack exchange,提问作者shadow techie
相关产品推荐
相关产品推荐

