Skip to content

概念先知道

  • 音频播放器(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 建议避免同时播放。

操作步骤

1
进入例程目录

本页需要带喇叭/耳机接口的开发板。在终端进入 SDK 的音频播放器例程目录(前提:已按快速开始(Linux)Windows搭建好环境):

cd examples/audio/player
2
编译工程

执行编译命令。Ai-M62(BL616)与 Ai-M61(BL618)同属一个系列,统一填写引脚最少的 bl616 即可:

make CHIP=bl616 BOARD=bl616dk
3
烧录固件

用 USB 线连接开发板,按住 BOOT 键(Ai-M61-32S-Kit 为 IO2)不放、短按 EN/RST 进入下载模式,然后执行烧录(把串口号换成实际值):

make flash CHIP=bl616 COMX=/dev/ttyUSB0
4
播放本地音频

打开串口助手(波特率 2000000)。例程自带一段 ROMFS 音频,在 bouffalolab /> 提示符输入:

smta play file:///romfs/music.mp3
5
播放网络音频(可选)

先连接 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
6
控制播放

停止/暂停/恢复:smta stopsmta pausesmta 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 中实现并注册。

参数:按子命令而定

返回值:无

app_player_init()

初始化播放器(媒体服务框架 MSP 的播放组件),在播放前必须先调用。

参数:无

返回值:无

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.capp/app_main.c),与官方示例(examples/audio/player)一致,默认折叠,点击展开:

📜 点击展开 player/main.c 完整代码
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 完整代码
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_2CONFIG_AUDIO_PA_PIN 按板子修改);播放命令执行后看串口是否有解码/播放日志。

网络音频播不了

先确认 Wi-Fi 已连接并拿到 IP(wifi_sta_connect 后看 GOT_IP),再确认 URL 可访问且服务器支持 HTTPS(README 中示例链接为 HTTPS)。网络不稳时建议先测本地 ROMFS 音频。

音量命令无效

先执行过至少一次 smta playcmd_player_func 会先调用 app_player_init());之后 smta vol + / - / ? 才会生效。

遇到问题?

如有其他问题,请到统一的提问与讨论区:Ai-Thinker Discussions

Released under the MIT License. Build Time 2026-09-11 14:52:23