6. 蓝牙音频框架示例 - mSBC编解码

本示例演示如何使用 lisa_bt_audio_framework 进行音频的录音、编码、解码和播放。

6.1. 功能说明

  1. 录音与编码:从麦克风录制音频,并使用 mSBC 编解码器进行编码

  2. 解码与播放:接收 mSBC 编码的数据,解码后通过扬声器播放

  3. 环形缓冲区:使用环形缓冲区在编码和解码会话之间传输数据

6.2. 硬件连接

  • 板卡需要有 audio0 设备,包括麦克风和扬声器

6.3. 架构说明

[麦克风] -> [录音会话/编码] -> [环形缓冲区] -> [播放会话/解码] -> [扬声器]
              (mSBC Encoder)                      (mSBC Decoder)

6.3.1. 数据流程

  1. 录音线程(Encode Task)

    • 从录音会话获取编码后的 mSBC 数据

    • 将编码数据写入环形缓冲区

  2. 播放线程(Decode Task)

    • 从环形缓冲区读取编码数据

    • 将数据喂给播放会话进行解码和播放

6.4. mSBC 编解码器

  • 采样率:16 kHz

  • 声道:单声道

  • 位深:16 位

  • 帧大小:57 字节(编码后)

  • PCM 帧大小:240 字节(120 个采样点)

  • 比特率:约 64 kbps

  • 帧时长:7.5 ms

6.5. 配置说明

6.5.1. prj.conf 配置

# 蓝牙音频框架
CONFIG_LISA_BT_AUDIO_FRAMEWORK=y
CONFIG_LISA_BT_AUDIO_INTERFACE=y

# mSBC 编解码器
CONFIG_AUDIO_CODEC_MSBC=y

# 音频驱动
CONFIG_LISA_AUDIO_DEVICE=y

6.5.2. 线程优先级

  • 编码任务:优先级 10,栈大小 2048 字节

  • 解码任务:优先级 10,栈大小 2048 字节

6.6. 示例内容

  1. 初始化蓝牙音频框架

  2. 创建录音会话(mSBC 编码模式)

  3. 创建播放会话(mSBC 解码模式)

  4. 启动编码和解码任务

  5. 运行 60 秒后自动停止并清理资源

6.7. 编译

重要提示:在编译前,请先确认您使用的开发板型号。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

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

6.8. 烧录

编译完成后,使用 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 端口

6.9. 预期输出

程序启动后会:

  1. 初始化蓝牙音频框架

  2. 创建录音会话(mSBC 编码)

  3. 创建播放会话(mSBC 解码)

  4. 启动编码和解码任务

  5. 运行 60 秒后自动停止

6.9.1. 日志输出示例

[bt_audio_sample] BT Audio Framework Sample - mSBC Codec
[bt_audio_sample] =====================================
[bt_audio_sample] BT audio framework initialized, version: 1.0.0
[bt_audio_sample] Audio device obtained: audio0
[bt_audio_sample] Capture session created and started
[bt_audio_sample] Playback session created and started
[bt_audio_sample] Encode task started
[bt_audio_sample] Decode task started
[bt_audio_sample] Sample running... Press Ctrl+C to stop
[bt_audio_sample] Recording audio -> mSBC encode -> mSBC decode -> Playback
[bt_audio_sample] Encoded 10240 bytes, buffer: 2048/16384
[bt_audio_sample] Decoded 10240 bytes
...

6.10. API 使用说明

6.10.1. 1. 初始化框架

bt_audio_error_t ret = bt_audio_framework_init();
bt_audio_register_all_codecs();
bt_audio_register_all_interfaces();

6.10.2. 2. 创建会话

bt_audio_session_config_t config = {
    .profile = BT_PROFILE_HFP,
    .codec_type = BT_CODEC_MSBC,
    .direction = BT_AUDIO_DIR_CAPTURE,  // 或 BT_AUDIO_DIR_PLAYBACK
    .interface_name = "lisa_audio",
    .event_callback = event_callback,
    .user_data = NULL,
};

bt_audio_session_handle_t session;
bt_audio_session_create(&config, &session);

6.10.3. 3. 启动会话

bt_audio_codec_config_t codec_config = {
    .codec_type = BT_CODEC_MSBC,
    .format = {
        .sample_rate = 16000,
        .channels = 1,
        .bits_per_sample = 16,
    },
};

bt_audio_session_start(session, &codec_config);

6.10.4. 4. 数据传输

编码方向(录音)

// 获取编码后的数据
size_t read_size;
bt_audio_session_get_encoded_data(session, buffer, size, &read_size);

解码方向(播放)

// 喂入编码数据进行解码和播放
bt_audio_session_feed_encoded_data(session, data, size);

6.10.5. 5. 清理资源(正确顺序)

// 1. 先停止会话(停止硬件和编解码线程)
bt_audio_session_stop(capture_session);
bt_audio_session_stop(playback_session);

// 2. 通知回环任务退出
g_running = false;

// 3. 等待任务完全退出
vTaskDelay(pdMS_TO_TICKS(200));

// 4. 销毁会话
bt_audio_session_destroy(capture_session);
bt_audio_session_destroy(playback_session);

// 5. 反初始化框架
bt_audio_framework_deinit();

6.11. 注意事项

  1. 音频设备:确保板卡有 audio0 设备,包括麦克风和扬声器

  2. 编解码模式passthrough_mode = false 表示启用 mSBC 编解码

  3. 帧对齐:mSBC 数据必须按帧(57 字节)传输,不能截断

  4. 清理顺序:必须按照正确顺序清理资源,避免 ringbuf full 警告

  5. 延迟:系统引入一定的缓冲延迟(约 100-200ms),用于平滑数据流

  6. 内存要求:确保有足够的 RAM 用于编解码缓冲区

6.12. 扩展建议

  1. 蓝牙传输:可将编码数据通过蓝牙发送到另一个设备

  2. 文件录制:将编码数据保存到文件系统

  3. 音量控制:使用 bt_audio_session_set_volume() 调整音量

  4. 其他编解码器:支持 SBC、LC3 等其他编解码器

  5. A2DP/HFP:与实际的蓝牙协议栈集成

6.13. 参考文档

6.14. 故障排查

6.14.1. 问题:没有音频输出

可能原因

  • 音频设备未正确初始化

  • 麦克风或扬声器硬件问题

  • mSBC 编解码器未正确配置

解决方法

  • 检查 CONFIG_AUDIO_CODEC_MSBC=y 是否已设置

  • 查看日志中的错误信息

  • 测试硬件是否正常

6.14.2. 问题:音频断续或有噪音

可能原因

  • 缓冲区配置不足

  • 系统负载过高

  • 编解码错误或丢帧

解决方法

  • 增加 PCM ringbuf 时间配置

  • 增加编码数据 ringbuf 大小

  • 提高任务优先级

  • 检查 mSBC 编解码器返回值

  • 确保数据按帧边界对齐

6.14.3. 问题:程序退出时有 ringbuf full 警告

原因:清理顺序不正确,会话停止前任务就已退出

解决方法:按照正确的清理顺序操作(见上文第 5 节)

6.14.4. 问题:编译错误

解决方法

  • 确认 prj.conf 中已启用 mSBC 相关配置

  • 检查 SDK 版本是否支持 lisa_bt_audio_framework

  • 确认依赖组件已正确配置

6.15. 许可证

Copyright © 2025, LISTENAI

SPDX-License-Identifier: Apache-2.0