RT-Thread论坛
直播中

母猪会上树

11年用户 908经验值
擅长:电源/新能源
私信 关注
[问答]

使用canmv_k230的NT35516播放视频,一直是绿色闪屏怎么解决?

第一版代码我用了播放器模块 API,显示是绿色闪屏和有一些原视频的重影

import os
import time
from media.player import *
from media.display import *
from media.media import *
def play_mp4_on_nt35516():
    video_file = "/sdcard/alert_video.mp4"
    # 正确设置NT35516竖屏分辨率参数(宽540,高960)
    display_width =540
    display_height =960
    Display.init(Display.NT35516, width=display_width, height=display_height, osd_num=1, to_ide=True)
    time.sleep(1.0)  # 确保显示初始化完成
    config = k_vb_config()
    config.max_pool_cnt = 4
    config.comm_pool[0].blk_size = 2 * 1024 * 1024
    config.comm_pool[0].blk_cnt = 15
    config.comm_pool[0].mode = VB_REMAP_MODE_NOCACHE
    ret = MediaManager._config(config)
    if not ret:
        raise RuntimeError("Media buffer config failed")
    start_play = False
    def player_event(event, data):
        nonlocal start_play
        if event == K_PLAYER_EVENT_EOF:
            print("Playback completed")
            start_play = False
    player = Player(Display.NT35516)
    player.load(video_file)
    player.set_event_callback(player_event)
    player.start()
    start_play = True
    # 移除错误的视频层绑定操作
    # 直接通过Player内部机制处理显示
    while start_play:
        time.sleep(0.1)
    player.stop()
    Display.deinit()
    MediaManager.deinit()
if __name__ == "__main__":
    play_mp4_on_nt35516()
第二版代码用了视频解码的方式

    from media.media import *
from mpp.payload_struct import *
import media.vdecoder as vdecoder
from media.display import *
import time
import os
STREAM_SIZE = 40960
def vdec_test(file_name, width=1280, height=720):
    print("vdec_test start")
    vdec_chn = VENC_CHN_ID_0
    vdec_width = ALIGN_UP(width, 16)
    vdec_height = height
    vdec = None
    vdec_payload_type = K_PT_H264
    # display_type = Display.VIRT
    display_type = Display.NT35516  # 使用 ST7701 LCD 屏幕作为输出,最大分辨率 800*480
    # display_type = Display.LT9611  # 使用 HDMI 作为输出
    # 判断文件类型
    suffix = file_name.split('.')[-1]
    if suffix == '264':
        vdec_payload_type = K_PT_H264
    elif suffix == '265':
        vdec_payload_type = K_PT_H265
    else:
        print("未知的文件扩展名")
        return
    # 实例化视频解码器
    vdec = vdecoder.Decoder(vdec_payload_type)
    # 初始化显示设备
    if display_type == Display.VIRT:
        Display.init(display_type, width=vdec_width, height=vdec_height, fps=30)
    else:
        Display.init(display_type, to_ide=True)
    # 初始化缓冲区
    MediaManager.init()
    # 创建视频解码器
    vdec.create()
    # 绑定显示
    bind_info = vdec.bind_info(width=vdec_width, height=vdec_height, chn=vdec.get_vdec_channel())
    Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO1)
    vdec.start()
    # 打开文件
    with open(file_name, "rb") as fi:
        while True:
            os.exitpoint()
            # 读取视频数据流
            data = fi.read(STREAM_SIZE)
            if not data:
                break
            # 解码数据流
            vdec.decode(data)
    # 停止视频解码器
    vdec.stop()
    # 销毁视频解码器
    vdec.destroy()
    time.sleep(1)
    # 关闭显示
    Display.deinit()
    # 释放缓冲区
    MediaManager.deinit()
    print("vdec_test stop")
if __name__ == "__main__":
    os.exitpoint(os.EXITPOINT_ENABLE)
    vdec_test("/sdcard/4.264", 960, 540)  # 解码 H.264/H.265 视频文件

回帖(1)

刘军

2025-9-3 18:03:15

要解决在CanMV K230平台上使用NT35516屏幕播放视频时出现的绿色闪屏和重影问题,请按照以下步骤检查和修改代码:


关键问题原因分析:



  1. 像素格式不匹配:最常见的原因是解码器输出的像素格式(如YUV)与屏幕要求的格式(RGB)不兼容。

  2. 分辨率/方向不匹配:NT35516是竖屏设计(540x960),而视频可能是横屏分辨率。

  3. 硬件加速配置错误:解码器与显示器的硬件通道对接不正确。

  4. 缓冲区未对齐:多媒体硬件通常要求帧缓冲区按特定字节对齐(如256字节)。


完整解决方案代码(修改后):


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()

关键修复点说明:




  1. 像素格式修正


    'pix_fmt': Player.PIXEL_FORMAT_RGB_888  # 强制解码输出RGB格式


    • 将原始代码中的YUV格式改为NT35516兼容的RGB888格式




  2. 硬件通道初始化


    media.bus_init(0, DISPLAY_CHANNEL)  # 专用显示通道


    • 解决解码器输出与屏幕的硬件对接问题




  3. 缓冲区对齐


    'buffer_alignment': 256  # DMA要求256字节对齐


    • 避免因内存不对齐导致的闪屏/花屏




  4. 方向控制


    rotate=Display.ROTATE_0  # 或ROTATE_90根据物理安装调整


    • 确保视频输出方向与屏幕物理安装方向一致




补充调试建议:




  1. 视频预处理



    • 使用FFmpeg转换视频格式:
      ffmpeg -i input.mp4 -vf "scale=540:960,format=rgb24" -c:v mpeg4 alert_video.mp4




  2. 诊断屏幕参数


    # 添加诊断信息
    print(f"Screen caps: {Display.caps()}")
    print(f"Player supported formats: {Player.supported_formats()}")



  3. 如果仍有花屏


    # 尝试在media_init前添加(重置硬件)
    media.media_deinit()
    media.media_init()



  4. 检查硬件连接



    • 确认FPC排线完全插入

    • 检查开发板供电是否稳定(建议5V/2A以上电源)





注意:CanMV K230的媒体子系统对视频编码有严格要求,建议使用H.264 Baseline Profile或MPEG4编码的视频,避免使用HEVC等高级格式。



通过上述修改,应能解决绿色闪屏和重影问题。如果仍有异常,建议通过示波器检查屏幕时序信号或联系硬件厂商获取NT35516的精确初始化时序参数。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分