概念先知道
- 音频播放器(Player):SDK 基于多媒体服务框架(MSP)实现的播放器,支持本地文件、HTTP 在线音频、蓝牙 A2DP 等音源。
- ROMFS:烧录在 Flash 里的只读文件系统,例程把示例音乐打包进 ROMFS(挂载地址
0x778000),用file:///romfs/...访问。 - URL 播放:
smta play <url>中的 url 支持file://(本地文件)与http(s)://(网络流),播放器自动按格式解码(MP3 等)。 - 音量接口:
smta vol + / - / ?调整音量,实际调用smtaudio_vol_up/down/get。
例程功能简介
本页对应博流官方 SDK 的 player 例程(examples/audio/player),演示 Ai-M6x 的音频播放能力:
- 初始化 shell、Wi-Fi、MTD/EasyFlash、ROMFS 与播放器(
app_player_init); - 通过 shell 命令
smta play播放本地 ROMFS 音频或 HTTP 在线音频; - 支持停止/暂停/恢复(
smta stop|pause|resume)与音量调节(smta vol); - 例程还包含蓝牙音频(
player_bt/player_bt_only)与 WiFi 音频(player_wifi)变体。 - 同族例程(
examples/audio/):player_mp3(简化 MP3 播放)、player_bt(蓝牙音频)、player_wifi(网络音频)、player_es8388(外挂 ES8388 编解码器)、codec(编解码器直测)。
注意
播放器例程在 BL616/BL618 上验证。硬件上需要喇叭/耳机与功放(PA)电路,播放前确认音频输出引脚与板子一致;Wi-Fi 与蓝牙同时使用在当前版本可能存在问题,README 建议避免同时播放。
操作步骤
本页需要带喇叭/耳机接口的开发板。在终端进入 SDK 的音频播放器例程目录(前提:已按快速开始(Linux)或Windows搭建好环境):
cd examples/audio/player执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:
make CHIP=bl616 BOARD=bl616dk用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):
make flash CHIP=bl616 COMX=/dev/ttyUSB0打开串口助手(波特率 2000000)。例程自带一段 ROMFS 音频,在 bouffalolab /> 提示符输入:
smta play file:///romfs/music.mp3先连接 Wi-Fi,再播放 HTTP 音频链接(支持 HTTPS):
wifi_sta_connect <SSID> <密码>
smta play http://iot-du-home-test.bj.bcebos.com/test/bp_32k_mono_32kbps_03m53s.mp3停止/暂停/恢复:smta stop、smta pause、smta resume;音量调节:smta vol +、smta vol -、smta vol ?(查询)。
代码执行流程
例程从启动到播放音频的完整流程如下:
例程调用的 API 介绍
smta(play url / stop / pause / resume / vol ...)
播放器 shell 命令:smta play <url> 播放,smta stop|pause|resume 控制状态,smta vol +|-|?|[0-100] 调节音量。命令在 app/player/cli_player.c 中实现并注册。
参数:按子命令而定
返回值:无
smtaudio_start(media, url, seek_time, ...)
启动指定音源(MEDIA_SYSTEM 系统音 / MEDIA_MUSIC 音乐)播放 url。
参数:
media:媒体类型(MEDIA_SYSTEM/MEDIA_MUSIC)url:播放地址(file://或http(s)://)seek_time:跳转时间(秒)
返回值:播放状态/错误码
smtaudio_vol_up / smtaudio_vol_down / smtaudio_vol_get(step / step / )
音量加 / 减 / 查询。smtaudio_vol_get() 返回当前音量(0~100)。
参数:
step:调整步长(如 10)
返回值:vol_get 返回当前音量值
romfs_mount(addr)
挂载 ROMFS 文件系统,例程挂载地址 0x778000,之后才能用 file:///romfs/... 访问打包的音频。
参数:
addr:ROMFS 镜像所在 Flash 地址
返回值:成功返回 0
完整代码
以下为播放器例程入口源码(main.c 与 app/app_main.c),与官方示例(examples/audio/player)一致,默认折叠,点击展开:
📜 点击展开 player/main.c 完整代码
/*
* Copyright (C) 2017-2022 Bouffalolab Group Holding Limited
* Change Logs:
* Date Author Notes
* 2019-03-25 MSP the first version
*/
#include "shell.h"
#include <FreeRTOS.h>
#include "task.h"
#include "board.h"
#define APP_MAIN_STACK_SIZE (4*1024)
#define APP_MAIN_TASK_PRIORITY (1)
static struct bflb_device_s *uart0;
extern void shell_init_with_task(struct bflb_device_s *shell);
extern void app_main_entry(void *arg);
int main(void)
{
TaskHandle_t xHandle;
board_init();
// configASSERT((configMAX_PRIORITIES > 4));
uart0 = bflb_device_get_by_name("uart0");
shell_init_with_task(uart0);
xTaskCreate(app_main_entry, (char *)"app_main", APP_MAIN_STACK_SIZE, NULL, APP_MAIN_TASK_PRIORITY, &xHandle);
vTaskStartScheduler();
while (1) {
}
}📜 点击展开 player/app/app_main.c 完整代码
/*
* Copyright (C) 2017-2022 Bouffalolab Group Holding Limited
* Change Logs:
* Date Author Notes
* 2019-03-25 MSP the first version
*/
#include <FreeRTOS.h>
#include "task.h"
#include <app_wifi.h>
#if defined(CONFIG_BLUETOOTH)
#include <app_bt.h>
#endif
#include <app_player.h>
#include "rfparam_adapter.h"
#include "bflb_mtd.h"
#include "easyflash.h"
#include "bflb_romfs.h"
#include <sys/time.h>
#include <reent.h>
extern int _gettimeofday_r(struct _reent *, struct timeval *, void *);
int gettimeofday(struct timeval *tv, void *tz)
{
return _gettimeofday_r(_REENT, tv, tz);
}
void app_main_entry(void *arg)
{
/* Set ble controller EM Size */
#if defined(CONFIG_BLUETOOTH)
extern int bl_sys_em_config(void);
bl_sys_em_config();
#endif
/* Init rf */
if (0 != rfparam_init(0, NULL, 0)) {
printf("PHY RF init failed!\r\n");
return;
}
/* For bt status save */
bflb_mtd_init();
easyflash_init();
/* romsfs init mount use media factory*/
romfs_mount(0x778000);
// filesystem_init();
/* Init wifi */
app_wifi_init();
/* Init player */
app_player_init();
/* Init bt */
#if CONFIG_BLUETOOTH
app_bt_init();
#endif
#if defined(CONFIG_CODEC_USE_I2S)
extern msp_i2s_port_init(void);
msp_i2s_port_init();
#endif
extern int app_play_fifo_music();
app_play_fifo_music();
vTaskDelete(NULL);
}FAQ
没有声音
确认开发板接了喇叭/耳机且 PA 使能引脚配置正确(multimedia_port.c 中的 g_pa_delay_2 与 CONFIG_AUDIO_PA_PIN 按板子修改);播放命令执行后看串口是否有解码/播放日志。
网络音频播不了
先确认 Wi-Fi 已连接并拿到 IP(wifi_sta_connect 后看 GOT_IP),再确认 URL 可访问且服务器支持 HTTPS(README 中示例链接为 HTTPS)。网络不稳时建议先测本地 ROMFS 音频。
音量命令无效
先执行过至少一次 smta play(cmd_player_func 会先调用 app_player_init());之后 smta vol + / - / ? 才会生效。
遇到问题?
如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

