写一个播放视频和触屏都存在的代码

Viewed 129

重现步骤

期待结果和实际结果

软硬件版本信息

错误日志

尝试解决过程

补充材料

正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
正在播放视频...
视频播放结束
destory_pool input  5
destory_pool output  6
尝试加载并播放 /sdcard/examples/2_2.mp4
    codec_id:  0
    track_id:  1
    width:  800
    height:  480
audio not support codecid: 0
video track h264
buffer pool :  3
播放失败: MediaManager, vb config failed(-1610317806)
尝试加载并播放 /sdcard/examples/2_2.mp4

这个是错误日志

2 Answers

您好,请更新到最新代码后再使用您的demo进行测试。之前的问题是由于MediaManager.deinit调用后未完全释放vb资源导致,目前此问题已修复。

这是代码from media.player import *
from machine import TOUCH
import time

start_play = False  # 标记是否正在播放视频

def player_event(event, data):
    global start_play
    if event == K_PLAYER_EVENT_EOF:  # 播放结束事件
        print("视频播放结束")
        start_play = False

def play_mp4_test(filename):
    global start_play
    try:
        print(f"尝试加载并播放 {filename}")
        
        #使用 IDE 作为输出显示,支持任意分辨率;适用于 BPI 开发板
        player = Player(Display.VIRT)
        # 使用 ST7701 LCD 屏幕作为输出显示,最大分辨率为 800x480
        player = Player(Display.ST7701) # 使用 HDMI 作为输出显示
        player.load(filename)
        player.set_event_callback(player_event)
        player.start()
        start_play = True
        print("视频开始播放")
        return player
    except Exception as e:
        print(f"播放失败: {e}")
        return None

# 实例化TOUCH设备0
tp = TOUCH(0)

def check_touch():
    """检查是否有触摸事件发生"""
    p = tp.read()

    if p:  # 如果发生了触摸事件
        print(p)  # 打印原始触摸数据
        
        # 打印每个点坐标信息,最大5点。
        for i in range(len(p)):
            print('x'+str(i)+'=', p[i].x, 'y'+str(i)+'=', p[i].y)

if __name__ == "__main__":
    video_player = None  # 初始化视频播放器为None
    filename = "/sdcard/examples/utils/1_1.mp4"

    while True:
        # 检查触摸事件
        check_touch()

        if not start_play:
            # 如果当前没有播放视频,则加载并开始播放
            if video_player is not None:
                try:
                    video_player.stop()  # 确保停止之前的播放实例
                except Exception as e:
                    print(f"停止播放失败: {e}")
                video_player = None
            video_player = play_mp4_test(filename)

        # 在这里可以打印一些状态信息或其他逻辑
        if start_play:
            print("正在播放视频...")
        
        time.sleep(0.1)  # 给CPU一个短暂休息的时间,避免占用过高解决视频不能重复播放的问题尽量不要大更改符合k230代码规范from media.player import *
from machine import TOUCH
import time

start_play = False  # 标记是否正在播放视频

def player_event(event, data):
    global start_play
    if event == K_PLAYER_EVENT_EOF:  # 播放结束事件
        print("视频播放结束")
        start_play = False

def play_mp4_test(filename):
    global start_play
    try:
        print(f"尝试加载并播放 {filename}")
        
        #使用 IDE 作为输出显示,支持任意分辨率;适用于 BPI 开发板
        player = Player(Display.VIRT)
        # 使用 ST7701 LCD 屏幕作为输出显示,最大分辨率为 800x480
        player = Player(Display.ST7701) # 使用 HDMI 作为输出显示
        player.load(filename)
        player.set_event_callback(player_event)
        player.start()
        start_play = True
        print("视频开始播放")
        return player
    except Exception as e:
        print(f"播放失败: {e}")
        return None

# 实例化TOUCH设备0
tp = TOUCH(0)

def check_touch():
    """检查是否有触摸事件发生"""
    p = tp.read()

    if p:  # 如果发生了触摸事件
        print(p)  # 打印原始触摸数据
        
        # 打印每个点坐标信息,最大5点。
        for i in range(len(p)):
            print('x'+str(i)+'=', p[i].x, 'y'+str(i)+'=', p[i].y)

if __name__ == "__main__":
    video_player = None  # 初始化视频播放器为None
    filename = "/sdcard/examples/utils/1_1.mp4"

    while True:
        # 检查触摸事件
        check_touch()

        if not start_play:
            # 如果当前没有播放视频,则加载并开始播放
            if video_player is not None:
                try:
                    video_player.stop()  # 确保停止之前的播放实例
                except Exception as e:
                    print(f"停止播放失败: {e}")
                video_player = None
            video_player = play_mp4_test(filename)

        # 在这里可以打印一些状态信息或其他逻辑
        if start_play:
            print("正在播放视频...")
        
        time.sleep(0.1)  # 给CPU一个短暂休息的时间,避免占用过高解决视频不能重复播放的问题尽量不要大更改符合k230代码规范