Audio 快速入门
1. 概述与作用
本样例演示 Hi3516CV610 上音频子系统(AI/AO/AENC/ADEC/ACODEC)的端到端调用流程,隶属于音频媒体域,解决 IPC 摄像机双向对讲、录音保存、文件播放与语音质量增强等场景的接入需求。
专业名词与缩写:
- AI — Audio Input,音频输入
- AO — Audio Output,音频输出
- AENC — Audio Encode,音频编码
- ADEC — Audio Decode,音频解码
- ACODEC — Audio Codec,音频模数转换芯片
- VQE — Voice Quality Enhancement,语音质量增强,支持RecordVQE/TalkVQE/TalkVQEV2这3类VQE算法
- 支持G711A/G711U/G726/ADPCM/LPCM/AAC/MP3/OPUS 编解码格式
2. 执行准备
在编译本样例之前,请参照Hi3516CV610环境搭建指南和快速上手指南完成编译环境的搭建。
2.1 编译
进入样例目录执行 make 即可完成编译:
编译成功之后,在当前目录下会生成一个sample_audio的可执行文件,可以放社区支持的开发板上运行。
2.2 加载 KO
ko加载脚本位于 output/mpp/ko/load_ko,有两个脚本,load3516cv610_20s和load3516cv610_20s_debug。区别为load3516cv610_20s_debug脚本会打开 logmpp_show=1(日志记录)、proc_show=1(proc信息打印),并将 mem_process_isolation 置为 0(不启用进程间mmz隔离)。
由于当前版本不支持进程间mmz隔离,因此需要在load3516cv610_20s脚本中将 mem_process_isolation 置为 0或者使用load3516cv610_20s_debug脚本,此处以load3516cv610_20s_debug脚本为例,20s内存大小为128MB,默认分配为 32MB OS、96MB MMZ,加载命令为:
可以通过-h命令查看具体用法:
./load3516cv610_20s_debug -h
Usage: ./load3516cv610_20s_debug [-option] [-sensor0~1]
options:
-i insert modules
-r remove modules
-a remove modules first, then insert modules
-sensor0~1 sensor_name config sensor type [default: hy006_3814_0011]
-mmz_start config MMZ start addr [default: 0x42000000]
-mmz_size config MMZ mem size [unit: M, default: 96M]
-ir_auto config ir_auto enable [default: 0]
-profile config sys_profile [default: 0]
-h help information
Available sensors:hy006_3814_0011 bt1120/bt656/bt601
for example: ./load3516cv610_20s_debug -i -sensor0 hy006_3814_0011 -sensor1 hy006_3814_0011 -mmz_start 0x42000000 -mmz_size 96M -ir_auto 1
如果需要调整os和mmz的大小,需要参考《内存布局调整指南》对内存大小进行调整。
如果是使用社区默认提供的镜像,这些ko已经打包到文件系统中,烧录到单板上后位于
/ko目录下,在系统启动后会自动加载这些ko。
2.3 运行时依赖
在运行样例前,需要提前准备:
- 指定运行时依赖的so库路径
运行依赖动态库libmp3_enc.so、libmp3_lame.so、libmp3_dec.so等so库位于soc/libs/musl下,需要将该目录下的so库拷贝到开发板上(或将这些so库所在的目录挂载到开发板上),并指定运行时依赖库的环境变量,假设这些so库位于/mnt/libs/,执行如下命令:
```shell
export LD_LIBRARY_PATH=/mnt/libs/:$LD_LIBRARY_PATH
```
如果是使用社区默认提供的镜像,这些so库已经打包到文件系统中,烧录到单板上后位于
/usr/lib目录下,该目录是系统默认搜索目录,不需要执行export LD_LIBRARY_PATH命令去指定。
- 启动MPP服务
当前MPP媒体模块处于用户态,通过一个独立进程提供相关接口的调用服务,该进程位于samples/mpp/sdk_server下,执行如下命令即可生成sdk_server可执行文件:
```shell
cd samples/mpp/sdk_server && make
```
在单板上执行./sdk_server &即可启动MPP服务,并在后台运行,可以使用ps查看进程是否运行。
- sdk_server同样依赖
soc/libs/musl下的so库,因此在运行sdk_server前也需要参照上述export LD_LIBRARY_PATH指定路径;- 如果是使用社区默认提供的镜像,sdk_server进程已经打包到文件系统中,烧录到单板上后位于
/usr/bin目录下,并在系统启动时会自动启动sdk_server。
2.4 运行样例
调用语法:./sample_audio <index> [encoder_type|decoder_type|vqe_type] [decode_file_path],无交互菜单;运行中按 Ctrl+C 退出。可以执行./sample_audio -h查看用法。

3. 支持的 Case 列表
3.1 case 0:sample_audio_ai_ao
主要演示AI录音,AO播放相关接口调用流程。数据通路为AI录音后将录音数据送AO进行播放。
调用命令
执行结果验证
-
外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;
-
外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;
-
控制台串口无报错打印,输出:
软件配置流程
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
- 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。
数据流

