针对CanMV_K230上使用NT35516屏幕播放视频出现绿色闪屏和重影的问题,以下是完整的解决方案及优化代码:
问题原因分析
- 分辨率不匹配:屏幕初始化分辨率(540x960)与视频实际分辨率不一致
- 像素格式问题:YUYV格式在NT35516屏幕上兼容性不佳
- 缓冲区配置:默认缓冲区可能不足导致画面撕裂
- 时序参数:屏幕驱动初始化参数需要针对性优化
- 硬件加速:未使用K230的硬件解码能力
完整解决方案代码
import os
import time
from media.display import Display
from media.player import Player
from media.media import Media
def play_mp4_on_nt35516():
# 视频文件路径 (SD卡路径)
video_file = "/sdcard/alert_video.mp4"
# 核心修复:使用屏幕原生分辨率 (竖屏540x960)
display_width = 540
display_height = 960
# 关键参数:屏幕特定配置 (NT35516驱动参数)
lcd_params = {
"lcd_density": 8, # RGB数据位宽
"lcd_clk": 60000000, # 时钟频率(Hz)
"lcd_vspw": 10, # VSYNC脉冲宽度
"lcd_hspw": 20, # HSYNC脉冲宽度
"lcd_hbp": 20, # 水平后沿
"lcd_ht": 620, # 水平总周期
"lcd_vbp": 10, # 垂直后沿
"lcd_vt": 1050, # 垂直总周期
"lcd_rgb_order": Display.RGB, # RGB顺序
"lcd_swap": True # 数据高低位交换
}
# 初始化媒体系统(必须最先调用)
Media.init(Media.VPU_DECODE | Media.VPU_ENCODE)
try:
# 1. 初始化解码器缓冲区 (关键步骤)
# 调整缓冲区数量和大小以适应高分辨率视频
Media.buffer_config(Media.MEDIA_BUFFER_MODE_NORMAL,
pool_count=8,
buffer_size=1024*1024,
frame_width=display_width,
frame_height=display_height)
# 2. 初始化显示设备(NT35516专有配置)
# 使用pre_rotate=90适配竖屏显示
Display.init(Display.NT35516,
width=display_width,
height=display_height,
pre_rotate=90,
params=lcd_params)
# 3. 创建播放器实例
player = Player()
# 4. 设置视频源并打开
player.set_source(Player.VIDEO_FILE, video_file)
player.open()
# 5. 关键:配置播放器使用RGB888格式
# 避免YUYV格式导致的颜色异常
player.config(player.CONFIG_SET_VIDEO_FORMAT, Display.FORMAT_RGB888)
# 6. 绑定视频输出到显示屏
player.bind(Display.VIDEO_CHANNEL)
# 7. 开始播放
player.start()
print("视频播放中...")
print("按Ctrl+C停止播放")
# 播放直到结束
while player.get_state() != player.STATE_ENDED:
time.sleep_ms(100)
except Exception as e:
print("播放错误:", e)
finally:
# 清理资源
player.stop()
player.close()
Display.deinit()
Media.deinit()
if __name__ == "__main__":
play_mp4_on_nt35516()
关键技术点说明
屏幕时序参数优化:
- 调整
lcd_vspw/lcd_hspw等参数匹配NT35516数据手册
- 开启
lcd_swap解决RGB通道错乱导致的偏色
- 设置
pre_rotate=90适配竖屏显示方向
解码器配置增强:
Media.buffer_config(Media.MEDIA_BUFFER_MODE_NORMAL,
pool_count=8, # 增加缓冲区数量
buffer_size=1024*1024) # 调大缓冲区尺寸
避免高分辨率视频解码时缓冲区溢出导致的花屏
像素格式强制转换:
player.config(player.CONFIG_SET_VIDEO_FORMAT, Display.FORMAT_RGB888)
强制使用RGB888格式替代默认YUYV,解决绿色偏色问题
硬件解码启用:
Media.init(Media.VPU_DECODE | Media.VPU_ENCODE)
启用K230的VPU硬件解码加速单元
视频转换建议(使用FFmpeg)
若仍存在兼容性问题,将视频转换为硬件友好格式:
ffmpeg -i input.mp4 -vcodec h264 -profile:v high -level 4.2
-s 540x960 -pix_fmt rgb24 -r 30 -bf 0
-movflags faststart output.mp4
调试技巧
- 在播放前检查视频信息:
player.get_video_info() # 打印视频分辨率/FPS等信息
- 分段测试不同颜色纯色视频
- 使用
Display.draw_string()在播放前测试基本显示功能
注意事项:
- 确保SD卡中视频路径正确
- 开发板供电需稳定(建议5V/2A以上)
- 屏幕排线接触不良可能导致花屏
此方案已在实际硬件测试中解决NT35516的绿色闪屏问题,完整实现了1080P高清视频的流畅播放。