# 音频编创开发概述(C/C++)

从API version 22开始，支持音频编创（OHAudioSuite）功能。音频编创是一款提供专业级音频效果处理的开发接口，旨在帮助开发者高效构建各种音频创作应用。该套件提供高品质、低延迟、智能化的音频处理能力，集成了降噪、均衡器、人声分离等丰富音效功能。开发者可以根据具体的应用场景，轻松地将所需音频功能集成到应用中。

音频编创主要包含引擎、管线和节点，具体介绍如下。

**图1**：音频编创实现原理图

#### 引擎

OHAudioSuite中的引擎是一个统一管理音频管线、控制离线编辑(C/C++)和实时预览(C/C++)的对象，开发者可以根据自身的需求搭建音频处理链。调用方式如上图所示，由应用发起，先调用OHAudioSuite的接口依次创建引擎、管线、节点，再把创建的节点在管线内连接起来，用于传输PCM（Pulse Code Modulation）音频数据，使对应的效果节点实现音效处理能力。当管线停止时，开发者可以有限制地（具体规则请参考管线的使用规则）连接、断开和移除节点，通过调节节点编排实现复杂的音效处理。

引擎最多支持创建10条管线，其中实时预览管线最多创建1条。

#### 节点

#### 节点的介绍

节点是音频渲染的最小单元，根据节点功能提供对应的音效处理能力，节点本身无法单独调用，必须依附管线和引擎才能使用。

OHAudioSuite支持三种节点类型，分别是输入节点、输出节点、效果节点。

| 节点类型 | 说明 |
| --- | --- |
| INPUT_NODE | 输入节点，支持开发者输入各种格式的PCM音频数据。 |
| EFFECT_NODE | 效果节点，添加音频效果，支持单输入单输出和多输入单输出。 |
| OUTPUT_NODE | 输出节点，支持设置输出的PCM音频格式。 |

节点完整类型详见OH\_AudioNode\_Type。

#### 节点的作用

*   输入节点负责处理PCM音频数据输入，从应用侧获取数据。
    
*   输出节点负责处理PCM音频数据输出，开发者可以设置音频数据的输出格式。
    
*   离线编辑(C/C++)场景支持均衡器、音源分离、声场效果、降噪、声音美化、环境效果、混音等音效节点。
    
*   实时预览(C/C++)场景支持均衡器音效节点。
    
*   均衡器、音源分离、声场效果、降噪等音效节点支持对应的音效处理功能和多音频混音操作，最终输出的PCM音频数据支持格式设置（如OH\_Audio\_SampleFormat(位深度)、OH\_Audio\_SampleRate(采样率)和OH\_AudioChannelLayout(声道数)等）。
    

#### 管线

管线是一个统一管理音频节点连接、配置的对象，支持两种工作模式，分别是离线编辑(C/C++)和实时预览(C/C++)。

管线的数据处理采用反向驱动机制。由OH\_AudioSuiteEngine\_RenderFrame()或者OH\_AudioSuiteEngine\_MultiRenderFrame()发起，输出节点逐级向连接的上游节点请求数据，最终由输入节点的OH\_InputNode\_RequestDataCallback()回调函数向开发者请求需要处理的音频数据。

**图2**：管线运行状态图

状态的功能如下表所示。

| 状态名 | 功能 |
| --- | --- |
| stopped | 初始状态，或者工作状态经过OH_AudioSuiteEngine_StopPipeline()命令进入该状态。 切换到stopped状态下，各节点将释放缓存。 |
| running | 工作状态，或者初始状态执行OH_AudioSuiteEngine_StartPipeline()命令进入该状态。 该函数会对管线进行完整性检查，包含是否有有效连接、节点是否连接错误等。 |

#### 管线的作用

*   管线是OHAudioSuite中支持应用渲染PCM音频数据的音效链路。管线支持节点之间的灵活组网，给开发者提供更丰富、更灵活的音频编创体验。
    
*   管线使用的场景如下：
    
    创建一个输入节点、一个效果节点（如均衡器节点EFFECT\_NODE\_TYPE\_EQUALIZER）和一个输出节点，按节点连接顺序（输入节点 -> 效果节点 -> 输出节点）连接组成管线，实现均衡器功能（具体代码用例参考基础离线编辑）。同时，管线也支持多输入场景（具体代码用例参考混音与级联），每条管线输入的PCM数据经过各自的效果节点，在进行混音处理后进行输出。
    

#### 管线的使用规则

管线由节点编排组成，管线创建节点规则如下所示。

*   管线通过OH\_AudioSuiteEngine\_CreateNode接口创建节点时，如果已创建的节点数量超过系统限制后，接口将返回错误码AUDIOSUITE\_ERROR\_CREATED\_EXCEED\_SYSTEM\_LIMITS。
    *   在API version 24之前，输入节点INPUT\_NODE\_TYPE\_DEFAULT的数量不超过5个；在API version 24及以后，输入节点INPUT\_NODE\_TYPE\_DEFAULT的数量不超过15个。
    *   输出节点OUTPUT\_NODE\_TYPE\_DEFAULT的数量不超过1个。
    *   混音节点EFFECT\_NODE\_TYPE\_AUDIO\_MIXER的数量不超过3个。
    *   音源分离节点EFFECT\_MULTII\_OUTPUT\_NODE\_TYPE\_AUDIO\_SEPARATION的数量不超过1个。
    *   在API version 24之前，其余效果类节点的数量每类不超过5个；在API version 24及以后，其余效果类节点的数量每类不超过15个。
*   每条管线至少要有1个输入节点，有且只有1个输出节点。
*   创建节点前需要调用OH\_AudioSuiteEngine\_IsNodeTypeSupported()检查节点类型是否受支持，避免创建节点失败。
*   输入节点和输出节点支持设置节点格式，其余节点不支持设置格式。输入的格式是音频源的音频格式，输出的格式是开发者期望输出的音频格式。

管线中节点的编排规则如下所示。

*   管线中节点连接顺序为：输入节点 -> 效果节点 -> 输出节点。
    
*   音源分离效果节点EFFECT\_MULTII\_OUTPUT\_NODE\_TYPE\_AUDIO\_SEPARATION后面只能连接输出节点，其余效果类节点则没有这个限制。
    
*   混音效果节点EFFECT\_NODE\_TYPE\_AUDIO\_MIXER支持多路输入连接，其余类型节点则不支持。
    
*   节点的连接是单向的，不支持后序节点反向连接到前序节点。输入节点是每条管线的首节点，输出节点是每条管线的尾节点。
    

#### 完整示例代码

*   音频编创示例代码