要解决在CanMV K230平台上使用NT35516屏幕播放视频时出现的绿色闪屏和重影问题,请按照以下步骤检查和修改代码:
import os
import time
from media.utils import *
from media.player import *
from media.display import *
from media.media import *
def play_mp4_on_nt35516():
# 配置视频路径和屏幕参数
video_file = "/sdcard/alert_video.mp4"
display_width = 540 # NT35516竖屏宽度
display_height = 960 # NT35516竖屏高度
# 关键修复1:强制初始化媒体系统硬件通道
ret = media.bus_init(0, DISPLAY_CHANNEL) # 使用显示专用通道
if ret:
print("bus_init failed")
return
# 关键修复2:配置解码器输出为RGB888格式(兼容屏幕)
config = {
'type': 'player',
'width': display_width,
'height': display_height,
'pix_fmt': Player.PIXEL_FORMAT_RGB_888, # 修正为RGB888格式
'sample_rate': 44100,
'channels': 2,
'buffer_alignment': 256 # 确保缓冲区对齐
}
# 初始化媒体系统
media.media_init(config)
# 关键修复3:初始化竖屏并设置旋转方向(如果需要)
Display.init(Display.NT35516,
width=display_width,
height=display_height,
rotate=Display.ROTATE_0, # 根据实际情况调整:ROTATE_0/ROTATE_90
osd_num=1,
to_ide=True)
# 创建播放器实例
player = Player(0) # 使用0号播放器实例
player.set_aspect_ratio(Player.ASPECT_RATIO_AUTO) # 自动适应比例
# 关键修复4:绑定硬件解码输出到显示层
display_layer = Display.get_layer(0)
player.set_display(display_layer)
# 加载并播放视频
player.load(video_file)
player.play()
print(f"Playing: {video_file}")
while player.state() != Player.STATE_ENDED:
time.sleep(0.1) # 降低CPU占用
# 可选:在此处添加进度检查/控制逻辑
player.stop()
player.unload()
media.media_deinit()
# 执行播放
if __name__ == "__main__":
play_mp4_on_nt35516()像素格式修正:
'pix_fmt': Player.PIXEL_FORMAT_RGB_888 # 强制解码输出RGB格式硬件通道初始化:
media.bus_init(0, DISPLAY_CHANNEL) # 专用显示通道缓冲区对齐:
'buffer_alignment': 256 # DMA要求256字节对齐方向控制:
rotate=Display.ROTATE_0 # 或ROTATE_90根据物理安装调整视频预处理:
ffmpeg -i input.mp4 -vf "scale=540:960,format=rgb24" -c:v mpeg4 alert_video.mp4诊断屏幕参数:
# 添加诊断信息
print(f"Screen caps: {Display.caps()}")
print(f"Player supported formats: {Player.supported_formats()}")如果仍有花屏:
# 尝试在media_init前添加(重置硬件)
media.media_deinit()
media.media_init()检查硬件连接:
注意:CanMV K230的媒体子系统对视频编码有严格要求,建议使用H.264 Baseline Profile或MPEG4编码的视频,避免使用HEVC等高级格式。
通过上述修改,应能解决绿色闪屏和重影问题。如果仍有异常,建议通过示波器检查屏幕时序信号或联系硬件厂商获取NT35516的精确初始化时序参数。
举报
更多回帖