K230音频API参考
1. 概述
1.1 概述
音频模块包括音频输入ai、音频输出ao、音频编码aenc、音频解码adec四个子模块以及对内置模拟audio codec的支持。音频输入模块包括i2s和pdm两种音频接口,配合pdma做内存拷贝,支持数字麦(pdm/i2s)和模拟audio codec(i2s)声源输入,内置模拟audio codec,支持对音频数据进行声音质量增强(VQE)处理:3A(AEC回声消除、ANR降噪、AGC自动增益)。音频输出模块支持i2s音频接口,配合pdma做内存拷贝,可外接数据喇叭或模拟audio codec作为声音输出。音频编码和解码模块暂支持对 G711格式的音频编解码功能,并支持外部编解码器的注册。
将音频模块拆分成多个子模块,模块间以低耦合的方式实现数据流的互传,这样的设计足以满足MAIX3下现有的多媒体业务。下图仅以语音对讲业务场景下音频模块使用方式来做分析。通过音频输入模块将采集到的音频数据通过音频编码模块编码后通过网络发送到远端,从远端获取到的音频编码数据经过音频解码模块解码后经音频输出模块即可播放远端声音。
1.2 功能描述
1.2.1 音频输入
音频输入模块(AI)主要实现配置及启用音频输入设备、获取音频帧数据等功能。
音频输入模块支持I2s和pdm协议接口。i2s 支持同时采集最多2路双声道音频,pdm支持同时采集最多8路单声道音频。详细的i2s、pdm特性如下:
-
I2s音频接口
-
数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度支持16/24/32bit。
-
支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
-
-
pdm音频接口
-
支持PDM音频输入,1bit位宽,采样时钟频率为0.256MHz/0.384MHz/0.512MHz/0.768MHz/1.024MHz/1.4112MHz/1.536MHz/2.048MHz/2.8224MHz/3.072MHz/4.096MHz/5.6448MHz/6.144MHz/12.288MHz/24.576MHz,输入的PCM音频采样率为8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz。采样精度支持16/24/32bit.
-
支持过采样率128、64、32倍过采样。
-
支持1-4个IO用于输入PDM音频数据。
-
输入支持可配置1-8个PDM声道,支持PDM左右单声道模式和双声道模式,各IO声道模式统一,PDM双声道模式最多使用4个IO
-
使能的声道序号从小到大并且连续,不支持各声道随机使能
-
1.2.2 音频输出
音频输出(AO)主要实现启用音频输出设备、发送音频帧到输出通道等功能。
音频输出模块支 持I2s协议接口。i2s 支持同时输出最多2路双声道音频。
-
i2s音频接口
-
数据采样率支持8kHz/12kHz/16kHz/24kHz/32kHz/44.1kHz/48kHz/96kHz/192kHz,采样精度16/24/32bit。
-
支持2组可配置IO用于输入/输出I2S音频数据,支持全双工模式。
-
1.2.3 音频链路
-
audio codec从模拟麦克风接收到的信号,转变为I2S格式的PCM数据后,输入到audio中的I2S中;I2S输出的PCM数据,经过audio codec后,变为模拟信号发出,该模式不使用数字IO,固定使用I2S的sdi0和sdo0接口。
-
I2S的直接与片外的数字麦克风和PA连接。共有两组接口可以选择:sdi0、sdo0及sdi1、sdo1。
-
片外的PDM麦克风,输入最多8路PDM数据到audio的4个输入数据接口。
可供选择得链路包括:
-
3组pdm_in + 1组i2s_in + 2组i2s out,其中1组i2s_in可以使用内置audio codec或片外
-
4组pdm_in + 2组i2s out
-
2组i2s_in + 2组 pdm_in + 2组i2s out
可以使用内置codec或外接设备(音频子板)来测试音频相关功能。使用内置codec可以测试一组I2S音频输入和输出及audio codec相关功能,使用音频子板可以测试2组i2s音频输入输出和4组pdm音频输入功能。
1.2.4 声音质量增强
音频模块支持对音频数据进行声音质量增强处理,实现音频3A功能。目前支持的采样精度为16bit,支持的采样率为16k。
2. API 参考
2.1 音频输入
该功能模块提供以下API:
- kd_mpi_ai_set_pub_attr
- kd_mpi_ai_get_pub_attr
- kd_mpi_ai_enable
- kd_mpi_ai_disable
- kd_mpi_ai_enable_chn
- kd_mpi_ai_disable_chn
- kd_mpi_ai_get_frame
- kd_mpi_ai_release_frame
- kd_mpi_ai_set_vqe_attr
- kd_mpi_ai_get_vqe_attr
2.1.1 kd_mpi_ai_set_pub_attr
【描述】
设置AI设备属性。
【语法】
k_s32 kd_mpi_ai_set_pub_attr(k_audio_dev ai_dev, const k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
attr | AI设备属性指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
【注意】
无
【举例】
k_aio_dev_attr aio_dev_attr;
aio_dev_attr.audio_type = KD_AUDIO_INPUT_TYPE_I2S;
aio_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 44100;
aio_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_16
aio_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
aio_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_STANDARD_MODE;
aio_dev_attr.kd_audio_attr.i2s_attr.frame_num = 25;
aio_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 44100/25;
aio_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_INNERCODEC;
if (K_SUCCESS != kd_mpi_ai_set_pub_attr(0, &aio_dev_attr))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable(0))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable_chn(0, 0))
{
printf("kd_mpi_ai_set_pub_attr failed\n");
return K_FAILED;
}
2.1.2 kd_mpi_ai_get_pub_attr
【描述】
获取AI设备属性。
【语法】
k_s32 kd_mpi_ai_get_pub_attr(k_audio_dev ai_dev, k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
attr | AI设备属性指针。 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.3 kd_mpi_ai_enable
【描述】
使能ai设备。
【语法】
k_s32 kd_mpi_ai_enable(k_audio_dev ai_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.4 kd_mpi_ai_disable
【描述】
禁用ai设备。
【语法】
k_s32 kd_mpi_ai_disable(k_audio_dev ai_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.5 kd_mpi_ai_enable_chn
【描述】
使能ai通道。
【语法】
k_s32 kd_mpi_ai_enable_chn(k_audio_dev ai_dev,k_ai_chn ai_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.6 kd_mpi_ai_disable_chn
【描述】
禁用ai通道。
【语法】
k_s32 kd_mpi_ai_disable_chn(k_audio_dev ai_dev,k_ai_chn ai_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.7 kd_mpi_ai_get_frame
【描述】
获取音频帧。
【语法】
k_s32 kd_mpi_ai_get_frame(k_audio_dev ai_dev,k_ai_chn ai_chn,k_audio_frame*frame, k_u32 milli_sec);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
frame | 音频帧数据。 | 输出 |
milli_sec | 获取数据的超时时间。 -1表示阻塞模式,无数据时一直等待; 0表示非阻塞模式,无数据时则报错返回; >0表示阻塞milli_sec毫秒,超时则报错返回。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
【注意】
- milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非
阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。
- 获取音频帧数据前,必须先使能对应的AI通道。
【举例】
k_audio_frame audio_frame;
while(true)
{
//get frame
if (K_SUCCESS != kd_mpi_ai_get_frame(dev_num, channel, &audio_frame, 1000))
{
printf("=========kd_mpi_ai_get_frame timeout\n");
continue ;
}
//process frame
process_frame(&audio_frame);
//release frame
kd_mpi_ai_release_frame(dev_num, channel, &audio_frame);
}
2.1.8 kd_mpi_ai_release_frame
【描述】
释放音频帧。
【语法】
k_s32 kd_mpi_ai_release_frame(k_audio_dev ai_dev,k_ai_chn ai_chn,const k_audio_frame *frame);【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
frame | 音频帧数据。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.1.9 kd_mpi_ai_set_vqe_attr
【描述】
设置AI的声音质量增强功能相关属性。
【语法】
k_s32 kd_mpi_ai_set_vqe_attr(k_audio_dev ai_dev, k_ai_chn ai_chn, const k_bool *vqe_enable);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
vqe_enable | 声音质量增强使能标志位。 K_TRUE:使能。 K_FALSE:不使能。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
库文件:libai.a
【注意】
目前支持的采样精度为16bit,支持的采样率为8k和16k。
2.1.10 kd_mpi_ai_get_vqe_attr
【描述】
获取AI的声音质量增强功能相关属性。
【语法】
k_s32 kd_mpi_ai_get_vqe_attr(k_audio_dev ai_dev, k_ai_chn ai_chn, k_bool *vqe_enable);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ai_dev | 音频设备号。 | 输入 |
ai_chn | 音频通道号。 | 输入 |
vqe_enable | 声音质量增强使能标志位指针。 K_TRUE:使能。 K_FALSE:不使能。 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
2.2 音频输出
该功能模块提供以下API:
- kd_mpi_ao_set_pub_attr
- kd_mpi_ao_get_pub_attr
- kd_mpi_ao_enable
- kd_mpi_ao_disable
- kd_mpi_ao_enable_chn
- kd_mpi_ao_disable_chn
- kd_mpi_ao_send_frame
2.2.1 kd_mpi_ao_set_pub_attr
【描述】
设置AO设备属性。
【语法】
k_s32 kd_mpi_ao_set_pub_attr(k_audio_dev ao_dev, const k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
attr | AO设备属性指针。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
【注意】
无
【举例】
k_aio_dev_attr ao_dev_attr;
ao_dev_attr.audio_type = KD_AUDIO_OUTPUT_TYPE_I2S;
ao_dev_attr.kd_audio_attr.i2s_attr.sample_rate = 48000;
ao_dev_attr.kd_audio_attr.i2s_attr.bit_width = KD_AUDIO_BIT_WIDTH_24;
ao_dev_attr.kd_audio_attr.i2s_attr.chn_cnt = 2;
ao_dev_attr.kd_audio_attr.i2s_attr.i2s_mode = K_RIGHT_JUSTIFYING_MODE;
ao_dev_attr.kd_audio_attr.i2s_attr.frame_num = 15;
ao_dev_attr.kd_audio_attr.i2s_attr.point_num_per_frame = 48000/25;
ao_dev_attr.kd_audio_attr.i2s_attr.i2s_type = K_AIO_I2STYPE_EXTERN;
if (K_SUCCESS != kd_mpi_ao_set_pub_attr(0, &ao_dev_attr))
{
printf("kd_mpi_ao_set_pub_attr failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable(0))
{
printf("kd_mpi_ai_enable failed\n");
return K_FAILED;
}
if (K_SUCCESS != kd_mpi_ai_enable_chn(0,1))
{
printf("kd_mpi_ai_enable_chn failed\n");
return K_FAILED;
}
2.2.2 kd_mpi_ao_get_pub_attr
【描述】
获取AO设备属性。
【语法】
k_s32 kd_mpi_ao_get_pub_attr(k_audio_dev ao_dev, k_aio_dev_attr *attr);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
attr | AO设备属性指针。 | 输出 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.3 kd_mpi_ao_enable
【描述】
使能ao设备。
【语法】
k_s32 kd_mpi_ao_enable(k_audio_dev ao_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.4 kd_mpi_ao_disable
【描述】
禁用ao设备。
【语法】
k_s32 kd_mpi_ao_disable(k_audio_dev ao_dev);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.5 kd_mpi_ao_enable_chn
【描述】
使能ao通道。
【语法】
k_s32 kd_mpi_ao_enable_chn(k_audio_dev ao_dev,k_ao_chn ao_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
ao_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.6 kd_mpi_ao_disable_chn
【描述】
禁用ao通道。
【语法】
k_s32 kd_mpi_ao_disable_chn(k_audio_dev ao_dev,k_ao_chn ao_chn);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
ao_chn | 音频通道号。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ao_api.h
- 库文件:libao.a
2.2.7 kd_mpi_ao_send_frame
【描述】
发送ao帧数据。
【语法】
k_s32 kd_mpi_ao_send_frame
(k_audio_dev ao_dev,k_ao_chn ao_chn,const k_audio_frame*frame,k_s32 milli_sec);
【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
ao_dev | 音频设备号。 | 输入 |
ao_chn | 音频通道号。 | 输入 |
frame | 音频帧数据指针。 | 输入 |
milli_sec | 发送数据的超时时间。 -1表示阻塞模式,无数据时一直等待; 0表示非阻塞模式,无数据时则报错返回; >0表示阻塞milli_sec毫秒,超时则报错返回。 | 输入 |
【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_ai_api.h
- 库文件:libai.a
【注意】
- milli_sec的值必须大于等于-1,等于-1时采用阻塞模式获取数据,等于0时采用非
阻塞模式获取数据,大于0时,阻塞milli_sec毫秒后,没有数据则返回超时并报错。
- 发送音频帧数据前,必须先使能对应的AO通道。
【举例】
k_audio_frame audio_frame;
k_s32 ret = 0;
while (true)
{
//get ai frame
ret = kd_mpi_ai_get_frame(0, 0, &audio_frame, 1000);
if (K_SUCCESS != ret)
{
printf("=========kd_mpi_ai_get_frame timeout\n");
continue ;
}
//send ai frame to ao
ret = kd_mpi_ao_send_frame(0, 1, &audio_frame, 0);
if (K_SUCCESS != ret)
{
printf("=======kd_mpi_ao_send_frame failed\n");
}
//release ai frame
kd_mpi_ai_release_frame(0, 0, &audio_frame);
}
2.3 音频编码
音频编码主要实现创建编码通道、发送音频帧编码及获取编码码流等功能。音频编码部分,提供g711a/u编码,暂只支持16bit采样精度。
该功能模块提供以下API:
- kd_mpi_aenc_register_encoder:注册编码器。
- kd_mpi_aenc_unregister_encoder:注销编码器。
- kd_mpi_aenc_create_chn:创建编码通道
- kd_mpi_aenc_destroy_chn:销毁编码通道
- kd_mpi_aenc_send_frame:发送音频编码音频帧
- kd_mpi_aenc_get_stream:获取音频编码码流
- kd_mpi_aenc_release_stream:释放音频编码码流
2.3.1 kd_mpi_aenc_register_encoder
- 【描述】
注册编码器。
- 【语法】
k_s32 kd_mpi_aenc_register_encoder(k_s32 *handle, const k_aenc_encoder *encoder);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
handle | 注册句柄。 | 输出 |
encoder | 编码器属性结构体。 | 输入 |
- 【说明】
用户通过传入编码器属性结构体,向 AENC 模块注册一个编码器,并返回注册句
柄,用户可以最后通过注册句柄来注销该编码器。
AENC 模块最大可注册 20 个编码器,且自身已注册 G711.a、G711.u
两个编码器。
同一种编码协议不允许重复注册编码器,例如假如已注册 G711 编码器,不允许另
外再注册一个 G711 编码器
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.2 kd_mpi_aenc_unregister_encoder
- 【描述】
注销编码器。
- 【语法】
k_s32 kd_mpi_aenc_unregister_encoder(k_s32 handle);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
handle | 注销句柄。 | 输入 |
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.3 kd_mpi_aenc_create_chn
- 【描述】
创建音频编码通道。
- 【语法】
k_s32 kd_mpi_aenc_create_chn(k_aenc_chn aenc_chn, const k_aenc_chn_attr *attr);
参数名称 | 描述 | 输入/输出 |
---|---|---|
aenc_chn | 通道号。 取值范围: [0, AENC_MAX_CHN_NUM)。 | 输入 |
attr | 音频编码通道属性指针。 | 输入 |
- 【说明】
buffer 大小以帧为单位,取值范围是[2, K_MAX_AUDIO_FRAME_NUM,建议配置 为 10 以上,过小的 buffer 配置可能导致丢帧等异常。每个编码通道都会根据buffer大小来配置队列大小,用以缓存编码帧数据。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.4 kd_mpi_aenc_destroy_chn
- 【描述】
销毁音频编码通道。
- 【语法】
k_s32 kd_mpi_aenc_destroy_chn(k_aenc_chn aenc_chn);
参数名称 | 描述 | 输入/输出 |
---|---|---|
aenc_chn | 通道号。 取值范围: [0, AENC_MAX_CHN_NUM)。 | 输入 |
- 【说明】
无
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.5 kd_mpi_aenc_send_frame
- 【描述】
发送音频编码帧。
- 【语法】
k_s32 kd_mpi_aenc_send_frame(k_aenc_chn aenc_chn,const k_audio_frame *frame);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 输入 | 输入 |
frame | 音频帧结构体指针。 | 输入 |
- 【说明】
音频编码发送码流是非阻塞接口,如果音频码流缓存满,则直接返回失败。该接口用于用户主动发送音频帧进行编码,如果 AENC 通道已经通过系统绑定接口与 AI 绑定,不需要也不建议调此接口。调用该接口发送音频编码音频帧时,必须先创建对应的编码通道。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.6 kd_mpi_aenc_get_stream
- 【描述】
获取音频编码码流。
- 【语法】
k_s32 kd_mpi_aenc_get_stream(k_aenc_chn aenc_chn, k_audio_stream *stream, k_s32 milli_sec);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 | 输入 |
stream | 获取的音频码流。 | 输出 |
milli_sec | 获取数据的超时时间 -1 表示阻塞模式,无数据时一直等待; 0 表示非阻塞模式,无数据时则报错返回; >0 表示阻塞 s32MilliSec 毫秒,超时则报错返回。 | 输入 |
- 【说明】
必须创建通道后才可能获取码流,否则直接返回失败,如果在获取码流过程中销
毁通道则会立刻返回失败。
s32MilliSec 的值必须大于等于-1,等于-1 时采用阻塞模式获取数据,等于 0 时采
用非阻塞模式获取数据,大于 0 时,阻塞 s32MilliSec 毫秒后,没有数据则返回超
时并报错。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.3.7 kd_mpi_aenc_release_stream
- 【描述】
释放音频编码码流。
- 【语法】
k_s32 kd_mpi_aenc_release_stream(k_aenc_chn aenc_chn, const k_audio_stream *stream);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
aenc_chn | 通道号。 取值范围:[0, AENC_MAX_CHN_NUM)。 | 输入 |
stream | 获取的音频码流。 | 输出 |
- 【说明】
无
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
- 头文件:mpi_aenc_api.h
- 库文件:libaenc.a
2.4 音频解码
音频解码主要实现解码通道、发送音频码流解码及获取解码后音频帧等功能。
音频编解码部分,提供g711a/u解码,暂支持16bit采样精度。
该功能模块提供以下API:
- kd_mpi_adec_register_decoder:注册解码器
- kd_mpi_adec_unregister_decoder:注销解码器
- kd_mpi_adec_create_chn:创建音频解码通道
- kd_mpi_adec_destroy_chn:销毁音频解码通道
- kd_mpi_adec_send_stream:发送音频码流到音频解码通道
- kd_mpi_adec_clr_chn_buf:清除 ADEC 通道中当前的音频数据缓存。
- kd_mpi_adec_get_frame:获取音频解码帧数据
- kd_mpi_adec_release_frame:释放音频解码帧数据
2.4.1 kd_mpi_adec_register_decoder
- 【描述】
注册解码器。
- 【语法】
k_s32 kd_mpi_adec_register_decoder(k_s32 *handle, const k_adec_decoder *decoder);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
handle | 注册句柄。 | 输出 |
decoder | 解码器属性结构体。 | 输入 |
- 【说明】
用户通过传入解码器属性结构体,向 ADEC 模块注册一个解码器,并返回注册句柄,用户可以最后通过注册句柄来注销该解码器。 ADEC 模块最大可注册 20 个解码器,且自身已注册 G711a、G711u两个解码器。 同一种解码协议不允许重复注册解码器,例如假如已注册 G711 解码器,不允许另外再注册一个 G711 解码器。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.4.2 kd_mpi_adec_unregister_decoder
- 【描述】
注销解码器。
- 【语法】
k_s32 kd_mpi_adec_unregister_decoder(k_s32 handle);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
handle | 注销句柄。 | 输入 |
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
- 头文件:mpi_adec_api.h
- 库文件:libadec.a
2.4.3 kd_mpi_adec_create_chn
- 【描述】
创建音频解码通道。
- 【语法】
k_s32 kd_mpi_adec_create_chn(k_adec_chn adec_chn, const k_adec_chn_attr *attr);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 通道号。 取值范围:[0, ADEC_MAX_CHN_NUM)。 | 输入 |
attr | 通道属性指针。 | 输入 |
- 【说明】
协议类型指定了该通道的解码协议,目前支持 G711。音频解码的部分属性需要与输出设备属性相匹配,例如采样率、帧长(每帧采样点数目)等。 buffer 大小以帧为单位,取值范围是[2, K_MAX_AUDIO_FRAME_NUM,建议配置为 10 以上,过小的 buffer 配置可能导致丢帧等异常。 在通道未创建前(或销毁后)才能使用此接口,如果通道已经被创建,则返回通道已经 创建。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.4.4 kd_mpi_adec_destroy_chn
- 【描述】
销毁音频解码通道。
- 【语法】
k_s32 kd_mpi_adec_destroy_chn(k_adec_chn adec_chn);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 通道号。 取值范围: [0, ADEC_MAX_CHN_NUM)。 | 输入 |
- 【说明】
无
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
- 头文件:mpi_adec_api.h
- 库文件:libadec.a
2.4.5 kd_mpi_adec_send_stream
- 【描述】
发送音频码流到音频解码通道。
- 【语法】
k_s32 kd_mpi_adec_send_stream(k_adec_chn adec_chn,const k_audio_stream *stream,k_bool block);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 通道号。 取值范围:[0, ADEC_MAX_CHN_NUM)。 | 输入 |
stream | 音频码流。 | 输入 |
block | 阻塞标识。 HI_TRUE:阻塞。 HI_FALSE:非阻塞。 | 输入 |
- 【说明】
发送数据时必须保证通道已经被创建,否则直接返回失败,如果在送数据过程中 销毁通道则会立刻返回失败。 支持阻塞或非阻塞方式发送码流。 当阻塞方式发送码流时,如果用于缓存解码后的音频帧的 Buffer 满,则此接口调用会被阻塞,直至解码后的音频帧数据被取走,或 ADEC 通道被销毁。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.4.6 kd_mpi_adec_clr_chn_buf
- 【描述】
清除ADEC通道中当前的音频数据缓存。
- 【语法】
k_s32 kd_mpi_adec_clr_chn_buf(k_adec_chn adec_chn);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 通道号。 取值范围: [0, ADEC_MAX_CHN_NUM)。 | 输入 |
- 【说明】
要求解码通道已经被创建,如果通道未被创建则返回通道不存在错误码。
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.4.7 kd_mpi_adec_get_frame
- 【描述】
获取音频解码帧数据。
- 【语法】
k_s32 kd_mpi_adec_get_frame(k_adec_chn adec_chn, k_audio_frame *frame, k_s32 milli_sec);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 音频解码通道。 | 输入 |
frame_info | 音频帧数据结构体 输出 | 输出 |
block | 是否以阻塞方式获取 | 输入 |
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.4.8 kd_mpi_adec_release_frame
- 【 描述】
释放获取到的音频解码帧数据。
- 【语法】
k_s32 kd_mpi_adec_release_frame(k_adec_chn adec_chn, const k_audio_frame *frame);
- 【参数】
参数名称 | 描述 | 输入/输出 |
---|---|---|
adec_chn | 音频解码通道。 | 输入 |
frame_info | 音频帧数据结构体 输出 | 输入 |
- 【返回值】
返回值 | 描述 |
---|---|
0 | 成功 |
非0 | 失败,其值参见错误码 |
- 【需求】
头文件:mpi_adec_api.h
库文件:libadec.a
2.5 内置Audio Codec
内置Audio Codec主要通过ioctl提供对硬件设备的操作。在提供的ioctl的cmd中,有些
cmd用户可以不需要调用,直接使用模块加载时的默认值即可。ioctl调用实现的是对内置Audio Codec寄存器的读写。
当前版本对audio codec的控制操作主要包含:adc数字和模拟音量,dac数字/模拟音量,adc/dac静音控制。其中采样率,采样精度,i2s对齐模式这些控制操作由用户通过调用ai和ao的api接口内核自动完成(内核代码自动实现对codec硬件设备操作),不再提供ioctl接口来控制。
内置 Audio Codec 标准功能 cmd:
- k_acodec_set_gain_micl:左声道输入模拟增益控制
- k_acodec_set_gain_micr:右声道输 入模拟增益控制
- k_acodec_set_adcl_volume:左声道输入数字音量控制
- k_acodec_set_adcr_volume:右声道输入数字音量控制
- k_acodec_set_alc_gain_micl:alc左声道输入的模拟增益控制
- k_acodec_set_alc_gain_micr:alc右声道输入的模拟增益控制
- k_acodec_set_gain_hpoutl:左声道输出模拟音量控制
- k_acodec_set_gain_hpoutr:右声道输出模拟音量控制
- k_acodec_set_dacl_volume:左声道输出数字音量控制
- k_acodec_set_dacr_volume:右声道输出数字音量控制
- k_acodec_set_micl_mute:左声道输入静音控制
- k_acodec_set_micr_mute:右声道输入静音控制
- k_acodec_set_dacl_mute:左声道输出静音控制
- k_acodec_set_dacr_mute:右声道输出静音控制
- k_acodec_get_gain_micl:获取左声道输入模拟增益值
- k_acodec_get_gain_micr:获取右声道输入模拟增益值
- k_acodec_get_adcl_volume:获取左声道输入数字音量值
- k_acodec_get_adcr_volume:获取右声道输入数字音量值
- k_acodec_get_alc_gain_micl:获取alc左声道输入的模拟增益值
- k_acodec_get_alc_gain_micr