跳转至

ADEC(音频解码)接口说明文档

文档版本 V1.1
修订日期 2026-08-21
代码基线 hi_aiot_solution 8.18
对应头文件 components/media/pipeline/include/hi_mapi_adec.h
类型定义 components/media/pipeline/include/hi_mapi_adec_define.hinclude/adapt/*_adapt_define.h
适用模块 ADEC / HI3516CV610

1 概述

ADEC(Audio Decoder)模块将压缩音频码流(AAC / G.711 / MP3 / LPCM / OPUS)解码为 PCM 原始帧输出。ADEC 最多支持 4 个通道(通道号 0~3),底层解码器按格式引用计数在全局共享。ADEC 既可以绑定到 AO 自动播放,也可以在解绑定模式下由用户通过 hi_mapi_adec_send_stream / hi_mapi_adec_get_frame 主动喂码、取 PCM。

2 接口总览

编号 接口 功能概述
1 hi_mapi_adec_init 初始化音频解码通道,注册对应格式的解码器并创建底层通道。
2 hi_mapi_adec_deinit 反初始化音频解码通道,销毁底层通道并按引用计数注销解码器。所有通道都被反初始化后,内部模块上下文也会被复位。
3 hi_mapi_adec_send_stream 向解码通道送入一帧压缩码流。
4 hi_mapi_adec_get_frame 从解码通道取出一帧解码后的 PCM 音频数据。
5 hi_mapi_adec_release_frame 释放由 hi_mapi_adec_get_frame 获取的 PCM 帧资源。
6 hi_mapi_adec_send_end_of_stream 向解码通道发送流结束标记,通知解码器刷新内部缓冲。
7 hi_mapi_adec_get_default_attr 按解码格式返回推荐的默认 ADEC 属性(自动填充 adec_mode:LPCM 使用 PACK 模式,其他格式使用 STREAM 模式)。
8 hi_mapi_adec_set_param 设置 ADEC 扩展参数(命令分发接口)。以 _CONFIG 结尾的命令必须在首次调用 hi_mapi_adec_send_stream 之前设置,否则返回状态错误。
9 hi_mapi_adec_get_param 读取 ADEC 扩展参数的当前值。

3 API 参考

1 hi_mapi_adec_init

【描述】 初始化音频解码通道,注册对应格式的解码器并创建底层通道。

【语法】

td_s32 hi_mapi_adec_init(td_handle adec_hdl, const hi_mapi_adec_attr *adec_attr);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3(HI3516CV610 上 HI_MAPI_ADEC_CHN_MAX_NUM = 4)。
adec_attr 输入 const hi_mapi_adec_attr * 解码通道属性指针,不能为 TD_NULL
成员名称 描述
adec_format 解码格式,枚举 hi_mapi_audio_format
adec_mode 解码模式,枚举 hi_mapi_adec_modeHI_MAPI_ADEC_MODE_PACK(要求输入为完整解码包)或 HI_MAPI_ADEC_MODE_STREAM(流式输入,性能较低)。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围(≥4)。
HI_MAPI_ADEC_ENULLPTR adec_attrTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。
HI_MAPI_ADEC_EILLPARAM 解码格式不支持;或 OPUS / MP3 未编入固件。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 同一通道重复调用 init 时,若通道已初始化则直接返回成功(幂等)。
  • init 内部会自动注册对应格式的解码器(按格式引用计数),用户无需手动注册。
  • initpayload_format 默认置为 HI_MAPI_AUDIO_PAYLOAD_HI_NATIVEstream_started 标志复位。

【举例】 参见【相关主题】中 SAMPLE_AUDIO_BindAdecAndStartAo

【相关主题】 hi_mapi_adec_get_default_attrhi_mapi_adec_deinit

2 hi_mapi_adec_deinit

【描述】 反初始化音频解码通道,销毁底层通道并按引用计数注销解码器。所有通道都被反初始化后,内部模块上下文也会被复位。

【语法】

td_s32 hi_mapi_adec_deinit(td_handle adec_hdl);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 若通道已经反初始化,则直接返回成功(幂等)。
  • 反初始化不会自动解绑;若通道已绑定 AO,请先调用 hi_mapi_sys_unbind

【举例】 参见【相关主题】中 SAMPLE_AUDIO_UnBindAdecAndStopAo

【相关主题】 hi_mapi_adec_init

3 hi_mapi_adec_send_stream

【描述】 向解码通道送入一帧压缩码流。

【语法】

td_s32 hi_mapi_adec_send_stream(td_handle adec_hdl, const hi_mapi_audio_stream *adec_stream, td_bool block);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3。
adec_stream 输入 const hi_mapi_audio_stream * 码流结构体指针,不能为 TD_NULL,其成员 stream(虚拟地址)也不能为 TD_NULL
block 输入 td_bool TD_TRUE 阻塞发送(直到有可用缓冲);TD_FALSE 非阻塞(缓冲满则立即返回)。
成员名称(hi_mapi_audio_stream 描述
stream 码流虚拟地址。
phy_addr 码流物理地址(可选)。
len 码流字节长度。
time_stamp 时间戳。
seq 帧序号,若为非有效帧则为 0。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENULLPTR adec_streamadec_stream->streamTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。
HI_MAPI_ADEC_ESTATEERR 通道尚未 init
HI_MAPI_ADEC_ERR_BUF_FULL 非阻塞模式下缓冲区已满。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 第一次调用 send_stream 时,内部会把 stream_started 标志置为 TD_TRUE,此后 hi_mapi_adec_set_param 中所有 _CONFIG 命令都会被拒绝。
  • OPUS 码流若采用 HI_MAPI_AUDIO_PAYLOAD_STANDARD(裸 RTP),适配层会自动为其补上 8 字节大端长度头再送入 SDK 解码器。

【举例】 无

【相关主题】 hi_mapi_adec_get_framehi_mapi_adec_set_param

4 hi_mapi_adec_get_frame

【描述】 从解码通道取出一帧解码后的 PCM 音频数据。

【语法】

td_s32 hi_mapi_adec_get_frame(td_handle adec_hdl, hi_mapi_audio_frame_info *audio_frame_info, td_bool block);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3。
audio_frame_info 输出 hi_mapi_audio_frame_info * 输出帧信息结构指针,不能为 TD_NULL
block 输入 td_bool TD_TRUE 阻塞获取;TD_FALSE 非阻塞。
成员名称(hi_mapi_audio_frame_info 描述
frame 输出:指向获取到的 hi_mapi_audio_frame 的指针,可用于传递给 hi_mapi_adec_release_frame
audio_frame 获取到的音频帧内容。
index 帧序号,释放时用作唯一标识。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENULLPTR audio_frame_infoTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。
HI_MAPI_ADEC_ESTATEERR 通道尚未 init

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 取到的帧必须通过 hi_mapi_adec_release_frame 释放,否则会泄漏内部缓冲。

【举例】 无

【相关主题】 hi_mapi_adec_release_framehi_mapi_adec_send_stream

5 hi_mapi_adec_release_frame

【描述】 释放由 hi_mapi_adec_get_frame 获取的 PCM 帧资源。

【语法】

td_s32 hi_mapi_adec_release_frame(td_handle adec_hdl, const hi_mapi_audio_frame_info *audio_frame_info);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3。
audio_frame_info 输入 const hi_mapi_audio_frame_info * 待释放帧信息指针,不能为 TD_NULL;其成员 frame 也不能为 TD_NULL

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENULLPTR audio_frame_infoaudio_frame_info->frameTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。
HI_MAPI_ADEC_ESTATEERR 通道尚未 init

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 必须与 hi_mapi_adec_get_frame 配对使用。

【举例】 无

【相关主题】 hi_mapi_adec_get_frame

6 hi_mapi_adec_send_end_of_stream

【描述】 向解码通道发送流结束标记,通知解码器刷新内部缓冲。

【语法】

td_s32 hi_mapi_adec_send_end_of_stream(td_handle adec_hdl);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENOTINITED MAPI 媒体子系统未初始化。
HI_MAPI_ADEC_ESTATEERR 通道尚未 init

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】 无

【举例】 无

【相关主题】 hi_mapi_adec_send_stream

7 hi_mapi_adec_get_default_attr

【描述】 按解码格式返回推荐的默认 ADEC 属性(自动填充 adec_mode:LPCM 使用 PACK 模式,其他格式使用 STREAM 模式)。

【语法】

td_s32 hi_mapi_adec_get_default_attr(hi_mapi_audio_format adec_format, hi_mapi_adec_attr *adec_attr);

【参数】

参数名称 输入/输出 类型 描述
adec_format 输入 hi_mapi_audio_format 解码格式。
adec_attr 输出 hi_mapi_adec_attr * 被填充后的默认属性,不能为 TD_NULL

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_ENULLPTR adec_attrTD_NULL
HI_MAPI_ADEC_EILLPARAM adec_format 越界(<0 或 ≥HI_MAPI_AUDIO_FORMAT_BUTT)。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • 默认模式规则:LPCMHI_MAPI_ADEC_MODE_PACK;其他格式 → HI_MAPI_ADEC_MODE_STREAM
  • 用户可在获取默认值后按需覆盖 adec_mode 字段。

【举例】 参见【相关主题】中 SAMPLE_AUDIO_BindAdecAndStartAo

【相关主题】 hi_mapi_adec_init

8 hi_mapi_adec_set_param

【描述】 设置 ADEC 扩展参数(命令分发接口)。以 _CONFIG 结尾的命令必须在首次调用 hi_mapi_adec_send_stream 之前设置,否则返回状态错误。

【语法】

td_s32 hi_mapi_adec_set_param(td_handle adec_hdl, hi_mapi_adec_cmd cmd,
                              const td_void *attr, td_u32 attr_len);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3,必须已 init
cmd 输入 hi_mapi_adec_cmd 扩展命令 ID,当前仅支持 HI_MAPI_ADEC_CMD_PAYLOAD_FORMAT_CONFIG(仅 OPUS 有效)。
attr 输入 const td_void * 命令对应属性结构指针,不能为 TD_NULL;对 PAYLOAD_FORMAT_CONFIGhi_mapi_audio_payload_format
attr_len 输入 td_u32 缓冲字节长度,必须 ≥ sizeof(hi_mapi_audio_payload_format)

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENULLPTR attrTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 未初始化。
HI_MAPI_ADEC_ESTATEERR 通道未 init;或对 _CONFIG 命令,通道已开始送流。
HI_MAPI_ADEC_EILLPARAM cmd 未知;或 attr_len 过小;或用于非 OPUS 格式;或 payload_format 越界。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】

  • HI_MAPI_ADEC_CMD_PAYLOAD_FORMAT_CONFIG:设置输入 OPUS 码流的封装格式。HI_MAPI_AUDIO_PAYLOAD_HI_NATIVE(默认,调用方已在每帧前带 8 字节大端长度头);HI_MAPI_AUDIO_PAYLOAD_STANDARD(裸 RTP 载荷,由适配层补齐长度头再送入 SDK 解码器)。
  • 在首次 hi_mapi_adec_send_stream 之后调用 _CONFIG 命令将返回 HI_MAPI_ADEC_ESTATEERR

【举例】 参见【相关主题】中 SAMPLE_AUDIO_BindAdecAndStartAo 的 OPUS 分支。

【相关主题】 hi_mapi_adec_get_paramhi_mapi_adec_send_stream

9 hi_mapi_adec_get_param

【描述】 读取 ADEC 扩展参数的当前值。

【语法】

td_s32 hi_mapi_adec_get_param(td_handle adec_hdl, hi_mapi_adec_cmd cmd,
                              td_void *attr, td_u32 attr_len);

【参数】

参数名称 输入/输出 类型 描述
adec_hdl 输入 td_handle 音频解码通道句柄,取值范围:0~3,必须已 init
cmd 输入 hi_mapi_adec_cmd 扩展命令 ID,当前仅支持 HI_MAPI_ADEC_CMD_PAYLOAD_FORMAT_CONFIG
attr 输出 td_void * 接收属性值的用户缓冲区,不能为 TD_NULL
attr_len 输入 td_u32 缓冲字节长度,必须 ≥ 对应结构体大小。

【返回值】

返回值 描述
0 成功。
非0 失败,其值为错误码。
HI_MAPI_ADEC_EINVALIDHDL adec_hdl 超出范围。
HI_MAPI_ADEC_ENULLPTR attrTD_NULL
HI_MAPI_ADEC_ENOTINITED MAPI 未初始化。
HI_MAPI_ADEC_ESTATEERR 通道未 init
HI_MAPI_ADEC_EILLPARAM cmd 未知;或 attr_len 过小。

【需求】

  • 头文件:hi_mapi_adec.h
  • 库文件:libhi_mapi.so

【注意】 无

【举例】 参见【相关主题】中 SAMPLE_AUDIO_BindAdecAndStartAo 的 OPUS 分支。

【相关主题】 hi_mapi_adec_set_param

4 数据类型

1 hi_mapi_adec_mode

【说明】 定义 ADEC 解码模式枚举,区分按帧(PACK)模式与按流(STREAM)模式。

【定义】

typedef enum {
    HI_MAPI_ADEC_MODE_PACK = 0,
    HI_MAPI_ADEC_MODE_STREAM,
    HI_MAPI_ADEC_MODE_BUTT
} hi_mapi_adec_mode;

【成员】

成员名称 描述
HI_MAPI_ADEC_MODE_PACK 按帧模式:要求输入为有效的解码帧(如 AENC 输出的完整帧、文件中已知帧长的码流)。高性能模式。
HI_MAPI_ADEC_MODE_STREAM 按流模式:输入为连续码流,不要求帧边界对齐。低性能模式,适用于无法确定帧边界的场景。
HI_MAPI_ADEC_MODE_BUTT 哨兵值。

【注意事项】

  • LPCM 格式推荐使用 PACK 模式。
  • 可通过 hi_mapi_adec_get_default_attr 获取默认模式。

【相关数据类型及接口】 hi_mapi_adec_attrhi_mapi_adec_get_default_attr

2 hi_mapi_adec_attr

【说明】 定义 ADEC 音频解码器初始化属性结构,包含解码格式与解码模式。

【定义】

typedef struct {
    hi_mapi_audio_format          adec_format;
    hi_mapi_adec_mode             adec_mode;
} hi_mapi_adec_attr;

【成员】

成员名称 描述
adec_format 音频解码格式,参见 hi_mapi_audio_format公共数据类型)。
adec_mode 解码模式,参见 hi_mapi_adec_mode

【注意事项】

  • CV610 平台 ADEC 最大通道数为 8(OT_ADEC_MAX_CHN_NUM = 8)。
  • 可通过 hi_mapi_adec_get_default_attr 获取默认属性,自动填充 adec_mode(LPCM 使用 PACK 模式,其他格式使用 STREAM 模式)。

【相关数据类型及接口】 hi_mapi_adec_inithi_mapi_adec_get_default_attrhi_mapi_adec_mode

3 hi_mapi_audio_frame_info

【说明】 定义音频帧信息结构,用于 ADEC 解码输出时携带解码后的 PCM 帧及其索引。

【定义】

typedef struct {
    hi_mapi_audio_frame *frame;
    hi_mapi_audio_frame audio_frame;
    td_u32 index;
} hi_mapi_audio_frame_info;

【成员】

成员名称 描述
frame 指向音频帧的指针。
audio_frame 音频帧数据副本。
index 音频帧索引,释放帧时作为唯一标识使用。

【注意事项】 无

【相关数据类型及接口】 hi_mapi_audio_framehi_mapi_adec_get_framehi_mapi_adec_release_frame

4 hi_mapi_adec_cmd

【说明】 定义 ADEC 扩展命令枚举,用于 hi_mapi_adec_set_param / hi_mapi_adec_get_param 中分派命令。

【定义】

typedef enum {
    HI_MAPI_ADEC_CMD_PAYLOAD_FORMAT_CONFIG = 0,
    HI_MAPI_ADEC_CMD_BUTT
} hi_mapi_adec_cmd;

【成员】

成员名称 描述
HI_MAPI_ADEC_CMD_PAYLOAD_FORMAT_CONFIG 负载格式配置,参数为 hi_mapi_audio_payload_format,仅 OPUS 解码有效。必须在第一次 hi_mapi_adec_send_stream 前设置。
HI_MAPI_ADEC_CMD_BUTT 哨兵值。

【注意事项】 _CONFIG 后缀的命令必须在第一次 hi_mapi_adec_send_stream 之前调用;若送流已开始,调用会返回 HI_MAPI_ADEC_ESTATEERR

【相关数据类型及接口】 hi_mapi_adec_set_paramhi_mapi_adec_get_paramhi_mapi_audio_payload_format公共数据类型)。

5 错误码

模块编号 mod=9,错误码基址 0xA3098000

错误代码 宏定义 描述
0xA3098002 HI_MAPI_ADEC_EINVALIDHDL 通道号无效。
0xA3098003 HI_MAPI_ADEC_EILLPARAM 参数非法。
0xA3098006 HI_MAPI_ADEC_ENULLPTR 空指针。
0xA3098009 HI_MAPI_ADEC_ESTATEERR 操作未授权。
0xA3098010 HI_MAPI_ADEC_ENOTINITED 系统未就绪。