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

求助:基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 14:40:29