网络音频播放示例

功能说明

演示如何使用 app_player 播放网络音频资源(HTTP/HTTPS),包括播放控制(播放、暂停、恢复、停止)和事件回调处理。

硬件连接

  • PA27: PA(功放)控制引脚,用于控制音频功放的开关

  • WiFi: 需要设备支持 WiFi 并连接到互联网

前置准备

网络配置

本示例需要设备连接到互联网才能播放网络音频。请根据实际情况配置 WiFi 连接参数:

  1. 编辑 src/net/net_connect.c 或相关网络配置文件

  2. 配置 WiFi SSID 和密码

  3. 确保网络连接成功后再播放音频

示例内容

  1. 连接网络(WiFi)

  2. 配置 PA 控制 GPIO

  3. 初始化 app_player 模块并创建播放器实例

  4. 注册播放事件回调函数

  5. 播放网络音频(HTTPS URL)

  6. 演示播放控制:

    • 播放 1 秒后暂停

    • 暂停 1 秒后恢复播放

    • 恢复 1 秒后停止播放

编译

重要提示:在编译前,请先确认您使用的开发板型号。SDK 目前支持以下开发板:

  • arcs_evb - ARCS EVB 评估板

  • arcs_mini - ARCS Mini 开发板

根据您的开发板型号,选择对应的编译命令:

在示例目录下执行编译:

# 使用 arcs_evb 开发板
./build.sh -C -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -DBOARD=arcs_mini

Note

如果在 SDK 根目录执行,需要指定示例路径:

# 使用 arcs_evb 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_evb

# 或使用 arcs_mini 开发板
./build.sh -C -S samples/<示例路径> -DBOARD=arcs_mini

Note

确保已安装对应的工具链。

烧录

编译完成后,使用 SDK tools 目录下的 cskburn 工具烧录固件:

./tools/burn/cskburn -s /dev/ttyUSB0 -b 3000000 0x0 build/arcs.bin -C arcs

Note

烧录参数说明

  • -s /dev/ttyUSB0:串口设备路径,需要根据实际情况修改 - Linux 系统:通常是 /dev/ttyUSB0/dev/ttyACM0 - 可通过 ls /dev/tty* 命令查看可用串口设备 - 不同开发板或 USB 转串口芯片可能使用不同的设备名

  • -b 3000000:烧录波特率(3Mbps)

  • 0x0:烧录起始地址

  • build/arcs.bin:编译生成的固件路径

  • -C arcs:芯片类型

注意事项

  • 确保开发板已正确连接到电脑

  • 如果无法识别串口设备,请检查 USB 连接线是否正常,或尝试其他 USB 端口

预期输出

[I][samples] Connecting to network...
[I][samples] Network connected
[I][samples] PA OFF
[I][samples] Playing URL: https://listenai-firmware-delivery.oss-cn-beijing.aliyuncs.com/weather.mp3
[I][samples] PA ON
[I][samples] Player prepared
[I][samples] Player playing
[I][samples] Player paused
[I][samples] Player playing
[I][samples] Player stopped
[I][samples] PA OFF

音频输出:

  • 播放指定 URL 的网络音频

  • 播放过程中可听到暂停和恢复的效果

核心 API

API

说明

app_player_init()

初始化 app_player 模块

app_player_create()

创建播放器实例

app_player_register_callback()

注册事件回调函数

app_player_play()

播放指定 URL 的音频

app_player_pause()

暂停播放

app_player_resume()

恢复播放

app_player_stop()

停止播放(同步接口,等待停止完成)

app_player_destroy()

销毁播放器实例

关键代码

初始化和配置

/* 连接网络 */
net_connect();

/* 初始化 app_player 模块 */
app_player_config_t app_config = {
    .pa_ctrl_callback = pa_control_callback
};
ret = app_player_init(&app_config);
if (ret != APP_PLAYER_OK) {
    LOGE("App player init failed: %d", ret);
    return -1;
}

