6. 蓝牙音频框架示例 - mSBC编解码
源码位置: samples/bluetooth/audio_framework/msbc_loopback 查看源码
本示例演示如何使用 lisa_bt_audio_framework 进行音频的录音、编码、解码和播放。
6.1. 功能说明
录音与编码:从麦克风录制音频,并使用 mSBC 编解码器进行编码
解码与播放:接收 mSBC 编码的数据,解码后通过扬声器播放
环形缓冲区:使用环形缓冲区在编码和解码会话之间传输数据
6.2. 硬件连接
板卡需要有
audio0设备,包括麦克风和扬声器
6.3. 架构说明
[麦克风] -> [录音会话/编码] -> [环形缓冲区] -> [播放会话/解码] -> [扬声器]
(mSBC Encoder) (mSBC Decoder)
6.3.1. 数据流程
录音线程(Encode Task)
从录音会话获取编码后的 mSBC 数据
将编码数据写入环形缓冲区
播放线程(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. 示例内容
初始化蓝牙音频框架
创建录音会话(mSBC 编码模式)
创建播放会话(mSBC 解码模式)
启动编码和解码任务
运行 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. 预期输出
程序启动后会:
初始化蓝牙音频框架
创建录音会话(mSBC 编码)
创建播放会话(mSBC 解码)
启动编码和解码任务
运行 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. 注意事项
音频设备:确保板卡有
audio0设备,包括麦克风和扬声器编解码模式:
passthrough_mode = false表示启用 mSBC 编解码帧对齐:mSBC 数据必须按帧(57 字节)传输,不能截断
清理顺序:必须按照正确顺序清理资源,避免 ringbuf full 警告
延迟:系统引入一定的缓冲延迟(约 100-200ms),用于平滑数据流
内存要求:确保有足够的 RAM 用于编解码缓冲区
6.12. 扩展建议
蓝牙传输:可将编码数据通过蓝牙发送到另一个设备
文件录制:将编码数据保存到文件系统
音量控制:使用
bt_audio_session_set_volume()调整音量其他编解码器:支持 SBC、LC3 等其他编解码器
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