T5 3.13.6 播放url音频卡顿

Wi-Fi 设备、蜂窝设备、WuKongAI、开发板、TuyaOS 移植等


愚者千虑必有一得
Posts: 938

你好!按你提供的信息(编译失败 + P14P19 1线模式 + t5_fs.zip 损坏),逐项处理如下,先不急着上 SD,建议先把方向校准。

【方向校准】

3 个音频共 67MB,这个体量其实不必上 SD 卡。9楼建议 SD 是因为 DESKTOP 板需要近百 MB 的 UI 资源;你只是想播 3 个 MP3,正确路径是:

A. 继续 URL 流式播放(已实现,调好 buffer 即可) —— 推荐,难度低
B. 嵌入到固件 const 数组里 —— 67MB 接近极限,不推荐
C. 外挂 SPI Flash + LittleFS(FILE_SYSTEM_LFS_SPI_FLASH) —— 可行
D. SD 卡 + LittleFS(你现在尝试的) —— 仅当还要存别的 UI/字体/录音

如果只是这 3 个文件能稳定播,建议先回 A 路线,把上次回复里改的 AI_PLAYER_FRAMEBUF_SIZE=16KB 和 AI_PLAYER_HTTP_YIELD_MS=100 试一下,URL 流式不会卡。

下面给你 D 路线的完整答复。

【一、SD 卡 1 线模式 + P14P19 配置】

T5(BK7258)的 SDIO 引脚在源码里是硬编码的,不是通过 tuya_app_config.h 暴露给应用层的开关,要改需要动 vendor 层。

依据:vendor/T5/t5_os/ap/middleware/driver/sdcard/sdio_driver.c 第 5667

Code: Select all

#if (CONFIG_PIN_SDIO_GROUP_0)
#define PIN_ID_SDIO_CLK (GPIO_14)
#define PIN_ID_SDIO_CMD (GPIO_15)
#define PIN_ID_SDIO_D0  (GPIO_16)
#define PIN_ID_SDIO_D1  (GPIO_17)
#define PIN_ID_SDIO_D2  (GPIO_18)
#define PIN_ID_SDIO_D3  (GPIO_19)
#else
#define PIN_ID_SDIO_CLK (GPIO_2)
... (默认是 P2/3/4/5/10/11)
#endif

#if CONFIG_SDCARD_BUSWIDTH_4LINE
    // 映射 D1/D2/D3
#endif

也就是说:

  1. 你要的 P14P19 = CONFIG_PIN_SDIO_GROUP_0(默认未开启,默认走 P2 组)
  2. 1 线模式由 CONFIG_SDCARD_BUSWIDTH_4LINE 控制——不开就是 1 线(仅用 D0=P16),4 线才用 D0D3

配置方法

在 vendor/T5/t5_os/ap/projects/<你的工程>/sdkconfig 或 sdkconfig.defaults 中加:

Code: Select all

CONFIG_SDCARD=y
CONFIG_PIN_SDIO_GROUP_0=y
# 不要写 CONFIG_SDCARD_BUSWIDTH_4LINE=y,不写就是 1 线

1 线模式下:CLK=P14、CMD=P15、D0=P16;P17/P18/P19 空闲可作他用。

【二、t5_fs.zip 损坏问题】

文件存在仓库内:

Code: Select all

apps/tuyaos_demo_wukong_ai/src/boards/T5AI_BOARD_DESKTOP/doc/t5_fs.zip

我这边校验了一下,仓库里的 t5_fs.zip 是完整的(11.4 MB,114 个文件,正常解压),里面包含 t5_fs/font、t5_fs/data_file、t5_fs/music 等子目录。

你那边解压失败大概率是:

  1. git clone 时网络中断导致文件截断 → 重 git pull 或单独覆盖该文件
  2. 杀软误处理大文件
  3. 用了 git lfs 但没拉真实内容(看 zip 起始 4 字节是不是 PK\x03\x04)

排查命令(Windows PowerShell):

Code: Select all

# 看本地文件大小,应该约 11 MB(11384238 字节)
ls apps/tuyaos_demo_wukong_ai/src/boards/T5AI_BOARD_DESKTOP/doc/t5_fs.zip
# 看头部,应该是 50 4B 03 04(PK..)
Format-Hex -Path apps/tuyaos_demo_wukong_ai/src/boards/T5AI_BOARD_DESKTOP/doc/t5_fs.zip -Count 8

