04 音频处理应用
本章节介绍 GK7206 的音频处理应用示例 —— sample_audio。该应用包含了 9 个独立的音频处理程序,涵盖了音频采集、播放、编解码、录音、双讲等完整的音频功能链路。
应用源码位于 SDK 目录 sample/audio/,提供了全面的音频功能演示,是开发音频相关应用的参考模板。
1 应用概述
1.1 功能特性
本应用包含 9 个独立的音频处理程序:
- sample_audio_ai - 音频采集(AI,Audio Input)
- sample_audio_ao - 音频输出(AO,Audio Output)
- sample_audio_encoder - 音频编码(PCM → G711/AAC)
- sample_audio_decoder - 音频解码(G711/AAC → PCM)
- sample_audio_record_v1 - 录音(版本 1)
- sample_audio_record_v2 - 录音(版本 2)
- sample_audio_record_v3 - 录音(版本 3)
- sample_audio_record_detect - 录音 + 检测
- sample_audio_doubletalk_v1/v2 - 双讲(AEC 回声消除)
1.2 技术参数
| 参数 | 值 |
|---|---|
采样率 | 8000/16000/32000/44100/48000 Hz |
声道数 | 1(单声道)/ 2(立体声) |
采样位深 | 16 bit |
编码格式 | G711A/U、AAC |
音频质量增强 | VQE(Voice Quality Enhancement) |
回声消除 | AEC(Acoustic Echo Cancellation) |
输入输出文件 | PCM 文件(放 /sd_card) |
1.3 目录结构
sample/audio/
├── Makefile # 构建脚本
├── sample_audio_ai # 音频采集程序
├── sample_audio_ai.c # 音频采集源码
├── sample_audio_ao # 音频输出程序
├── sample_audio_ao.c # 音频输出源码
├── sample_audio_encoder # 音频编码程序
├── sample_audio_encoder.c # 音频编码源码
├── sample_audio_decoder # 音频解码程序
├── sample_audio_decoder.c # 音频解码源码
├── sample_audio_record_v1 # 录音程序 v1
├── sample_audio_record_v2 # 录音程序 v2
├── sample_audio_record_v3 # 录音程序 v3
├── sample_audio_record_detect # 录音 + 检测程序
├── sample_audio_doubletalk_v1 # 双讲程序 v1
├── sample_audio_doubletalk_v2 # 双讲程序 v2
└── record_board/ # 板级录音
├── sample_record_board_detect
└── sample_record_board_record2 编译与部署
2.1 前置条件
在编译本应用之前,请确保已完成以下准备工作:
- SDK 环境已搭建:参照 SDK 编译 完成交叉编译工具链和 SDK 配置
- 音频硬件准备:
- 采集测试:需连接麦克风
- 播放测试:需连接喇叭
2.2 编译应用
# 进入 sample 目录
cd <SDK_PATH>/sample
# 编译 audio 示例
make -C audio clean && make -C audio或者从顶层编译:
make -C sample all2.3 部署到板端
# 使用 SCP 传输到开发板
scp sample/audio/sample_audio_* root@<板端IP>:/sd_card/
# 或通过 TFTP 下载
tftp -g -r sample_audio_ai <板端IP>相关信息
音频文件通常较大,建议放在 SD 卡上运行。
3 音频采集(AI)
3.1 功能说明
sample_audio_ai 演示了音频采集功能,将麦克风输入的音频数据保存为 PCM 文件。
3.2 命令格式
./sample_audio_ai [dev] [send_object] [binder_mode] [samplerate] [usr_samplerate] [channels] [workmode] [outfile] [vqe_type]参数说明:
| 参数 | 说明 | 取值 |
|---|---|---|
dev | 音频设备号 | 0/1 |
send_object | 发送对象 | 0=AO, 1=编码器, 2=两者 |
binder_mode | 绑定模式 | 0/1 |
samplerate | 采样率 | 8000/16000/32000/44100/48000 |
usr_samplerate | 用户采样率 | 8000/16000/32000/44100/48000 |
channels | 声道数 | 1/2 |
workmode | 工作模式 | 0/1 |
outfile | 输出文件路径 | /sd_card/ai.pcm |
vqe_type | 音频质量增强类型 | 0/1 |
3.3 典型用法
# 8 kHz 单声道采集,保存到 /sd_card/ai.pcm
./sample_audio_ai 0 0 0 8000 8000 1 0 /sd_card/ai.pcm 0
# 16 kHz 单声道采集,启用 VQE
./sample_audio_ai 0 0 0 16000 16000 1 0 /sd_card/ai.pcm 13.4 预期现象
程序运行后会打印以下信息:
audio ai sample running
ai dev: 0
samplerate: 8000
channels: 1
...
recording to /sd_card/ai.pcm采集过程中会持续打印帧计数,按 Ctrl+C 停止采集。
4 音频输出(AO)
4.1 功能说明
sample_audio_ao 演示了音频播放功能,从 PCM 文件读取音频数据并通过喇叭播放。
4.2 命令格式
./sample_audio_ao [infile] [dev] [dev_rate] [dev_chn] [frm_rate] [frm_chn] [mode] [pcm_sample] [vqe]参数说明:
| 参数 | 说明 | 取值 |
|---|---|---|
infile | 输入 PCM 文件路径 | /sd_card/in.pcm |
dev | 音频设备号 | 0/1 |
dev_rate | 设备采样率 | 8000/16000/32000/44100/48000 |
dev_chn | 设备声道数 | 1/2 |
frm_rate | 帧采样率 | 8000/16000/32000/44100/48000 |
frm_chn | 帧声道数 | 1/2 |
mode | 播放模式 | 0/1 |
pcm_sample | PCM 采样位深 | 16 |
vqe | 音频质量增强 | 0/1 |
4.3 典型用法
# 8 kHz 单声道播放
./sample_audio_ao /sd_card/in.pcm 0 8000 1 30 0 0 16 0
# 16 kHz 单声道播放,启用 VQE
./sample_audio_ao /sd_card/in.pcm 0 16000 1 30 0 0 16 14.4 预期现象
程序运行后会打印以下信息:
audio ao sample running
ao dev: 0
samplerate: 8000
channels: 1
...
playing /sd_card/in.pcm播放过程中会持续打印帧计数,播放完成后自动退出。
5 音频编解码
5.1 音频编码(sample_audio_encoder)
功能:将 PCM 文件编码为 G711/AAC 格式。
命令格式:
./sample_audio_encoder [infile_samplerate] [infile_channels] [infile] [outfile]典型用法:
# 编码为 G711
./sample_audio_encoder 8000 1 /sd_card/in.pcm /sd_card/out.g711
# 编码为 AAC
./sample_audio_encoder 8000 1 /sd_card/in.pcm /sd_card/out.aac5.2 音频解码(sample_audio_decoder)
功能:将 G711/AAC 文件解码为 PCM 格式。
命令格式:
./sample_audio_decoder [mode] [infile_samplerate] [infile]典型用法:
# 解码 G711
./sample_audio_decoder 0 8000 /sd_card/in.g711
# 解码 AAC
./sample_audio_decoder 1 8000 /sd_card/in.aac6 录音应用
6.1 版本差异
录音应用有三个版本,主要差异在于参数和功能:
| 版本 | 特点 |
|---|---|
sample_audio_record_v1 | 基础录音功能 |
sample_audio_record_v2 | 支持更多参数 |
sample_audio_record_v3 | 支持更多音频质量增强选项 |
6.2 命令格式
# v1
./sample_audio_record_v1 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type]
# v2
./sample_audio_record_v2 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type] [aec_mode]
# v3
./sample_audio_record_v3 [samplerate] [usr_samplerate] [binder_mode] [codec_input_vol] [outfile] [vqe_type] [aec_mode] [agc_mode]6.3 典型用法
# 基础录音
./sample_audio_record_v1 8000 8000 0 0 /sd_card/rec.pcm 0
# 启用 VQE 和 AEC 的录音
./sample_audio_record_v2 16000 16000 0 0 /sd_card/rec.pcm 1 17 双讲应用
7.1 功能说明
sample_audio_doubletalk_v1/v2 演示了双讲功能,即同时进行音频采集和播放,并启用 AEC(回声消除)。
7.2 命令格式
./sample_audio_doubletalk_v1 [samplerate] [usr_samplerate] [channels] [binder_mode] [outfile] [infile] [infile_samplerate]7.3 典型用法
# 双讲测试
./sample_audio_doubletalk_v1 8000 8000 1 0 /sd_card/out.pcm /sd_card/in.pcm 80007.4 预期现象
程序同时进行采集和播放,AEC 算法会消除回声,保证双向通话质量。
8 音频质量增强(VQE)
8.1 VQE 功能
VQE(Voice Quality Enhancement)提供以下功能:
| 功能 | 说明 |
|---|---|
| ANR | 自适应噪声抑制 |
| AGC | 自动增益控制 |
| AEC | 声学回声消除 |
| EQ | 均衡器 |
8.2 启用 VQE
在命令中将 vqe_type 参数设为 1 即可启用 VQE:
./sample_audio_ai 0 0 0 8000 8000 1 0 /sd_card/ai.pcm 19 关键编程要点
9.1 AI 音频采集流程
// 步骤 1:初始化 AI 模块
xmedia_ai_set_dev_attr(dev, &attr);
xmedia_ai_enable(dev);
// 步骤 2:获取音频帧
xmedia_ai_get_frame(dev, &frame, timeout);
// 步骤 3:处理音频帧
// ... 写入文件或送编码器 ...
// 步骤 4:释放音频帧
xmedia_ai_release_frame(dev, &frame);
// 步骤 5:禁用 AI 模块
xmedia_ai_disable(dev);9.2 AO 音频输出流程
// 步骤 1:初始化 AO 模块
xmedia_ao_set_dev_attr(dev, &attr);
xmedia_ao_enable(dev);
// 步骤 2:发送音频帧
xmedia_ao_send_frame(dev, &frame, timeout);
// 步骤 3:禁用 AO 模块
xmedia_ao_disable(dev);9.3 音频编解码流程
// 编码
xmedia_acodec_create_encoder(&chn, &type);
xmedia_acodec_send_frame(chn, &pcm_frame);
xmedia_acodec_get_stream(chn, &encoded_stream);
// 解码
xmedia_acodec_create_decoder(&chn, &type);
xmedia_acodec_send_stream(chn, &encoded_stream);
xmedia_acodec_get_frame(chn, &pcm_frame);10 常见问题排查
| 问题 | 可能原因 | 解决方案 |
|---|---|---|
| 无声音输出 | 喇叭未连接或音量过低 | 检查硬件连接,调节音量 |
| 采集无数据 | 麦克风未连接 | 检查硬件连接 |
| 声音失真 | 采样率不匹配 | 检查采样率设置 |
| 回声严重 | AEC 未启用 | 启用 VQE 和 AEC |
| 编解码失败 | 编码格式不支持 | 检查编码格式是否支持 |
