求助:基于Pygame实现简易视频渲染器的黑屏问题排查
问题分析与修复方案
你的代码存在多个关键错误,导致窗口始终显示黑色,以下是问题点和修复步骤:
1. 矩形绘制参数完全错误
pygame.draw.rect的矩形参数格式为(x, y, width, height),你的代码里:
- 黑色矩形写成
[xpos, xpos+10, ypos, ypos+10],混淆了x/y位置与宽高的顺序 - 白色/灰色矩形写成
[xpos, ypos, xpos, ypos],宽高等于位置值,实际是0面积,根本画不出内容 - 颜色映射错误:你说明0代表黑色,但代码里0对应蓝色
(0,0,255),与需求不符
2. 帧索引更新逻辑混乱
你在像素循环内部频繁修改current_l,导致每帧的frame_data被反复覆盖;同时用seconds*30和timer*30计算帧索引的逻辑错误,应该在每帧开始前计算当前要显示的帧,而非绘制每个像素时更新。
3. 坐标更新错误
ypos = ypos + -10会让y坐标持续减小(往屏幕上方偏移),最终超出可视区域,应改为每次加10,对应36行的垂直排列。
4. 缺少Pygame事件循环
未处理窗口事件会导致程序假死,无法正常关闭,也无法响应系统交互。
5. 帧数据未处理换行符
readlines()读取的每行末尾包含换行符\n,会导致读取到无效字符,需要用strip()去除。
修复后的完整代码
import time import pygame # 初始化Pygame pygame.init() # 配置参数 SCALE = 10 # 每个像素放大10倍,对应48*10=480,36*10=360 FRAME_WIDTH = 48 FRAME_HEIGHT = 36 TOTAL_FRAMES = 6567 FPS = 30 # 播放帧率 # 读取帧数据,自动去除换行符与空白行 with open(r"C:\Users\User\Downloads\video Data.txt", "r") as file: frames = [line.strip() for line in file.readlines() if line.strip()] # 创建窗口 surface = pygame.display.set_mode((FRAME_WIDTH * SCALE, FRAME_HEIGHT * SCALE)) clock = pygame.time.Clock() # 用于控制帧率 def start_vid(): start_time = time.perf_counter() running = True while running: # 处理窗口事件,支持正常关闭 for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # 计算当前应播放的帧索引 elapsed_time = time.perf_counter() - start_time current_frame_idx = int(elapsed_time * FPS) # 超出总帧数后停止播放 if current_frame_idx >= TOTAL_FRAMES: running = False break # 获取当前帧数据(兜底处理防止索引越界) if current_frame_idx < len(frames): frame_data = frames[current_frame_idx] else: frame_data = frames[-1] # 清空画布避免残留 surface.fill((0, 0, 0)) # 逐像素绘制当前帧 for y in range(FRAME_HEIGHT): for x in range(FRAME_WIDTH): # 确保不读取到帧数据外的字符 pixel_index = x + y * FRAME_WIDTH if pixel_index < len(frame_data): pixel_char = frame_data[pixel_index] else: pixel_char = '0' # 无效数据默认黑色 # 计算放大后的绘制位置 draw_x = x * SCALE draw_y = y * SCALE # 匹配需求的颜色映射 if pixel_char == '0': color = (0, 0, 0) # 黑色 elif pixel_char == '1': color = (255, 255, 255) # 白色 elif pixel_char == '2': color = (130, 130, 130) # 灰色 else: color = (0, 0, 0) # 绘制放大后的矩形像素 pygame.draw.rect(surface, color, (draw_x, draw_y, SCALE, SCALE)) # 更新显示并控制帧率 pygame.display.update() clock.tick(FPS) # 退出Pygame pygame.quit() start_vid()
额外说明
- 用
with语句管理文件,确保文件自动关闭 - 添加帧率控制,避免播放速度过快
- 增加越界判断,防止帧数据长度不足导致报错
- 完全匹配你需求的颜色映射规则
- 加入事件循环,支持正常关闭窗口
内容的提问来源于stack exchange,提问作者ThePenPerson
相关产品推荐
相关产品推荐