如果还是损坏,可以单独从 gitee/github 仓库 raw 重新下载这一个文件,路径同上。

【三、tuya_app_config.h 编译失败排查】

附件里你贴了 tuya_app_config.h,但我没法直接看到完整内容。常见编译失败原因(按概率):

  1. TUYA_FILE_SYSTEM 已经定义但没选 medium
    默认配置是 // CONFIG_TUYA_FILE_SYSTEM is not set;如果你直接把宏改成 #define TUYA_FILE_SYSTEM 1 而不开 FILE_SYSTEM_LFS_SD 或 FILE_SYSTEM_LFS_SPI_FLASH,编译时 lv_conf.h、tuya_ai_display.c 等多处条件分支会报符号未定义。
    正确做法:用 make menuconfig APP_NAME=tuyaos_demo_wukong_ai 进入图形界面,开启 Enable file system 后选择 littlefs on SD card,不要手改 tuya_app_config.h。

  2. 没切到 DESKTOP 板
    SD 路径 /t5_fs/... 主要在 T5AI_BOARD_DESKTOP/ui/desk_func_*.c 中使用;检查 make.yaml 里 app_board 是否选了 T5AI_BOARD_DESKTOP。

  3. vendor 层 CONFIG_SDCARD 没开
    上面提到的 CONFIG_SDCARD=y、CONFIG_PIN_SDIO_GROUP_0=y 必须改 vendor 的 sdkconfig,不是 app 的 tuya_app_config.h。

依据:apps/tuyaos_demo_wukong_ai/build/APPconfig 第 225242

Code: Select all

config TUYA_FILE_SYSTEM
    bool "enable file system (littlefs/fatfs)"
    default n
    if (TUYA_FILE_SYSTEM)
        choice
            prompt "Select littlefs storage medium"
            default FILE_SYSTEM_LFS_SPI_FLASH
            config FILE_SYSTEM_LFS_SD
                bool "littlefs on SD card"
            config FILE_SYSTEM_LFS_SPI_FLASH
                bool "littlefs on SPI FLASH"
        endchoice
    endif

请把完整编译报错(前 30 行)贴上来,否则只能猜。

【推荐做法(如果只想播 3 个 67MB MP3)】

不建议沿用:搬 SD 卡 + 文件系统 + LFS 这一套
推荐改为:继续 URL 流式播放,把 ai_player 的 framebuf 调大

迁移步骤(5 分钟):

Code: Select all

// apps/tuyaos_demo_wukong_ai/src/miscs/audio_player/include/svc_ai_player.h
- #define AI_PLAYER_FRAMEBUF_SIZE      (4 * 1024)
- #define AI_PLAYER_HTTP_YIELD_MS      10
+ #define AI_PLAYER_FRAMEBUF_SIZE      (16 * 1024)
+ #define AI_PLAYER_HTTP_YIELD_MS      100

例外情况:必须离线播 / 必须本地化 / 同时还要做录音和图片缓存 → 那走 SD 卡是合理的。

【下一步建议】

请回贴:

  1. 完整 make 报错(前 30 行)
  2. make.yaml 的 app_board 字段
  3. menuconfig 里 TUYA_FILE_SYSTEM 的当前选择

定位精确后再给具体补丁。

demo
Posts: 11

Re: T5 3.13.6 播放url音频卡顿

谢谢大佬,目前使用T5AI_BOARD和P2组可以播放SD卡中的音频,但是音量设置较高时会出现严重的谐波失真。以下是音量28和70时测试的扫频信号。
音量28:
Image

音量70:
Image

愚者千虑必有一得
Posts: 938

Re: T5 3.13.6 播放url音频卡顿

你好,

你这次追问的核心其实已经不是“URL 播放为什么卡顿”,而是 3.13.x 下 67MB 音频资源应该放哪里、怎么挂载、怎么播

先说结论:
不建议回退 3.12.16 去做片内 flash 存 67MB 音频;更建议 3.13.6 + 外部存储(优先 SD,其次外接 flash / 文件系统)来做本地播放。

