跳转至

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 即可完成编译:

cd samples/mpp/audio && 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,加载命令为:

./load3516cv610_20s_debug -i

可以通过-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查看进程是否运行。

  1. sdk_server同样依赖soc/libs/musl下的so库,因此在运行sdk_server前也需要参照上述export LD_LIBRARY_PATH指定路径;
  2. 如果是使用社区默认提供的镜像,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查看用法。

image-20260810093505457

3. 支持的 Case 列表

3.1 case 0:sample_audio_ai_ao

主要演示AI录音,AO播放相关接口调用流程。数据通路为AI录音后将录音数据送AO进行播放。

调用命令

./sample_audio 0

执行结果验证

  1. 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;

  2. 外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;

  3. 控制台串口无报错打印,输出:

    please press twice ENTER to exit this sample
    

软件配置流程

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
  3. 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
  4. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  5. 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002250477057.png

3.2 case 1:sample_audio_ai_aenc

主要演示AI录音,AENC编码相关接口调用流程,数据通路为AI录音后将录音数据送AENC进行编码,同时将编码后的数据保存为文件,并送给ADEC进行解码,解码后的数据送往AO进行播放。

调用命令

./sample_audio 1

默认使用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

执行结果验证

  1. 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;

  2. 外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;

  3. sample同级目录下会生成对应编码格式的码流文件audio_chn0,后缀为对应编码器格式;

  4. 控制台串口无报错打印,输出:

    please press twice ENTER to exit this sample
    

软件配置流程

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
  3. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  4. 创建编码通道,参考ss_mpi_aenc_create_chn接口。
  5. 绑定AENC通道到AI通道,或者创建线程从AI获取音频帧送往AENC进行编码,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_aenc_send_frame等接口。

注意:ADEC和AO的配置流程在case 2中展示

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002215477370.png

注意:ADEC和AO的数据流在case 2中展示

3.3 case 2:sample_audio_adec_ao

主要演示ADEC解码,AO播放相关接口调用流程,数据通路为将case 1保存的码流文件audio_chn0.aac送给ADEC进行解码,解码后的数据送往AO进行播放。

调用命令

./sample_audio 2

默认使用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

执行结果验证

  1. 接3.5mm 耳机或音箱连接至单板Audio out耳机孔;

  2. 连接在单板Audio out耳机孔的耳机或音箱反复播放case 1录制的音频文件,声音无杂音无变速;

  3. 控制台串口无报错打印,输出:

    please press twice ENTER to exit this sample
    

软件配置流程

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 创建解码通道,参考ss_mpi_adec_create_chn接口。
  3. 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
  4. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  5. 绑定AO通道到ADEC通道,参考ss_mpi_sys_bind接口。
  6. 创建线程从码流文件中读取数据送往解码通道进行解码,参考ss_mpi_adec_send_end_of_stream接口。

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002215637178.png

3.4 case 3:sample_audio_ai_vqe_process_ao

主要演示AI录音并开启声音质量增强(VQE)功能,AO播放相关接口调用流程。在case 0数据通路的基础上开启了AI录制通路上的VQE功能,默认开启了RecordVQE功能。

调用命令

./sample_audio 3

默认开启RecordVQE功能,可以通过命令行参数选择需要开启的VQE类型

./sample_audio 3 [vqe_type]
vqe_type:
    0: none
    1: record(default)
    2: talk
    3: talkv2

执行结果验证

  1. 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;

  2. 外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速,音频效果和具体开启的VQE算法类型相关;

  3. 控制台串口无报错打印,输出:

    please press twice ENTER to exit this sample
    

软件配置流程

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
  3. 设置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等接口。
  4. 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
  5. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  6. 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002250557181.png

3.5 case 4:sample_audio_ai_to_ao_sys_chn

主要演示AI录音,AO系统音通道播放相关接口调用流程。数据通路为AI录音后将录音数据送AO系统音通道进行播放。

调用命令

./sample_audio 4

执行结果验证

  1. 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔,另接3.5mm 耳机或音箱连接至单板Audio out耳机孔;

  2. 外置播放设备(手机或者电脑)播放任一双声道音频文件,连接在单板Audio out耳机孔的耳机或音箱能正常播放该音频,声音无杂音无变速;

  3. 控制台串口无报错打印,输出:

    please press twice ENTER to exit this sample
    

软件配置流程

代码流程:

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
  3. 设置AO设备属性,使能AO设备和通道,参考ss_mpi_ao_set_pub_attr、ss_mpi_ao_enable、ss_mpi_ao_enable_chn等接口。
  4. 使能AO系统音通道,系统音通道号为OT_AO_SYS_CHN_ID,参考ss_mpi_ao_enable_chn接口。
  5. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  6. 绑定AO通道到AI通道,或者创建线程从AI获取音频帧送往AO进行播放,参考ss_mpi_sys_bind、ss_mpi_ai_get_frame、ss_mpi_ao_send_frame等接口。

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002250477061.png

3.6 case 5:sample_audio_ai_to_ext_resample

主要演示AI录音,使用vqe_res重采样功能库进行重采样相关接口调用流程。数据通路为AI录音后将录音数据送vqe_res重采样库进行重采样,并保存重采样后的音频文件。

调用命令

./sample_audio 5

执行结果验证

  1. 外置播放设备(手机或者电脑)通过3.5mm耳机线连接至单板Audio in耳机孔;
  2. 外置播放设备(手机或者电脑)播放任一双声道音频文件;
  3. 录制通路默认录制采样率为16kHz的单通道音频数据,送vqe_res重采样库默认重采样至24kHz,保存的res_chn0.pcm文件为24kHz单通道文件,可以通过Audition/Audacity等PC软件进行播放。

软件配置流程

  1. 音频模块初始化,参考ss_mpi_audio_init接口。
  2. 设置AI设备属性,使能AI设备和通道,参考ss_mpi_ai_set_pub_attr、ss_mpi_ai_enable、ss_mpi_ai_enable_chn等接口。
  3. 配置内置ACODEC的采样率、输入方式、输入和输出音量,参考OT_ACODEC_SET_I2S1_FS、OT_ACODEC_SET_MIXER_MIC、OT_ACODEC_SET_INPUT_VOLUME、OT_ACODEC_SET_OUTPUT_VOLUME等ioctl接口。
  4. 获取vqe_res库对外接口符号,可以使用静态注册方式,也可以使用动态加载的方式,参考OT_VQE_USE_STATIC_MODULE_REGISTER功能宏的使用。
  5. 创建线程,调用vqe_res库初始化接口,从AI获取帧,并送vqe_res库处理接口进行重采样,将重采样后的数据存为文件,参考ss_resample_create、ss_mpi_ai_get_frame、ss_resample_process接口。

数据流

Figure Name:unnaming.png CAD Name:zh-cn_image_0000002215477374.png

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