/* 创建播放器实例 */
app_player_t *player = app_player_create("tts");
if (player == NULL) {
    LOGE("Failed to create player");
    return -1;
}

/* 注册事件回调 */
app_player_register_callback(player, player_event_callback, NULL);

PA 控制回调

/**
 * @brief PA控制回调函数
 */
static int pa_control_callback(int onoff)
{
    LOGI("PA %s", onoff ? "ON" : "OFF");
    return lisa_gpio_write_pin(lisa_device_get(PA_GPIO_DEVICE),
                               PA_PIN_NUM,
                               onoff ? LISA_GPIO_HIGH : LISA_GPIO_LOW);
}

播放网络音频

/* 播放网络音频资源 */
const char *url = "https://listenai-firmware-delivery.oss-cn-beijing.aliyuncs.com/weather.mp3";
LOGI("Playing URL: %s", url);

ret = app_player_play(player, url);
if (ret != APP_PLAYER_OK) {
    LOGE("Failed to play: %d", ret);
    app_player_destroy(player);
    return -1;
}

播放控制

/* 暂停播放 */
app_player_pause(player);

/* 恢复播放 */
app_player_resume(player);

/* 同步停止(等待停止完成)*/
app_player_stop(player);

事件回调

static void player_event_callback(app_player_t *player,
                                  app_player_event_t event,
                                  void *user_data)
{
    switch (event) {
    case APP_PLAYER_EVENT_PREPARED:
        LOGI("Player prepared");
        break;
    case APP_PLAYER_EVENT_PLAYING:
        LOGI("Player playing");
        break;
    case APP_PLAYER_EVENT_PAUSED:
        LOGI("Player paused");
        break;
    case APP_PLAYER_EVENT_COMPLETED:
        LOGI("Player completed");
        break;
    case APP_PLAYER_EVENT_ERROR:
        LOGE("Player error");
        break;
    case APP_PLAYER_EVENT_STOPPED:
        LOGI("Player stopped");
        break;
    }
}

配置说明

PA 控制引脚

PA 控制引脚在代码中定义:

#define PA_PIN_NUM 27           // PA 控制引脚号
#define PA_GPIO_DEVICE "gpioa"  // GPIO 设备名

根据硬件设计修改对应的引脚和设备。

网络音频 URL

示例中使用的音频 URL:

const char *url = "https://listenai-firmware-delivery.oss-cn-beijing.aliyuncs.com/weather.mp3";

可以替换为其他支持的音频格式 URL(PCM、MP3、WAV、AAC、M4A)。

注意事项

  1. 网络连接: 必须先确保设备成功连接到网络,否则无法播放网络音频

  2. URL 格式: 支持 HTTP 和 HTTPS 协议的音频 URL

  3. 音频格式: 支持 PCM、MP3、WAV、AAC、M4A 格式,推荐使用 16kHz、16bit 的音频

  4. PA 回调必填: app_player_init() 时必须提供 pa_ctrl_callback,用于控制功放开关

  5. 返回值检查: 所有 API 调用后务必检查返回值,确保操作成功

  6. 网络稳定性: 网络不稳定可能导致播放中断或失败,建议添加重试机制

  7. 资源清理: 使用完毕后记得调用 app_player_destroy() 释放资源

  8. HTTPS 支持: 播放 HTTPS 音频需要确保系统支持 TLS/SSL

WiFi 连接失败

问题描述:示例程序无法连接到 WiFi 网络,或者网络连接超时。

解决方法

本示例需要联网才能播放网络音频和在线 TTS,请按以下步骤配置 WiFi:

  1. 打开 src/net/net_connect.c 文件

  2. 修改WiFi配置为你的实际网络信息:

#define TARGET_WIFI_SSID "your_wifi_ssid"      // 替换为你的 WiFi 名称
#define TARGET_WIFI_PWD "your_wifi_password"   // 替换为你的 WiFi 密码