原因很简单:

  • 你这批音频总量已经到 67MB,对片内空间要求很高
  • 3.13.x 方案更偏向把大体积音频资源放到外部存储
  • 即使 3.12.16 能做片内存储,后续维护和兼容性也不如继续走 3.13.6

一、为什么不建议回退 3.12.16 用片内 flash

片内 flash 还要同时放:

  • 固件代码
  • 资源
  • KV / 配置
  • 升级/预留空间

如果 3 个音频总共已经 67MB,片内空间会非常紧张,后面还会遇到:

  • 升级空间不够
  • 文件系统空间不足
  • 擦写寿命和分区规划都很难看

所以这个方向即使勉强做出来,后面也不稳。

二、推荐方案:3.13.6 + 外部存储做本地播放

更建议你按下面思路做:

方案 A:外接 SD 卡(优先推荐)

优点:

  • 容量最宽松
  • 管理音频文件方便
  • 适合 67MB 甚至更大的音频资源

适合场景:

  • 本地音频较多
  • 后期还会继续增加语音包/提示音
  • 希望调试和替换资源方便

方案 B:外接 flash + 文件系统

也可以做,但实现复杂度一般高于 SD 卡,重点在:

  • flash 挂载
  • 文件系统初始化
  • 音频文件打包/烧录
  • 读取带宽是否满足播放需求

如果你的硬件已经没有 SD 接口、但预留了外扩 flash,这个方案可以做。

三、实现路径建议

你现在需要先把问题拆成 3 步:

第 1 步:先确认资源放置位置

不要先纠结播放接口,先确定:

  • 音频是放 SD 卡文件系统
  • 还是放 外接 flash 文件系统

只有这一步定下来,后面“挂载”和“播放”接口才好定。

第 2 步:完成挂载

无论是 SD 还是外部 flash,目标都是把音频文件以“文件路径”的形式访问到,比如:

  • /sdcard/test1.wav
  • /sdcard/test2.wav
  • /data/audio/test3.wav

第 3 步:走本地文件播放

你原来是 URL 播放:

  • src.url = "http://..."

改成本地播放后,核心思路是:

  • src.url 改成文件路径
  • src.format 填真实音频格式
  • 仍然通过统一的播放接口触发

也就是说,应用层差别主要不在“播”的动作,而在“资源来源”从网络 URL 换成了本地文件路径。

四、你代码侧要注意的点

你之前那段代码里,最容易继续踩坑的是这两个地方:

1)格式一定要和真实文件一致

不能再只凭经验写死:

  • WAV 就填 WAV
  • MP3 就填 MP3

建议先确认文件真实格式,再填 src.format

2)不要只看文件后缀

之前这个帖子里已经暴露过一次:
URL / 文件名后缀不一定等于真实编码格式。

如果后面改成本地文件播放,仍然建议你先确认:

  • 文件头
  • 实际编码格式
  • 采样率 / 声道 / 位宽是否满足当前链路

五、如果你坚持比较两条路线,建议这样选

选 3.13.6 + 外部存储,如果:

  • 音频资源 67MB
  • 还会扩容
  • 希望方案长期可维护

仅在以下情况下才考虑 3.12.16 + 片内 flash:

  • 音频资源其实很小
  • 不考虑后续扩容
  • 只是临时验证

但按你现在 67MB 的规模,不推荐继续往片内 flash 这条路上投入。

六、建议你下一步直接这样做

  1. 优先确认硬件是否支持 SD 卡
  2. 如果支持,直接走 SD 卡 + 文件系统 + 本地文件播放
  3. 如果不支持,再评估 外接 flash + 文件系统
  4. 音频资源尽量统一格式,先不要混用多种编码
  5. 应用层先把 3 个音频都改成“本地路径播放”做验证

如果你愿意,我建议你下一条直接补这 3 个信息:

  1. 你当前硬件上 有没有 SD 卡接口
  2. 如果没有,有没有预留外接 flash
  3. 这 3 个音频的真实格式到底是 WAV 还是 MP3

你把这 3 个信息补上后,我们可以继续把方案收敛成更具体的“挂载方式 + 播放代码修改点”。

Post Reply