AVI Player

AVI 视频播放器示例,支持本地 SD 卡播放和在线 HTTP Range 流媒体播放,带触摸屏 LVGL UI。

功能

  • 主菜单:本地播放、在线播放、USB MSC 文件管理

  • 本地播放:浏览 SD 卡中的 .avi 文件并播放

  • 在线播放:从 .ini 文件读取视频 URL 列表,自动连接 WiFi 后播放(仅支持 .avi

  • USB MSC:将 SD 卡挂载为 U 盘,方便电脑传文件

支持的媒体格式

  • 视频:MJPEG(解码输出 RGB565)

  • 音频:MP3(WAVE_FORMAT_MPEGLAYER3 = 0x0055

SD 卡目录结构

使用 FAT32 格式化的 SD 卡,按以下目录结构放置文件:

SD:/
├── Video/              # 本地视频文件目录
│   ├── demo.avi
│   └── sample.avi
├── URL/                # 在线视频 URL 配置目录
│   └── videos.ini      # 每行一个视频 URL
└── WiFi/               # WiFi 配置目录
    └── wifi.ini        # WiFi 连接配置

示例资源(sd_res/ 目录,可直接拷到 SD 卡)

本 sample 在仓库里自带了一份 SD 卡内容模板,位于 samples/media/avi_player/sd_res/, 目录结构跟运行时期望完全一致:

sd_res/
├── Video/              (空目录 —— 大尺寸 .avi 不进仓库,用户自己填,见下方)
├── URL/
│   └── online_videos.ini   多条 HTTPS .avi 测试 URL(可直接用)
└── WiFi/
    └── wifi.ini            WiFi 配置占位示例(⚠️ 用前必改成你自己的 SSID/密码)

使用方法:把 FAT32 格式化好的 SD 卡插到电脑(读卡器,或在板子上点 USB MSC 进入 U 盘模式),把 sd_res/ 目录里的内容(是内容,不是 sd_res 目录本身)复制 到 SD 卡根目录。最终 SD 卡上应该出现 Video/ / URL/ / WiFi/ 三个顶层目录。

示例资源只是仓库里的静态模板,不会被固件编译进去

⚠️ 两点使用前必做

1. 放视频到 sd_res/Video/

仓库里 sd_res/Video/ 目录是故意留空的(大尺寸 .avi 不进 git,避免仓库膨胀)。 从以下任选一种补进去:

  • 下载:用 sd_res/URL/online_videos.ini 里列出的 listenai-firmware-delivery OSS 公网 URL 抓一份下来:

    cd samples/media/avi_player/sd_res/Video
    curl -L -O \
      https://listenai-firmware-delivery.oss-cn-beijing.aliyuncs.com/test/video/RealityEditor.avi
    
  • 自己准备:用 tools/avi_encoder.py 把 mp4 转成 MJPEG + MP3 的 .avi(这是 sample 唯一支持的格式)。

    sd_res/Video/README.md 里也写了相同的指引。)

2. 改 sd_res/WiFi/wifi.ini 的 SSID/密码

示例模板里的 WIFI_SSID=test_ssid / WIFI_PWD=test_pwd占位符,在线播放 (Online Play)功能会读这个文件连 Wi-Fi。一定要改成你实际可用的凭据:

WIFI_SSID=我的WiFi名称
WIFI_PWD=我的WiFi密码

不改的话点 Online Play 会提示 WiFi failed!

本地播放

.avi 文件放入 SD 卡的 Video/ 目录即可。进入主菜单 -> Local Videos,列表会自动扫描该目录下的所有 .avi 文件,点击即可播放。

在线播放

需要准备两个配置文件:

1. WiFi 配置 - WiFi/wifi.ini

WIFI_SSID=你的WiFi名称
WIFI_PWD=你的WiFi密码

2. 视频 URL 列表 - URL/ 目录下任意 .ini 文件

每行一个视频 URL,支持 http://https:// 开头的链接。仅 .avi 后缀的 URL 可以播放,其他格式(如 .mp4)点击后会提示不支持。

示例 URL/videos.ini

# 以 # 或 ; 开头的行为注释,空行会被忽略
https://example.com/Videos/demo_640x172_20fps.avi
https://example.com/Videos/sample_640x172_25fps.avi

进入主菜单 -> Online Videos,首次点击视频时会自动读取 WiFi 配置并连接,连接成功后开始播放。

USB MSC 文件管理

进入主菜单 -> USB MSC,设备会将 SD 卡以 U 盘形式暴露给电脑,可以直接拖拽文件到对应目录。完成后点击 Back 返回主菜单。

编译

./build.sh -DBOARD=LS26840U_DEMO_IV1.1

关键配置(prj.conf)

配置项

说明

CONFIG_AVI_PLAYER_AUDIO_MP3=y

启用 MP3 音频解码

CONFIG_AVI_PLAYER_HTTP_RANGE=y

启用 HTTP Range 在线播放

CONFIG_AVI_PLAYER_FIXED_FPS=y

启用固定帧率渲染

CONFIG_AVI_PLAYER_FIXED_FPS_VALUE=20

固定渲染帧率

CONFIG_AVI_PLAYER_MAX_VIDEO_AHEAD_MS=500

视频最大领先音频时间

没有声音时的排查

部分板卡需要外部 PA(功放)GPIO 拉起后才有声音输出。在 prj.conf 中启用:

CONFIG_LISA_AUDIO_PLAY_PA_ENABLE=y

并在 menuconfig 的 Play (DAC) Configuration 中按实际硬件引脚调整 PA 配置。

代码结构

src/
├── main.c              # 入口:硬件初始化、SD 卡挂载、UI 任务
├── app_context.c/h     # 全局上下文、屏幕切换
├── ui_main_menu.c/h    # 主菜单 UI
├── ui_local_list.c/h   # 本地视频列表 UI
├── ui_online_list.c/h  # 在线视频列表 UI
├── ui_playback.c/h     # 播放界面 UI + LVGL 视频渲染
├── ui_usb_msc.c/h      # USB MSC 界面
├── playback_mgr.c/h    # 播放管理(启动/停止播放任务)
├── fs_utils.c/h        # 文件系统工具(扫描文件、读取 URL/WiFi 配置)
└── wifi_utils.c/h      # WiFi 连接管理

局域网 HTTP 视频源

可使用自带工具在局域网内快速搭建视频流服务:

cd tools/
python3 ./avi_stream_server.py --port 10240