Android 9.0新增了用于 DynamicsProcessing 的 AudioEffect API,使用此类,我们可以构建基于通道的音频效果,包括各种类型的多个阶段,包括均衡,多频段压缩和限制。频段和活动阶段的数量是可配置的,并且大多数参数可以实时控制,例如增益、启动/释放时间、阈值等。
# 1 基本原理
效果由通道实例化和控制。每个通道具有相同的基本架构,但它们的所有参数都独立于其他通道。
基本通道配置为:
```java
Channel 0 Channel 1 .... Channel N-1
Input Input Input
| | |
+----v----+ +----v----+ +----v----+
|inputGain| |inputGain| |inputGain|
+---------+ +---------+ +---------+
| | |
+-----v-----+ +-----v-----+ +-----v-----+
| PreEQ | | PreEQ | | PreEQ |
+-----------+ +-----------+ +-----------+
| | |
+-----v-----+ +-----v-----+ +-----v-----+
| MBC | | MBC | | MBC |
+-----------+ +-----------+ +-----------+
| | |
+-----v-----+ +-----v-----+ +-----v-----+
| PostEQ | | PostEQ | | PostEQ |
+-----------+ +-----------+ +-----------+
| | |
+-----v-----+ +-----v-----+ +-----v-----+
| Limiter | | Limiter | | Limiter |
+-----------+ +-----------+ +-----------+
| | |
Output Output Output
```
其中,
- inputGain:输入增益因子,以分贝 (dB) 为单位。0 dB 表示电平没有变化。
- PreEQ:多频段均衡器。
- MBC:多频段压缩器 。
- PostEQ:多频段均衡器。
- Limiter:单频段压缩器/限制器,通常用于保护信号免于过载和失真。
## 1.1 均衡器
可以理解为单独控制每个频率的音量,调整各频段信号的增益量,衰减多余频率的同时塑造音色。
详细介绍:[EQ 均衡器介绍](https://blog.csdn.net/hello_1995/article/details/125287877)
## 1.2 压缩器
是用来控制电平的效果器,控制电平的同时会影响音色,不单单是人声,混音当中,所有的元素都可以需要压缩器。
常见参数:
- Thress hoid(阈值):阈值表示声音经过压缩器是,多大的电平才能触发压缩器进行压缩工作,当声音超过你设定的阈值时他开始对音频进行压缩,声音低于阈值压缩器不工作。
- Ratio(压缩比):压缩器表示当声音超过阈值压缩器开始工作时,压缩器会以多大的比例对声音进行压缩。
- Attack(启动时间):表示声音超过阈值后需要多长时间才平稳到达使压缩器压缩到规定的压缩比。
- release(释放时间):表示当压缩器已经开始工作后,当声音电平低于阈值时,压缩器要多长时间平稳的恢复到压缩前的电平(目前电平)。
## 1.3 限制器
用来控制峰值的效果器,限制信号不过载的同时提高响度。
常见参数:
- Thress hold (阈值):限制器工作时的触发值。
- output(输出上限):能被输出的最高电平。
- release(释放时间):指限制器恢复到不限制所需要的时间。
- Dither(抖动):作用是给声音添加一层白底燥。
应用程序创建一个 DynamicsProcessing 对象以在音频框架中实例化和控制此音频效果。如果需要,可以使用 DynamicsProcessor.Config 和 DynamicsProcessor.Config.Builder 来帮助配置多个阶段和每个频段参数。
如果在创建过程中未指定任何配置,则选择默认配置。
下面介绍 DynamicsProcessing 的使用方法。
# 2 初始化
在使用的时候需要先判断 **Build.VERSION.SDK_INT >= 28**。
## 2.1 创建 DynamicsProcessing 对象
要将 DynamicsProcessing 附加到特定的 AudioTrack 或 MediaPlayer,在实例化时指定此 AudioTrack 或 MediaPlayer 的音频会话 ID。
```java
MediaPlayer mediaPlayer = MediaPlayer.create(this, R.raw.test_cbr/*音频路径*/);
int audioSessionId = mediaPlayer.getAudioSessionId();
DynamicsProcessing.Config.Builder builder = new DynamicsProcessing.Config.Builder(
0,//variant
1,//channelCount
true,//preEqInUse
10,//preEqBandCount
true,//mbcInUse
10,//mbcBandCount
true,//postEqInUse
10,//postEqBandCount
true//limiterInUse
);
DynamicsProcessing mDynamicsProcessing = new DynamicsProcessing(0, audioSessionId, builder.build());
mDynamicsProcessing.setEnabled(true);
```
## 2.2 创建 DynamicsProcessing.Eq (均衡器)对象
```java
//创建用于调节的10个频段
private static final int[] bandVal = {31, 62, 125, 250, 500, 1000, 2000, 4000, 8000, 16000};
private static final int maxBandCount = bandVal.length;
DynamicsProcessing.Eq mEq = new DynamicsProcessing.Eq(true, true, maxBandCount);
mEq.setEnabled(true);
for (int i = 0; i < maxBandCount; i++) {
mEq.getBand(i).setCutoffFrequency(bandVal[i]);//设置此频段将处理的最高频率数(以 Hz 为单位)
}
//设置压缩前的均衡器给全频道
mDynamicsProcessing.setPreEqAllChannelsTo(mEq);
//设置压缩前的均衡器给指定频道
//public static final int CHANNEL_1 = 0;
//public static final int CHANNEL_2 = 1;
//mDynamicsProcessing.setPreEqByChannelIndex(CHANNEL_1, mEq);
//设置压缩后的均衡器给全频道
//mDynamicsProcessing.setPostEqAllChannelsTo(mEq);
//设置压缩后的均衡器给指定频道
//public static final int CHANNEL_1 = 0;
//public static final int CHANNEL_2 = 1;
//mDynamicsProcessing.setPostEqByChannelIndex(CHANNEL_1, mEq);
```
## 2.3 创建 DynamicsProcessing.Mbc(多频段压缩器)对象
```java
DynamicsProcessing.Mbc mDynamicsProcessingMbc = new DynamicsProcessing.Mbc(true, true, maxBandCount);
mDynamicsProcessingMbc.setEnabled(true);
for (int i = 0; i < maxBandCount; i++) {
mDynamicsProcessingMbc.getBand(i).setCutoffFrequency(bandVal[i]);//设置此频段将处理的最高频率数(以 Hz 为单位)
}
//设置多频段压缩器给全频道
mDynamicsProcessing.setMbcAllChannelsTo(mDynamicsProcessingMbc);
//设置多频段压缩器给指定频道
//mDynamicsProcessing.getMbcBandByChannelIndex(CHANNEL_1, mDynamicsProcessingMbc);
```
## 2.4 创建 DynamicsProcessing.Limiter(限制器)对象
```java
//Limiter构造参数
private static final boolean LIMITER_DEFAULT_IN_USE = true;//如果将使用 MBC 阶段,则为 true,否则为 false。
private static final boolean LIMITER_DEFAULT_ENABLED = true;//如果启用/禁用 MBC 阶段,则为 true。这可以在效果运行时更改
private static final int LIMITER_DEFAULT_LINK_GROUP = 0;//分配给此限制器的组的索引。只有共享相同 linkGroup 索引的限制器才会一起做出反应。
private static final float LIMITER_DEFAULT_ATTACK_TIME = 1; // 限制器压缩器的启动时间,以毫秒 (ms) 为单位
private static final float LIMITER_DEFAULT_RELEASE_TIME = 60; //限制器压缩器的释放时间,以毫秒 (ms) 为单位
private static final float LIMITER_DEFAULT_RATIO = 10; // 限制器压缩比 (N:1)(输入:输出)
private static final float LIMITER_DEFAULT_THRESHOLD = -2; // 限�
没有合适的资源?快使用搜索试试~ 我知道了~
Android dynamics-processing-sample.zip

共107个文件
xml:58个
webp:10个
bin:9个

需积分: 0 116 浏览量
2022-09-20
11:30:20
上传
评论
收藏 4.86MB ZIP 举报
Android DynamicsProcessing 示例程序。Android 9.0新增了用于 DynamicsProcessing 的 AudioEffect API,使用此类,我们可以构建基于通道的音频效果,包括各种类型的多个阶段,包括均衡,多频段压缩和限制。频段和活动阶段的数量是可配置的,并且大多数参数可以实时控制,例如增益、启动/释放时间、阈值等。
资源详情
资源评论
资源推荐
收起资源包目录





































































































共 107 条
- 1
- 2




















ByteSaid
- 粉丝: 161
- 资源: 8

上传资源 快速赚钱
我的内容管理 收起
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助

会员权益专享
安全验证
文档复制为VIP权益,开通VIP直接复制

评论0