3.2 case 1:sample_audio_ai_aenc
主要演示AI录音,AENC编码相关接口调用流程,数据通路为AI录音后将录音数据送AENC进行编码,同时将编码后的数据保存为文件,并送给ADEC进行解码,解码后的数据送往AO进行播放。
调用命令
默认使用AAC编解码器,可以通过命令行参数选择需要的编解码器
./sample_audio 1 [encoder_type]
encoder_type:
0: G711A
1: G711U
2: G726
3: ADPCM
4: AAC(default)
5: MP3
6: OPUS
7: LPCM
执行结果验证
-
外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;
-
外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;
-
sample同级目录下会生成对应编码格式的码流文件audio_chn0,后缀为对应编码器格式;
-
控制台串口无报错打印,输出:
软件配置流程
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 创建编码通道,参考ss_mpi_aenc_create_chn接口。
- 绑定AENC通道到AI通道,或者创建线程从AI获取音频帧送往AENC进行编码,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_aenc_send_frame等接口。
注意:ADEC和AO的配置流程在case 2中展示
数据流

注意:ADEC和AO的数据流在case 2中展示
3.3 case 2:sample_audio_adec_ao
主要演示ADEC解码,AO播放相关接口调用流程,数据通路为将case 1保存的码流文件audio_chn0.aac送给ADEC进行解码,解码后的数据送往AO进行播放。
调用命令
默认使用AAC解码器,可以通过命令行参数选择需要的编解码器
./sample_audio 2 [decoder_type] [decode_file_path]
decoder_type:
0: G711A
1: G711U
2: G726
3: ADPCM
4: AAC(default)
5: MP3
6: OPUS
7: LPCM
decode_file_path:
The decoding file type must be the same as the decoder type
执行结果验证
-
接3.5mm 耳机或音箱连接至单板Audio out耳机孔;
-
连接在单板Audio out耳机孔的耳机或音箱反复播放case 1录制的音频文件,声音无杂音无变速;
-
控制台串口无报错打印,输出:
软件配置流程
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 创建解码通道,参考ss_mpi_adec_create_chn接口。
- 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 绑定AO通道到ADEC通道,参考ss_mpi_sys_bind接口。
- 创建线程从码流文件中读取数据送往解码通道进行解码,参考ss_mpi_adec_send_end_of_stream接口。
数据流

3.4 case 3:sample_audio_ai_vqe_process_ao
主要演示AI录音并开启声音质量增强(VQE)功能,AO播放相关接口调用流程。在case 0数据通路的基础上开启了AI录制通路上的VQE功能,默认开启了RecordVQE功能。
调用命令
默认开启RecordVQE功能,可以通过命令行参数选择需要开启的VQE类型
执行结果验证
-
外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;
-
外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速,音频效果和具体开启的VQE算法类型相关;
-
控制台串口无报错打印,输出:
软件配置流程
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
- 设置AI通道VQE属性,使能通道VQE,参考ss_mpi_ai_set_record_vqe_attr、ss_mpi_ai_set_talk_vqe_attr、ss_mpi_ai_set_talk_vqe_v2_attr、ss_mpi_ai_enable_vqe等接口。
- 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。
数据流

3.5 case 4:sample_audio_ai_to_ao_sys_chn
主要演示AI录音,AO系统音通道播放相关接口调用流程。数据通路为AI录音后将录音数据送AO系统音通道进行播放。
调用命令
执行结果验证
-
外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;
-
外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;
-
控制台串口无报错打印,输出:
软件配置流程
代码流程:
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
- 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
- 使能AO系统音通道,系统音通道号为OT_AO_SYS_CHN_ID,参考ss_mpi_ao_enable_chn接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。
数据流

3.6 case 5:sample_audio_ai_to_ext_resample
主要演示AI录音,使用vqe_res重采样功能库进行重采样相关接口调用流程。数据通路为AI录音后将录音数据送vqe_res重采样库进行重采样,并保存重采样后的音频文件。
调用命令
执行结果验证
- 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔;
- 外置播放设备(手机或者电脑)播放任一双声道音频文件;
- 录制通路默认录制采样率为16kHz的单通道音频数据,送vqe_res重采样库默认重采样至24kHz,保存的res_chn0.pcm文件为24kHz单通道文件,可以通过Audition/Audacity等PC软件进行播放。
软件配置流程
- 音频模块初始化,参考ss_mpi_audio_init接口。
- 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
- 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
- 获取vqe_res库对外接口符号,可以使用静态注册方式,也可以使用动态加载的方式,参考OT_VQE_USE_STATIC_MODULE_REGISTER功能宏的使用。
- 创建线程,调用vqe_res库初始化接口,从AI获取帧,并送vqe_res库处理接口进行重采样,将重采样后的数据存为文件,参考ss_resample_create、ss_mpi_ai_get_frame、ss_resample_process接口。
数据流

注意:数据流图中未体现vqe_res模块。