Audio Demo#
简介#
本示例通过调用MPI API接口,完整实现了音频输入、输出、编解码以及Audio 3A处理功能。示例涵盖以下测试用例:
音频输入测试:采集环境声音,并保存为WAV文件,以此验证音频输入功能的准确性和稳定性。
音频输出测试:播放指定的WAV文件,通过耳机监听的方式,评估音频输出效果的质量。
音频输入输出同时测试:实时进行音频采集和播放,达成声音的即采即播,检验系统的实时处理能力。
音频编解码测试:利用内置的G711a/u 16bit音频编解码器,对音频数据执行编码和解码操作,测试编解码功能的可靠性。
功能说明#
音频输入#
音频输入功能通过采集环境中的声音信号,并将其保存为文件,以便后续对采集效果进行深度分析。在本示例中,系统会采集15秒的音频数据,并按照WAV格式标准进行保存。生成的WAV文件可使用VLC播放器直接播放,方便用户对采集的音频内容进行直观评估。
音频输出#
音频输出功能通过播放WAV文件,并借助耳机监听来判断输出效果。在示例测试过程中,用户可上传不同格式的WAV文件进行测试,以此全面检验音频输出功能在不同文件格式下的兼容性和表现。
音频输入输出#
音频输入和输出功能支持同时进行测试,该测试主要用于验证I2S模块功能。在测试时,I2S音频输入会实时采集环境中的声音信号,I2S音频输出则同步实时播放采集到的声音,用户插上耳机后,即可实时听到环境中的声音,以此评估I2S模块的实时处理性能。
音频编解码#
本系统内置G711a/u 16bit音频编解码器,为用户提供了基础的编解码能力。同时,系统具备开放性,支持用户注册其他外置编解码器,以满足多样化的编解码需求。
Audio 3A#
Audio 3A(Automatic Acoustic Adjustment,自动声学调整)包含以下关键功能:
ANS(Automatic Noise Suppression):即自动噪声抑制功能,主要用于有效降低环境噪声对音频信号的干扰,提升音频的纯净度。
AGC(Automatic Gain Control):自动增益控制功能,其作用是自动调节音频信号的增益,确保音频信号的强度始终保持在合适的范围内,避免信号过强或过弱。
AEC(Acoustic Echo Cancellation):声学回声消除功能,可消除音频传输过程中产生的回声,保证音频通信的清晰度。
这些功能可通过设置不同的使能项来启用,具体的使用方法和参数设置,请参考API接口文档进行操作。
使用说明#
代码位置#
demo 源码位置:canmv_k230/src/rtsmart/mpp/userapps/sample/sample_audio
。
假设您已经正确编译该 demo。启动开发板后,进入 /sdcard/elf/userapps
目录,sample_audio.elf
为测试 demo。
参数说明#
启动开发板后,进入 /sdcard/elf/userapps
目录,输入 ./sample_audio.elf -help
查看 demo 使用方法。
参数名 |
说明 |
默认值 |
---|---|---|
type |
测试不同模块功能 [0,12] |
- |
samplerate |
配置音频输入和输出的采样率(8k-192k) |
44100 |
enablecodec |
是否启用内置 codec [0,1]。1: 使用内置 codec |
0 |
bitwidth |
设置音频采样精度 [16,24,32]。 |
16 |
filename |
加载或存储 WAV/G711 文件名称。 |
- |
channels |
设置音频声道数,单声道或双声道 [1,2]。 |
2 |
monochannel |
设置为单声道时,选择单声道类型 [0,1]。0: 板载 mic,1: 耳机输入 |
0 |
audio3a |
是否启用 Audio 3A:enable_ans: 0x01, enable_agc: 0x02, enable_aec: 0x04,可叠加多个使能项 |
0 |
msh /sharefs/app>./sample_audio.elf
Please input:
-type: test audio function[0-12]
type 0:sample ai i2s module
type 1:sample ai pdm module
type 2:sample ao i2s module
type 3:sample ai(i2s) to ao (api) module
type 4:sample ai(i2s) to ao (sysbind) module
type 5:sample ai(pdm) to ao (api) module
type 6:sample ai(pdm) bind ao (sysbind) module
type 7:sample aenc(ai->aenc->file) (sysbind) module
type 8:sample adec(file->adec->ao) (sysbind) module
type 9:sample aenc(ai->aenc->file) (api) module
type 10:sample adec(file->adec->ao) (api) module
type 11:sample overall test (ai->aenc->file file->adec->ao) module
type 12:sample overall test (ai->aenc adec->ao loopback ) module
-samplerate: set audio sample(8000 ~ 192000)
-enablecodec: enable audio codec(0,1)
-loglevel: show kernel log level[0,7]
-bitwidth: set audio bit width(16,24,32)
-channels: channel count
-monochannel:0:mic input 1:headphone input
-filename: load or save file name
-audio3a: enable audio3a:enable_ans:0x01,enable_agc:0x02,enable_aec:0x04
示例#
I2S音频输入测试#
输入以下命令采集15秒的PCM音频数据,并保存为WAV格式文件:
./sample_audio.elf -type 0 -enablecodec 1 -bitwidth 16 -filename test.wav -audio3a 1
执行上述命令后,系统将开始采集音频数据,并显示如下输出:
./sample_audio.elf -type 0 -enablecodec 1 -bitwidth 16 -filename test.wav -audio3a 1
audio type:0,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
sample ai i2s module
audio i2s set clk freq is 2822400(2822400),ret:1
audio codec adc clk freq is 11289600(11289600)
ans_enable
========ans_enable:1,agc_enable:0,aec_enable:0
audio_save_init get vb block size:2646044
======kd_mpi_sys_mmap total size:2646044
[0s] timestamp 0 us,curpts:1505976917
[1s] timestamp 1000000 us,curpts:1506976917
[2s] timestamp 2000000 us,curpts:1507976917
[3s] timestamp 3000000 us,curpts:1508976917
[4s] timestamp 4000000 us,curpts:1509976917
[5s] timestamp 5000000 us,curpts:1510976917
[6s] timestamp 6000000 us,curpts:1511976917
[7s] timestamp 7000000 us,curpts:1512976917
[8s] timestamp 8000000 us,curpts:1513976917
[9s] timestamp 9000000 us,curpts:1514976917
[10s] timestamp 10000000 us,curpts:1515976917
[11s] timestamp 11000000 us,curpts:1516976917
[12s] timestamp 12000000 us,curpts:1517976917
[13s] timestamp 13000000 us,curpts:1518976917
dump binary memory test1.wav 0x10225000 0x104ab01c
[14s] timestamp 14000000 us,curpts:1519976917
destroy vb block
sample done
音频数据将被保存到指定的WAV文件中。
I2S音频输出测试#
该测试通过循环播放 WAV 文件来验证音频输出功能,用户可以按任意键退出测试。
输入以下命令播放 WAV 音频:
./sample_audio.elf -type 2 -filename test.wav -enablecodec 1
执行上述命令后,系统将开始播放指定的 WAV 文件,并显示如下输出:
./sample_audio.elf -type 2 -filename test.wav -enablecodec 1
audio type:2,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
enter q key to exit
sample ao i2s module
========read_wav_header:headerlen:44,channel:2,samplerate:44100,bitpersample:16
open file:test.wav ok,file size:2646044,data size:2646000,wav header size:44
=======_get_audio_frame virt_addr:0x1002aa000
audio i2s set clk freq is 2822400(2822400),ret:1
audio init codec dac clk freq is 11289600
audio set codec dac clk freq is 11289600(11289600)
q
diable ao audio
destroy vb block
sample done
音频将通过耳机或扬声器播放,用户可以通过按任意键退出测试。
I2S音频输入输出API接口测试#
使用以下命令通过API接口实时测试音频输入输出功能:
./sample_audio.elf -type 3 -bitwidth 16 -enablecodec 1 -samplerate 8000 -audio3a 1
执行上述命令后,系统将开始实时采集和播放音频,并显示如下输出:
./sample_audio.elf -type 3 -bitwidth 16 -enablecodec 1 -samplerate 8000 -audio3a 1
audio type:3,sample rate:8000,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:1.35 MB
vb_set_config ok
enter q key to exit
sample ai(i2s) to ao module
audio i2s set clk freq is 512000(512000),ret:1
audio codec adc clk freq is 2048000(2048000)
ans_enable
========ans_enable:1,agc_enable:0,aec_enable:0
audio i2s set clk freq is 512000(512000),ret:1
audio init codec dac clk freq is 2048000
audio set codec dac clk freq is 2048000(2048000)
[0s] timestamp 0 us,curpts:2017301433
[1s] timestamp 1000000 us,curpts:2018301433
...
q
diable ao module
diable ai module
release vb block
destroy vb block
sample done
I2S音频输入和输出模块的系统绑定测试#
使用以下命令通过AI和AO模块绑定实时测试音频输入输出功能:
./sample_audio.elf -type 4 -bitwidth 16 -enablecodec 1 -samplerate 8000 -audio3a 1
执行上述命令后,系统将通过调用系统绑定API接口 kd_mpi_sys_bind
将AI和AO模块绑定,并显示如下输出:
./sample_audio.elf -type 4 -bitwidth 16 -enablecodec 1 -samplerate 8000 -audio3a 1
audio type:4,sample rate:8000,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:1.35 MB
vb_set_config ok
enter q key to exit
sample ai(i2s) bind ao module
audio i2s set clk freq is 512000(512000),ret:1
audio codec adc clk freq is 2048000(2048000)
ans_enable
========ans_enable:1,agc_enable:0,aec_enable:0
audio i2s set clk freq is 512000(512000),ret:1
audio init codec dac clk freq is 2048000
audio set codec dac clk freq is 2048000(2048000)
q
diable ao module
diable ai module
release vb block
destroy vb block
sample done
编码测试#
使用以下命令获取AI数据并编码保存到文件。编解码只支持G711a/u/lpcm,16bit。
系统绑定方式:
./sample_audio.elf -type 7 -bitwidth 16 -enablecodec 1 -filename /sharefs/i2s_codec.g711a -audio3a 1
执行上述命令后,系统将开始编码音频数据,并显示如下输出:
./sample_audio.elf -type 7 -bitwidth 16 -enablecodec 1 -filename /sharefs/i2s_codec.g711a -audio3a 1
audio type:7,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
enter q key to exit
sample aenc module (sysbind)
audio i2s set clk freq is 2822400(2822400),ret:1
audio codec adc clk freq is 11289600(11289600)
ans_enable
========ans_enable:1,agc_enable:0,aec_enable:0
q
destroy vb block
sample done
API接口方式:
./sample_audio.elf -type 9 -bitwidth 16 -enablecodec 1 -filename /sharefs/i2s_codec.g711a -audio3a 1
执行上述命令后,系统将开始编码音频数据,并显示如下输出:
./sample_audio.elf -type 9 -bitwidth 16 -enablecodec 1 -filename /sharefs/i2s_codec.g711a -audio3a 1
audio type:9,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
enter q key to exit
sample aenc module (api)
audio i2s set clk freq is 2822400(2822400),ret:1
audio codec adc clk freq is 11289600(11289600)
ans_enable
========ans_enable:1,agc_enable:0,aec_enable:0
q
destroy vb block
sample done
解码测试#
使用以下命令读取文件数据并解码播放。编解码只支持G711a/u/lpcm,16bit。
系统绑定方式:
./sample_audio.elf -type 8 -filename /sharefs/i2s_codec.g711a -enablecodec 1 -bitwidth 16
执行上述命令后,系统将开始解码音频数据,并显示如下输出:
./sample_audio.elf -type 8 -filename /sharefs/i2s_codec.g711a -enablecodec 1 -bitwidth 16
audio type:8,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
enter q key to exit
sample adec module (sysbind)
audio i2s set clk freq is 2822400(2822400),ret:1
audio init codec dac clk freq is 11289600
audio set codec dac clk freq is 11289600(11289600)
adec_bind_call_back dev_id:0 chn_id:0
read file again
q
adec_bind_call_back dev_id:0 chn_id:0
destroy vb block
sample done
API接口方式:
./sample_audio.elf -type 10 -filename /sharefs/i2s_codec.g711a -enablecodec 1 -bitwidth 16
执行上述命令后,系统将开始解码音频数据,并显示如下输出:
./sample_audio.elf -type 10 -filename /sharefs/i2s_codec.g711a -enablecodec 1 -bitwidth 16
audio type:10,sample rate:44100,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:7.46 MB
vb_set_config ok
enter q key to exit
sample adec module (api)
audio i2s set clk freq is 2822400(2822400),ret:1
audio init codec dac clk freq is 11289600
audio set codec dac clk freq is 11289600(11289600)
read file again
q
destroy vb block
sample done
音频全流程测试#
音频全流程测试包括两条链路:AI->AENC 和 ADEC->AO 的绑定回环测试。该测试使用内置 codec,16bit 精度进行模拟,并启用 AEC 软件降噪功能。同时,测试 G711 编码后的流时间戳。
使用以下命令进行测试:
./sample_audio.elf -type 12 -samplerate 48000 -enablecodec 1 -audio3a 1 &
执行上述命令后,系统将开始音频全流程测试,并显示如下输出:
./sample_audio.elf -type 12 -samplerate 48000 -enablecodec 1 -audio3a 1 &
audio type:12,sample rate:48000,bit width:16,channels:2,enablecodec:1,monochannel:0
mmz blk total size:8.12 MB
vb_set_config ok
enter q key to exit
sample ai->aenc adec->ao module (loopback)
Force the sampling accuracy to be set to 16,use inner cocdec
audio i2s set clk freq is 3072000(3072000),ret:1
audio codec adc clk freq is 12288000(12288000)
audio i2s set clk freq is 3072000(3072000),ret:1
audio init codec dac clk freq is 11289600
audio set codec dac clk freq is 12288000(12288000)
adec_bind_call_back dev_id:0 chn_id:0
[0s] g711 stream timestamp 0 us,curpts:341326051
[1s] g711 stream timestamp 1000000 us,curpts:342326051
...
q
adec_bind_call_back dev_id:0 chn_id:0
destroy vb block
sample done
输入 cat /proc/umap/sysbind
可查看模块间系统绑定:
-----BIND RELATION TABLE--------------------------------------------------------
FirMod FirDev FirChn SecMod SecDev SecChn TirMod TirDev TirChn SendCnt rstCnt
ai 0 0 aenc 0 0 null 0 0 310 0
adec 0 0 ao 0 0 null 0 0 310 0
提示
有关 audio 模块的具体接口,请参考API文档