你好!T5 + 67MB 音频本地播放,回退 3.12.16 不推荐,正确方案是 3.13.6 接 SD 卡。下面给完整方案。
一、为什么不建议回退 3.12.16 用片内 Flash
- T5 模组(BK7258)实际 Flash 16MB,但分区表固化在 bootloader:APP 分区 68MB(已被固件占满)、OTA / USER0 / USER1 / KV / UF / LICENSE 各几 KB ~ 几百 KB,没有连续 67MB 的用户可用空间放音频。
- 3.12.16 已不在维护期,3.13.x 之后 T5 默认关闭片内 FATFS 是因为可用区域太小(< 1MB),把音频塞片内会与 KV / OTA 分区冲突,量产风险高。
- 即便强行用 USER0 / USER1 / RCD(每个 64KB ~ 256KB),3 个 67MB 文件也放不下。
结论:T5 上 67MB 本地音频,必须走外接存储(SD/TF 卡 或 外挂 SPI Flash)。SDK 默认推荐 SD 卡。
二、3.13.6 推荐方案:SD 卡 + LFS 文件系统 + 本地播放接口
源码依据:apps/tuyaos_demo_wukong_ai/src/boards/T5AI_BOARD_DESKTOP/doc/README.md 已说明该板子的方案。
- 硬件:T5 接 TF/SD 卡槽,SDK 已经把 SDIO 驱动到 tkl_sdcard 抽象层。
- 编译宏开启(在 board 的 tuya_iot_config.h 或 make.yaml 里):
Code: Select all
TUYA_FILE_SYSTEM = 1
FILE_SYSTEM_LFS_SD = 1
- 卡先格式化为 exFAT,根目录约定为 /t5_fs。
- SDK 启动时自动挂载,挂载完成后用 tkl_fs_* 系列接口读写。
三、播放本地音频的现成接口(不要自己拼)
源码:apps/tuyaos_demo_wukong_ai/src/wukong/audio/wukong_audio_player.c:292
Code: Select all
OPERATE_RET wukong_audio_play_local(CHAR_T *url, CHAR_T *song_name, CHAR_T *artist, INT_T format, INT_T size)
{
AI_PLAYER_SRC_E src = (strstr(url, "http://") == url || strstr(url, "https://") == url) ?
AI_PLAYER_SRC_URL : AI_PLAYER_SRC_FILE;
tuya_ai_playlist_clear(__s_music_playlist);
tuya_ai_playlist_add(__s_music_playlist, src, url, format);
return rt;
}
关键:函数内部根据 url 前缀自动选择 SRC:
以 http:// 或 https:// 开头 → AI_PLAYER_SRC_URL(走 HTTP 流式,受 FRAMEBUF/HTTP_YIELD 影响,就是 9337 一开始遇到的卡顿路径)
否则 → AI_PLAYER_SRC_FILE,走 datasink_file(apps/tuyaos_demo_wukong_ai/src/miscs/audio_player/src/datasink/datasink_file.c),从文件系统按块读取,不走网络,没有 URL 那套缓冲卡顿问题
调用示例:
Code: Select all
#include "wukong_audio_player.h"
#include "tkl_fs.h"
void play_music_from_sd(void)
{
BOOL_T exist = FALSE;
/* 1. 确保 SD 卡上文件存在 */
tkl_fs_is_exist("/t5_fs/music/test.mp3", &exist);
if (!exist) {
TAL_PR_ERR("file not found, please copy mp3 to SD card /t5_fs/music/");
return;
}
/* 2. 直接调用 wukong_audio_play_local,路径不需要 file:// 前缀 */
wukong_audio_play_local("/t5_fs/music/test.mp3",
"guoxin_test",
"demo",
AI_AUDIO_CODEC_MP3, /* 真 MP3 用 MP3,真 WAV 用 WAV */
0);
}
参考完整 demo:apps/tuyaos_demo_wukong_ai/src/boards/T5AI_BOARD_DESKTOP/ui/desk_func_record.c:1169 已经在用 wukong_audio_play_local 播放本地录音文件,可以直接照搬。
四、SD 卡音频文件准备
- 把 SD 卡格式化为 exFAT
- 在卡上建目录 /t5_fs/music/,把 test.mp3 / test1.mp3 / test2.mp3 拷进去
- 上电后日志会打印 LFS 挂载成功,tkl_fs_is_exist 检查没问题就可以播
五、解码格式提醒(沿用 9337 之前的诊断)
之前帖子里出现的 guoxin_test1.mp3 实际是 32kHz WAV、不是 MP3。改成本地播放后请先用 hex 工具确认文件真实格式:
文件头是 ID3 / 0xFF Fx → 真 MP3 → format = AI_AUDIO_CODEC_MP3
文件头是 RIFF...WAVE → WAV → format = AI_AUDIO_CODEC_WAV
同时 WAV 的采样率/位深,要和 ai_player 配置匹配(默认 16kHz/16bit/mono)
六、3.12.16 用片内 Flash 的可行性结论
不可行,原因:
3.12.16 时代 T5 默认未开放 6MB+ 的连续用户分区,分区表里能给应用层用的只有 USER0 / USER1(< 256KB)。
即便强行修改 partition_table 抢占 OTA / APP 区域,会破坏 OTA 升级能力和系统鲁棒性,量产不允许。
3.12.16 已停维护,安全/Bug fix 不会回合到老分支。
如果你必须本地(不接 SD),唯一现实方案是:换更大模组 + 外挂 SPI NOR Flash(比如 16MB Flash 通过 SPI 接到 T5 空闲 GPIO,自己实现简单 file-like 缓存层),属于定制方案,需要硬件配合,不在标准 SDK 流程里。
七、推荐做法(最佳实践)
留在 3.13.6(最新稳定版),不回退 3.12.16
硬件加 TF 卡座,开启 TUYA_FILE_SYSTEM + FILE_SYSTEM_LFS_SD
67MB 三个文件放 /t5_fs/music/
用 wukong_audio_play_local() 文件路径模式播放,零网络/零 HTTP 缓冲问题
URL 模式只用于真正的在线流媒体(不是本地资源)
需要哪部分的完整 demo(make.yaml 宏配置 / 板级 SD 卡引脚 / 完整 main 调用例子),告诉我具体场景我再给。